実践Linux
CentOS8        CentOS8 目次へ  TOP(HOME)へ


Webサーバー         2020年7月



Webサーバー(httpd 2.4.37-16)

メインのmy-dom.xxxドメインのホームページは/var/www/htmlに設置。http://www.my-dom.xxxでアクセス。
さらに新しい別のドメインnew-dom.xxxを取得したとする(CentOS7/ドメインの追加参照)。http://www.new-dom.xxxでアクセスする。
new-domユーザーを作成しておく。(グループapache、/sbin/nologin、ホーム作成。)
Web公開する /home/new-dom はアクセス権を755にしておく。

設定ファイル /etc/httpd/conf/httpd.conf

ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost

#ServerName www.example.com:80
 ← 元(コメントアウトされている)
ServerName www.my-dom.xxx:80
 ← サーバー名を指定

<Directory />
  AllowOverride none
 ← オーバーライド無効(アクセス制御ファイル.htacssessを無視する)
  Require all denied
</Directory>

DocumentRoot "/var/www/html"

<Directory "/var/www">
  AllowOverride None
  Require all granted
</Directory>

<Directory "/var/www/html">
  #Options Indexes FollowSymLinks
 ← 元をコメントアウトする
  Options FollowSymLinks
 ← Indexesを削除してファイルの一覧表示を防ぐ。FollowSymLinksはシンボリックリンクを辿ることを許可する。
  #Options Includes ExecCGI FollowSymLinks
 ← さらにSSI、CGIを許可する場合
  AllowOverride None
  #AllowOverride All
 ← .htaccessを許可する場合
  Require all granted
</Directory>

<IfModule dir_module>
  DirectoryIndex index.html
 ← URLの最後が「/」でアクセスされた時の優先表示ファイル名
</IfModule>
            (複数ある場合は、左から優先され表示される)

<Files ".ht*">
 ← .htaccess、.htpasswd、htdigest等
  Require all denied
</Files>

ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  LogFormat "%h %l %u %t \"%r\" %>s %b" common
  <IfModule logio_module>
    #LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
 ← 元をコメントアウトする
    LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
  ← 長すぎるURI(414エラー)はログに記録しない
  </IfModule>
#CustomLog "logs/access_log" common
 ← 元
#CustomLog "logs/access_log" combined
 ← 元をコメントアウトする
以下は追加
  SetEnvIf Request_URI "default\.ida" no_log
 ← wormからのアクセスをログに記録しない
  SetEnvIf Request_URI "cmd\.exe" no_log
 ← 〃
  SetEnvIf Request_URI "root\.exe" no_log
 ← 〃
  SetEnvIf Request_URI "Admin\.dll" no_log
 ← 〃
  SetEnvIf Request_URI "NULL\.IDA" no_log
 ← 〃
  SetEnvIf Remote_Addr 192.168.1 no_log
 ← 内部からのアクセスをログに記録しない
  SetEnvIf Remote_Addr 127.0.0.1 no_log
 ← 自ホストからのアクセスをログに記録しない
  CustomLog logs/access_log combined env=!no_log
 ← 上記以外のアクセスをログに記録する
  #CustomLog "logs/access_log" common
 ← 元
  #CustomLog "logs/access_log" combined
 ← 元をコメントアウトする
</IfModule>

<IfModule alias_module>
  ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>

<Directory "/var/www/cgi-bin">
  AllowOverride None
  Options None
  Require all granted
</Directory>

<IfModule mime_module>
 ← ファイルのタイプを決める
  TypesConfig /etc/mime.types
   #AddType application/x-gzip .tgz
  #AddEncoding x-compress .Z
  #AddEncoding x-gzip .gz .tgz
  AddType application/x-compress .Z
  AddType application/x-gzip .gz .tgz
  #AddHandler cgi-script .cgi
  #AddHandler cgi-script .cgi .pl
 ← cgiの拡張子を有効化、CGIスクリプトに.plを追加する場合
  #AddHandler type-map var
  AddType text/html .shtml
  AddOutputFilter INCLUDES .shtml
</IfModule>

#AddDefaultCharset UTF-8
 ← 元をコメントアウトする
AddDefaultCharset Off
 ← 文字化け対応

<IfModule mime_magic_module>
  MIMEMagicFile conf/magic
</IfModule>

#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html

#EnableMMAP off
EnableSendfile on

