最新版のApache2.4のインストール【CentOS 7】

CentOS7では、yumのデフォルトで2.4がインストールできます。
ただし、デフォルトのパッケージ版だとバージョンが2.4.6と古いので、IUSリポジトリを使用して新しいApache2.4をインストールします。

1. 準備作業

(1) IUSリポジトリのインストール
「IUS」リポジトリをインストールする方法は、yumのリポジトリの追加登録方法 (CentOS 7)を参照して下さい。

(2) /etc/mime.types
「/etc/mime.types」パッケージが必要なのでインストールします。
なお、この「/etc/mime.types」は「mailcap」パッケージに含まれます。
# yum install mailcap

(3) perl
httpd-develをインストールする場合に必要です。
※httpd-develをインストールしない場合には不要です。
# yum install perl
# yum install perl-devel

(4) nghttp2
「libnghttp2」をインストールします。
※依存性関連で「libev」と「libnghttp2」もインストールされます。

# yum --enablerepo=epel install nghttp2
# yum --enablerepo=epel install libev-devel
# yum --enablerepo=epel install libnghttp2-devel

(5) openldap-devel
httpd-develをインストールする場合に必要です。
※httpd-develをインストールしない場合には不要です。
# yum install openldap
# yum install openldap-devel

(6) expat-devel
httpd-develをインストールする場合に必要です。
※httpd-develをインストールしない場合には不要です。
# yum install expat
# yum install expat-devel

(7) system-logos
# yum install system-logos

(8) libdb-devel
httpd-develをインストールする場合に必要です。
※httpd-develをインストールしない場合には不要です。
# yum install libdb
# yum install libdb-devel

(9) brotli

# yum install http://dl.marmotte.net/rpms/redhat/el7/x86_64/brotli-1.0.7-1.el7/brotli-1.0.7-1.el7.x86_64.rpm
# yum install http://dl.marmotte.net/rpms/redhat/el7/x86_64/brotli-1.0.7-1.el7/brotli-devel-1.0.7-1.el7.x86_64.rpm

2. Apache2.4のインストール

# yum --disablerepo=base,extras,updates --enablerepo=ius install httpd
# yum --disablerepo=base,extras,updates --enablerepo=ius install httpd-devel
# yum --disablerepo=base,extras,updates --enablerepo=ius install mod_ssl
※「httpd-devel」のインストールは任意です。

パッケージ名は「httpd24u」となります。
# rpm -qi httpd24u
※「httpd」では表示されませんので、注意して下さい。

3. 各ファイルの設定

ここでは一例を挙げます。サーバの環境や使用目的などによって任意に変更して下さい。
(1) /etc/httpd/conf/httpd.conf
ServerAdmin webmaster@example.jp
ServerName www.example.jp:80
<Directory "/var/www/html">
    Options FollowSymLinks IncludesNOEXEC
    AllowOverride All
    Require all granted
</Directory>
※Optionsの「Indexes」は必ず削除して下さい。

死活監視用ファイル「_health.html」および画像ファイルを記録させない場合に設定。
SetEnvIf Request_URI "_health\.html|\.(gif|jpg|png|ico)$" nolog
CustomLog logs/access_log combined env=!nolog
CGIを使用しない場合はコメントアウト。
<IfModule alias_module>
#    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
#<Directory "/var/www/cgi-bin">
#    AllowOverride None
#    Options None
#    Require all granted
#</Directory>
#AddDefaultCharset UTF-8
AddDefaultCharset Off

