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


※この記事は古いので、 「最新版のApache2.4のインストール【AlmaLinux 8】」 を参照して下さい。


CentOS 8標準のApacheは2.4.37で、現在では最新版より古くなっています。
そこでデフォルトリポジトリのAppStreamではなく、サードパーティーのRaven Extrasを利用して、最新版をインストールします。

1. 準備作業

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

(2) openssl
「openssl」をインストールします。
# dnf install openssl
# dnf install openssl-devel

(3) libev
「epel」リポジトリをインストールする方法は、dnfのリポジトリの追加登録方法【CentOS 8】を参照して下さい。

# dnf --enablerepo=epel install libev
# dnf --enablerepo=epel install libev-devel

(4) nghttp2
「libnghttp2」をインストールします。
※依存性関連で「libnghttp2」もインストールされます。
なお、OKayリポジトリを利用するので、「dnf(yum)のリポジトリの追加登録方法【CentOS 8】」を参照して、先にインストールしておいて下さい。
# dnf --enablerepo=okay install nghttp2
# dnf --enablerepo=okay install libnghttp2-devel

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

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

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

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

(9) sscg
mod_sslをインストールするために「sscg」をインストールします。
# dnf install sscg

2. Apache 2.4のインストール

Raven Extrasリポジトリを利用するので、「dnf(yum)のリポジトリの追加登録方法【CentOS 8】」を参照して、先に「Raven」リポジトリをインストールしておいて下さい。
# dnf --disablerepo=AppStream --enablerepo=raven-extras install httpd
# dnf --disablerepo=AppStream --enablerepo=raven-extras install httpd-devel
# dnf --disablerepo=AppStream --enablerepo=raven-extras install mod_ssl
# dnf --disablerepo=AppStream --enablerepo=raven-extras install mod_http2
※デフォルトの「AppStream」を無効化します。
  「CentOS Stream」の場合は、「--disablerepo=appstream」となります。


3. 各ファイルの設定

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

画像ファイルを記録させない場合に設定。
SetEnvIf Request_URI "\.(gif|jpg|png|ico)$" image-object
CustomLog logs/access_log combined env=!image-object
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>
</VirtualHost>
※常時SSLを行わない場合は、<IfModule mod_rewrite.c>~</IfModule>のセクションを削除して下さい。

(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

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


■その他の設定変更
TLSv1.2、TLSv1.3のみ許可します。
#SSLProtocol all -SSLv3
#SSLProxyProtocol all -SSLv3
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLProxyProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuiteは変更しないで、このまま使用します。
SSLCipherSuite PROFILE=SYSTEM
SSLProxyCipherSuite PROFILE=SYSTEM

SSLCipherSuiteはCentOS 8では、上記のようになっています。
これは暗号化スイートの設定作業を簡単にするため「crypto-policies」という仕組みが導入されたことによるもので、以下のライブラリをサポートしています。
  • GnuTLS library
  • OpenSSL library
  • NSS library
  • OpenJDK
  • Libkrb5
  • BIND
  • OpenSSH
  • Libreswan
ちなみにOpenSSLのデフォルト設定は「/etc/crypto-policies/back-ends/openssl.config」に記述されています。
@SECLEVEL=2:kEECDH:kRSA:kEDH:kPSK:kDHEPSK:kECDHEPSK:-aDSS:-3DES:!DES:!RC4:!RC2:!IDEA:-SEED:!eNULL:!aNULL:!MD5:-SHA384:-CAMELLIA:-ARIA:-AESCCM8
実際にどのようなCipher Suiteが使われるかは、以下のコマンドで確認します。
# openssl ciphers -v 'PROFILE=SYSTEM'
なお、「crypto-policies」は、「LEGACY」、「DEFAULT」、「FUTURE」、「FIPS」の中から選択できます。
現在のモードは、以下のコマンドで確認するか、/etc/crypto-policies/state/current」に記載されています。
# update-crypto-policies --show
DEFAULT
この設定を変更するには「/etc/crypto-policies/config」を編集後、「update-crypto-policies」を実行します。
# vi /etc/crypto-policies/config
# update-crypto-policies
Setting system policy to FUTURE
※不用意にこの設定を変更するとSSHのログインができなくなる場合がありますので、注意して下さい。

SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
※設定を行うSSLサーバ証明書ファイルおよび秘密鍵ファイルのパス名を指定して下さい。

■証明書ファイルの指定
SSLサーバ証明書+中間CA証明書を合わせたファイル名を指定します。※実際のファイル名を指定して下さい。
SSLCertificateFile /etc/httpd/certs/latest/www.example.jp.full_cert.pem
パスフレーズを削除したサービス起動用の秘密鍵ファイル名を指定します。※実際のファイル名を指定して下さい。
SSLCertificateKeyFile /etc/httpd/certs/latest/www.example.jp.privkey_nopwd.pem

■設定追加
<Directory "/var/www/html">
    Options FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>
 
<IfModule http2_module>
    ProtocolsHonorOrder On
    Protocols h2 http/1.1
</IfModule>
 
TraceEnable Off

(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
CentOS 8ではデフォルトで「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/00-optional.conf
初期値ではすべて無効化されています。
必要なモジュールがありましたら、有効化して下さい。
#
# This file lists modules included with the Apache HTTP Server
# which are not enabled by default.
#

#LoadModule asis_module modules/mod_asis.so
#LoadModule buffer_module modules/mod_buffer.so
#LoadModule heartbeat_module modules/mod_heartbeat.so
#LoadModule heartmonitor_module modules/mod_heartmonitor.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule dialup_module modules/mod_dialup.so
#LoadModule charset_lite_module modules/mod_charset_lite.so
#LoadModule log_debug_module modules/mod_log_debug.so
#LoadModule log_forensic_module modules/mod_log_forensic.so
#LoadModule ratelimit_module modules/mod_ratelimit.so
#LoadModule reflector_module modules/mod_reflector.so
#LoadModule sed_module modules/mod_sed.so
#LoadModule speling_module modules/mod_speling.so

(9) /etc/httpd/conf.modules.d/00-proxy.conf
このままでOKです。

(10) /etc/httpd/conf.modules.d/00-ssl.conf
このままでOKです。
LoadModule ssl_module modules/mod_ssl.so

(11) /etc/httpd/conf.modules.d/00-sytemd.conf
このままでOKです。
# This file configures systemd module:
LoadModule systemd_module modules/mod_systemd.so

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

(13) /etc/httpd/conf.modules.d/10-h2.conf
HTTP/2対応とするので必須です。既に有効化されていますので、このままでOKです。
LoadModule http2_module modules/mod_http2.so

(14) /etc/httpd/conf.modules.d/10-proxy_h2.conf
このままでOKです。
LoadModule proxy_http2_module modules/mod_proxy_http2.so

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

4. サービスの起動

httpdサービスの起動と自動起動設定を行います。
■ サービスの起動
# systemctl start httpd.service
■ サービスの自動起動
# systemctl enable httpd.service
その他のコマンド。
■ サービスの停止
# systemctl stop httpd.service
■ サービスの自動起動解除
# systemctl disable httpd.service
■ サービスが自動起動かどうかチェック
# systemctl is-enabled httpd.service

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

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

「/etc/logrotate.d」というディレクトリの中に「httpd」というファイルがあります。
# cd /etc/logrotate.d
# vi 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
 
FILENAME=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 /var/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年05月28日 10:16