IncludeOptional conf.d/*.conf

/etc/httpd/conf/httpd.confに追記

バーチャルホストnew-dom.xxxを設定 。

###############################追加########################################
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(xbm)|(js)|(css)$" nolog

<VirtualHost 333.333.333.210>
  my-dom.xxxのWeb設定。http://www.my-dom.xxxでアクセス。
  ServerAdmin root@localhost
  DocumentRoot /var/www/html
  ServerName www.my-dom.xxx
  ErrorLog logs/www_error_log
  CustomLog logs/www_access_log combined env=!nolog
</VirtualHost>

<VirtualHost 333.333.333.210>
  新しいドメインnew-dom.xxxの設定。http://www.new-dom.xxxでアクセス。
ScriptAlias /cgi-bin/ /home/new-dom/cgi-bin/
ServerAdmin root@localhost
DocumentRoot /home/new-dom/public_html
ServerName new-dom.xxx
ServerAlias www.new-dom.xxx
  「ServerName www.new-dom.xxx」だけだと、http://new-dom.xxxでアクセスしたとき、/var/www/htmlが開いてしまう。
  このようにServerNameとServerAliasを設定しておく。

ErrorLog logs/new-dom_error_log
CustomLog logs/new-dom_access_log combined env=!nolog
</VirtualHost>


説明
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(xbm)|(js)|(css)$" nolog
  アクセスログをとりたくない対象ファイルを環境変数「nolog」に設定。
CustomLog logs/www_access_log combined env=!nolog
  combinedは書き出すログの書式。デフォルトでcombined、commonなど4種類用意されている。
  env=!nologは、環境変数「nolog」に設定されたものはログをとらない。


/etc/httpd/conf.d/userdir.confの編集(必要に応じて=サブドメイン用)
<IfModule mod_userdir.c>
  UserDir disabled
  #UserDir public_html
 ← http://servername/~userのリクエストで開く実際のディレクトリを指定
</IfModule>



firewalldの設定
 trustedゾーンに対しては、必要ない。
 externalゾーンの設定
 # irewall-cmd --get-services  定義されているサービス一覧
 # firewall-cmd --list-service --zone=external
 # firewall-cmd --add-service=http --zone=external
 # firewall-cmd --add-service=http --zone=external --permanent
 # firewall-cmd --add-service=https --zone=external
 # firewall-cmd --add-service=https --zone=external --permanent

httpdサービスを起動
 # systemctl --type=service list-unit-files  インストールされたサービス一覧
 # systemctl --type=service list-units | grep httpd  実行中のサービスにhttpdがあるか
 # systemctl start httpd
 # systemctl enable httpd

ユーザーの作成
 ftpアクセス用のユーザーnew-domを作成しておく。
 グループはapache、ログインシャエルは/sbin/nologin等。
 /home/new-dom以下の所有をこのユーザー、グループapacheに変えておく。
 # chown -R new-dom:apache /home/new-dom

SElinux
 いまのところ、なにもしなくても大丈夫なようだ。



php関係の設定
(Apache+phpでMariaDB(MySQL)データベースにアクセスできるようにする)
インストール状況の確認
# dnf list installed | grep php
インストール(php 7.2.11-2)
# dnf list | grep php
# dnf install -y php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-mysqlnd php-json

httpdの再起動が必要。

/etc/httpd/conf.d/php.conf
<Files ".user.ini">
Require all denied
</Files>

AddType text/html .php
    httpd.confのAddType text/html .shtml等と同じ
DirectoryIndex index.php
   httpd.confのDirectoryIndex index.htmlに追加

<IfModule !mod_php5.c>
  <IfModule !mod_php7.c>
    # Enable http authorization headers
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

    <FilesMatch \.(php|phar|html)$>
        SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>
  </IfModule>
</IfModule>

<IfModule mod_php7.c>
  <FilesMatch \.(php|phar)$>
    SetHandler application/x-httpd-php
  </FilesMatch>

  #<FilesMatch \.phps$>
    # SetHandler application/x-httpd-php-source
  #</FilesMatch>

  php_value session.save_handler "files"
  php_value session.save_path "/var/lib/php/session"
  php_value soap.wsdl_cache_dir "/var/lib/php/wsdlcache"
  #php_value opcache.file_cache "/var/lib/php/opcache"
</IfModule>


言語は、UTF-8で統一しておく。(mariaDBもUTF-8で設定。)
エディタにUTF-8とUTF-8Nの保存形式がある場合は、UTF-8Nを選ぶ。
<head>
<meta http-equiv="Content-Language" content="ja">
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>テストphp</title>
</head>

文字化け対策
CentOS6.5では必要なかったが、CentOS7では、これをやっておかないと日本語を含むクエリ等がうまく動作しなかった。これは、/etc/php.iniのmbstring関係をいろいろ編集してもダメだった。
データーベースへのコネクションを確立した後、次のように1行追加。
$con = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。");
mysql_set_charset('utf8');  ←これを追加。

重要 CentOS8での大きな変更点(この設定をしっかりやっておかないと、ひどい表示になる)
RHEL8/CentOS8では[mod_php]は Deprecated となり、デフォルトでPHP-FPM(FPM:FastCGI Process Manager)が呼び出されるようになっている。[/usr/lib/systemd/system/httpd.service.d/php-fpm.conf]の設定ファイルによって、[httpd]の起動と連動して[php-fpm]サービスも起動される。

これまでのphpプログラムを埋め込んだhtmlファイルの表示がくずれたり、あるいはinclude文が全く無視される問題が発生した(いずれもCentOS7では大丈夫だったのだが)。どうやらこの原因が上の状況によるみたいだ。
.htmlファイルを.phpにすると一応解決するが、今度は文字化けがひどい。
https://teratail.com/questions/235760をみると、
CentOS7の時はPHPはモジュール版、CenmtOS8はFastCGI版だということです。実際、systemctl stop php-fpmすると、PHPは動かなくなります。
@/etc/php-fpm.d/www.conf
 ;security.limit_extensions = .php .php3 .php4 .php5 .php7  387行
 この行のコメントを外し、.htmlを加える。
 security.limit_extensions = .php .php3 .php4 .php5 .php7 .html
A/etc/httpd/conf.d/php.confの27行に
  <FilesMatch \.(php|phar)$>
    SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
  </FilesMatch>
 があり、ここで処理をfpmに引き渡しているようです。
 そこで、ここでもhtmlを加えて、
 <FilesMatch \.(php|phar|html)$>とする。
 httpdとphp-fpmの再起動。(php-fpmはすでに自動起動になっているので、どちらも再起動。)
 # systemctl restart httpd
 # systemctl restart php-fpm

 httpd.confのAddType application/x-httpd-php .php .html等は必要なくなった。
 やはりモジュール版ではなくfpm版PHPは根本的にいろいろ変わったということか。
 しかし、文字化けは直らない。

B/etc/php.iniの691行
 default_charset = "UTF-8"
 これを「default_charset = ""」と空にする。
 httpdとphp-fpmの再起動。これで文字化けも解決する。


認証設定
/var/www/html/my-pageに認証を設定する例
認証ファイル設置場所を/var/www/conf/とする。このディレクトリを作っておく(rootで作成してもOK)。

ユーザーIDとパスワードの設定
@Basic認証(従来のもの。暗号化されないがどのブラウザでもOK。)
 パスワードファイルは/var/www/conf/に.htpasswd名(隠しファイル)で作成するものとする。
 # htpasswd -c /var/www/conf/.htpasswd ユーザID
 二人目からは、
 # htpasswd /var/www/conf/.htpasswd ユーザID  (-cはいらない。-cをつけるとデータは初期化されてしまう。)
 ユーザの削除は、
 # htpasswd -D /var/www/conf/.htpasswd ユーザID   またはファイルを直接編集して削除。

ADigest認証(暗号化して流されより安全。ただし一部ブラウザでは対応していないものがある。)
 パスワードファイルは/var/www/conf/に.htdigest名(隠しファイル)で作成するものとする。
 # htdigest -c /var/www/conf/.htdigest "Digest" ユーザID   "Digest"はrealm名(下のhttpd.confと同じものを指定)
 二人目からは、
 # htdigest /var/www/conf/.htdigest "Digest" ユーザID  (-cはいらない。)

/etc/httpd/conf/httpd.confを編集
<Directory /var/www/html/my-page>
  #Digest認証の場合
  AuthType Digest
  AuthName "Digest"
   realmの設定(適当に)
  AuthUserFile /var/www/conf/.htdigest

  #Basic認証の場合
  #AuthType Basic
  #AuthName "Restricted Pages"
   認証時のウィンドに表示される名称(適当に)
  #AuthUserFile /var/www/conf/.htpasswd

  require valid-user
   登録ユーザすべてに許可
  #require user earth moon
   earthとmoonに許可
</Directory>




TOP(HOME)へ

目 次
HOME
 全体のシステム構成&目次

CentOS7-8の新機能(systemdとfirewalld)

CentOS8
CentOS8のインストール〜ネットワークの設定ほか
ダイレクトルールを使ったfirewallの強化
DNS(BIND)サーバー
DHCPサーバー
FTPサーバー
FTPS(FTP over SSL/TLS)
Webサーバー
  アクセス解析ツールAwstats
Mail(Dovecot&Postfix)サーバー
MariaDB(MySQL)サーバー
SSHサーバー
Sambaサーバー
openVPNサーバー

CentOS7
CentOS7のインストール〜ネットワークの設定ほか
CentOS7の新機能(systemdとfirewalld)
ダイレクトルールを使ったfirewallの強化
DNS(BIND)サーバー
Webサーバー
  Webでファイルの受け渡し
  アクセス解析ツールAwstats
  Wordpressでブログ構築
  EC-CUBEショッピングサイト構築
FTPサーバー
FTPS(FTP over SSL/TLS)
Mail(Dovecot&Postfix)サーバー
Sambaサーバー
MariaDB(MySQL)サーバー
DHCPサーバー
SSHサーバー
VNCサーバー
ストリーミングサーバーRed5
ドメインの追加
PHP7.1をインストール

CentOS5〜6

SELinux

Cプログラミング


●その他
クラウド Amazon EC2
Raspberry Piで遊ぶ
印刷機関連開発 刷版絵柄面積率測定
数独をExcelで解く


●趣味の世界
相対性理論
量子力学
群論
熱力学・統計力学
解析力学
物理でつかう数学
超弦理論(ノート作成中)