■追加設定(「IncludeOptional conf.d/*.conf」の前に追加)
#################################################
########### Additional Options ##################
#################################################
KeepAlive On
KeepAliveTimeout 120
Timeout 120
ServerTokens Prod
ExtendedStatus Off
ServerSignature Off
UseCanonicalName Off
TraceEnable Off
Header always append X-Frame-Options SAMEORIGIN
# XSS対策
Header set X-XSS-Protection "1;mode=block"
Header set X-Content-Type-Options nosniff

■追加設定(VirtualHostで記述)
# vi /etc/httpd/conf.d/_virtualhost.conf
<VirtualHost *:80>
    <IfModule http2_module>
        LogLevel http2:info
        ProtocolsHonorOrder On
        Protocols h2c http/1.1
        H2Direct on
    </IfModule>
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    </IfModule>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>

(2) /etc/httpd/conf.d/autoindex.conf
Index機能は無効にしているので、このファイルをリネームします。
# cd /etc/httpd/conf.d
# mv autoindex.conf autoindex.conf.bak

(3) /etc/httpd/conf.d/ssl.conf
GlobalSign SSLサーバ証明書のインストールを参照して設定して下さい。

なお、1台のサーバに複数の証明書をインストールするSNI(Server Name Indication)を行う場合には、以下のように変更します。
#<VirtualHost _default_:443>
<VirtualHost *:443>

ドキュメントルートおよびホスト名、必要に応じて別名を指定します。
DocumentRoot "/var/www/html"
ServerName www.example.jp:443
ServerAlias example.jp www.example.com

ログは通常のCustomLogを使用。
#ErrorLog logs/ssl_error_log
#TransferLog logs/ssl_access_log
ErrorLog logs/error_log
SetEnvIf Request_URI "_health\.html|\.(gif|jpg|png|ico)$" nolog
CustomLog logs/access_log combined env=!nolog

■その他の設定変更
TLS1.2のみを許可します。
#SSLProtocol all -SSLv3
#SSLProxyProtocol all -SSLv3
SSLProtocol -all +TLSv1.2
SSLProxyProtocol -all +TLSv1.2
#SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4
#SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4
SSLCipherSuite AESGCM:HIGH:!MEDIUM:!LOW:!3DES:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:!DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!AES256-GCM-SHA384:!AES128-GCM-SHA256:!AES256-SHA256:!AES128-SHA256:!AES256-SHA:!AES128-SHA:!DES-CBC3-SHA:!CAMELLIA:!ECDHE-RSA-AES256-SHA384:!ECDHE-RSA-AES256-SHA:!DHE-RSA-AES256-SHA256:!DHE-RSA-AES256-SHA:!ECDHE-RSA-AES128-SHA256:!ECDHE-RSA-AES128-SHA:!DHE-RSA-AES128-SHA256:!DHE-RSA-AES128-SHA
SSLProxyCipherSuite AESGCM:HIGH:!MEDIUM:!LOW:!3DES:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:!DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!AES256-GCM-SHA384:!AES128-GCM-SHA256:!AES256-SHA256:!AES128-SHA256:!AES256-SHA:!AES128-SHA:!DES-CBC3-SHA:!CAMELLIA:!ECDHE-RSA-AES256-SHA384:!ECDHE-RSA-AES256-SHA:!DHE-RSA-AES256-SHA256:!DHE-RSA-AES256-SHA:!ECDHE-RSA-AES128-SHA256:!ECDHE-RSA-AES128-SHA:!DHE-RSA-AES128-SHA256:!DHE-RSA-AES128-SHA
 

※Firefoxで「Server negotiated HTTP/2 with blacklisted suite」のエラーが出るので、「HIGH」より「AESGCM」の優先度を上げます。

※上記設定だと、以下のブラウザで閲覧ができなくなります。
・Safari 6(iOS 6.0.1)
・Safari 7(iOS 7.1)
・Safari 7(OS X 10.9)
・Safari 8(iOS 8.4)
・Safari 8(iOS X 10.10)
もし、上記ブラウザの閲覧が必要な場合は、「!ECDHE-RSA-AES256-SHA384」の「!」を削除して「ECDHE-RSA-AES256-SHA384」として下さい。
ただしこの場合、Qualys SSL LabsのSSL Server Testで「TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384」が「WEAK」という判定がされます。

SSLサーバ証明書ファイルのパス名を指定します。
SSLCertificateFile /etc/httpd/certs/latest/www.example.jp.full_cert.pem
SSLCertificateKeyFile /etc/httpd/certs/latest/www.example.jp.privkey_nopwd.pem
※設定を行うSSLサーバ証明書ファイルおよび秘密鍵ファイルのパス名を指定して下さい。

■設定追加
<Directory "/var/www/html">
    Options FollowSymLinks IncludesNOEXEC
    AllowOverride All
    Require all granted
</Directory>
 
<IfModule http2_module>
    ProtocolsHonorOrder On
    Protocols h2 http/1.1
</IfModule>
 
TraceEnable Off
 
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header edit Set-Cookie "^(?!.*(\s+|;)(?i)SameSite=)(.*)" "$0; SameSite=None; Secure; HttpOnly"

セキュリティ向上のため、DH(Diffie-Hellman)を生成して、設定を行います。(結構時間がかかります。)
# openssl dhparam -out /etc/httpd/certs/dhparams.pem 4096

SSLOpenSSLConfCmd DHParameters /etc/httpd/certs/dhparams.pem

(4) /etc/httpd/conf.d/userdir.conf
ユーザディレクトリ機能は使用しないのでリネームします。
※使用する場合には有効にして下さい。
# cd /etc/httpd/conf.d
# mv userdir.conf userdir.conf.bak

(5) /etc/httpd/conf.modules.d/00-dav.conf
WebDAV機能は使用しないのでリネームします。
※使用する場合には有効にして下さい。
# cd /etc/httpd/conf.modules.d
# mv 00-dav.conf 00-dav.conf.bak

(6) /etc/httpd/conf.modules.d/00-lua.conf
mod_luaは組み込み系スクリプト言語です。この機能も使用しないのでリネームします。
# cd /etc/httpd/conf.modules.d
# mv 00-lua.conf 00-lua.conf.bak

(7) /etc/httpd/conf.modules.d/00-mpm.conf
ApacheのMPMを「event」に変更します。
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule mpm_event_module modules/mod_mpm_event.so

(8) /etc/httpd/conf.modules.d/01-cgi.conf
CGI機能は使用しないのでリネームします。
※使用する場合には有効にして下さい。
# cd /etc/httpd/conf.modules.d
# mv 01-cgi.conf 01-cgi.conf.bak

(9) 設定ファイルのエラーチェック
設定ファイルにエラーがないかどうかチェックします。
# apachectl configtest
※何も表示されなかったら文法的なエラーはありません。

4. サービスの起動

httpdサービスを起動します。
■ サービスの起動
# systemctl start httpd.service
■ サービスの停止
# systemctl stop httpd.service
■ サービスの自動起動
# systemctl enable httpd.service
■ サービスの自動起動解除
# systemctl disable httpd.service
■ サービスが自動起動かどうかチェック
# systemctl is-enabled httpd.service

5. ログの自動整理の解除

(1) logrotateの無効化
logrotateでApacheのログは自動的に整理されますが、自分がスクリプトで管理している場合には、自動的に整理されると不都合を生じますので、この機能を解除します。
※ログローテート機能をそのまま使用する場合は、この項目はスキップして下さい。

「/etc/logrotate.d」というディレクトリの中に「httpd」というファイルがあります。
/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

Apacheのログを週ごとに整理したくない場合には、行頭に#を付けて、コメントアウトします。
※ファイルを削除しても、また作成されるようです。
vi /etc/logrotate.d/httpd

【ファイルの修正】
#/var/log/httpd/*log {
#    missingok
#    notifempty
#    sharedscripts
#    postrotate
#        /sbin/service httpd reload > /dev/null 2>/dev/null || true
#    endscript
#}
 

念のため、パーミッションを000に変更します。
# chmod 000 /etc/logrotate.d/httpd

(2) ログの整理スクリプト(例)
loglotateを無効化した場合は、ログがずっと蓄積されてファイルが肥大化してしまうので、スクリプトを実行して整理します。

【参考例】
「/var/__backup__/apache_log」に年月フォルダを作成して、そこにログファイルを圧縮して保管します。
#!/bin/bash

#----- backup file save base directory -----
BACKUP_BASE_DIR=/var/__backup__/apache_log
LOG_DIR=/var/log
APACHE_LOG_DIR=/var/log/httpd
#-------------------------------------------

#----- backup file save base directory -----
cd $BACKUP_BASE_DIR
 
#----- monthly date directory create -----
MONTH_DATE_VAL="$(date "+%Y%m")"
if [ ! -d $MONTH_DATE_VAL ]; then
    mkdir $MONTH_DATE_VAL
fi
cd $MONTH_DATE_VAL
 
#----- get serial date value -----
TODAY_DATE_VAL="$(date "+%Y%m%d")"
SERIAL_DATE_VAL="$(date "+%s")"
 
#----- apache log moved & http restart -----
mv $APACHE_LOG_DIR/*log .
 
/usr/bin/systemctl restart httpd.service
/usr/bin/sleep 10
 
if [ ! -f $APACHE_LOG_DIR/access_log ]; then
  /usr/bin/systemctl restart httpd.service
  /usr/bin/sleep 10
fi
 
#----- compress log files -----
FILENAME=apache_log_${TODAY_DATE_VAL}.tar.gz
if [ -f $FILENAME ]; then
    TEMP_FILENAME=${FILENAME}.${SERIAL_DATE_VAL}
    mv $FILENAME $TEMP_FILENAME
fi
tar cvfz $FILENAME *_log
rm -f *log
 
/usr/bin/sleep 5
 
cd /var
FILENAME=$BACKUP_BASE_DIR/$MONTH_DATE_VAL/var_log_${TODAY_DATE_VAL}.tar.gz
if [ -f $FILENAME ]; then
    TEMP_FILENAME=${FILENAME}.${SERIAL_DATE_VAL}
    mv $FILENAME $TEMP_FILENAME
fi
tar cvfz $FILENAME log
※上記スクリプトを1週間に1回定期実行します。

6. gzip圧縮の設定

アクセス速度アップのために、通信速度を短縮する「gzip圧縮」を導入します。
「/etc/httpd/conf.d」フォルダに「deflate.conf」というファイルを作成します。
※ファイル名は任意です。
# vi /etc/httpd/conf.d/deflate.conf
以下の内容を記入します。
<IfModule mod_deflate.c>
    DeflateCompressionLevel 1
    <IfModule mod_filter.c>
        FilterDeclare COMPRESS
        FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m#^text/#i"
        FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m#^application/(atom\+xml|javascript|json|rss\+xml|xml|xhtml\+xml)#i"
        FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m#^image/(svg\+xml|vnd\.microsoft\.icon)#i"
        FilterChain COMPRESS
        FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no
        #BrowserMatch ^Mozilla/4 gzip-only-text/html
        #BrowserMatch ^Mozilla/4\.0[678] no-gzip
        #BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
        #Header append Vary Accept-Encoding env=!dont-vary
    </IfModule>
</IfModule>

Apacheを再起動します。
# systemctl restart httpd.service



最終更新:2021年12月03日 08:33