アットウィキロゴ

[AWS]最新版のApache2.4のインストール【AlmaLinux 9】

標準のApacheは2.4.53で、現在では最新版より古くなっています。
そこでデフォルトリポジトリのappstreamではなく、サードパーティーのRaven Modular(el9)を利用して、最新版をインストールします。
※現行の最新バージョン:2.4.66

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のリポジトリの追加登録方法【AlmaLinux 9】を参照して下さい。

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

(4) libnghttp2
AlmaLinux8までは「powertools」リポジトリにありましたが、AlmaLinux9からは「crb」という名前に変更されています。
※ELBを使用する場合にはインストールしないので、この項目をスキップして下さい。
# dnf --enablerepo=crb install nghttp2
# dnf --enablerepo=crb install libnghttp2
# dnf --enablerepo=crb install libnghttp2-devel

(5) openldap-devel
# dnf install openldap-devel

(6) expat-devel
# dnf install expat-devel

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

(8) libdb-devel
# dnf install libdb-devel

(9) sscg
mod_sslをインストールするために「sscg」をインストールします。
※ELBを使用する場合にはインストールしないので、この項目をスキップして下さい。
# dnf install sscg

(10) perl
# dnf install perl

2. Apache 2.4のインストール

Raven Modularリポジトリを利用するので、「dnfのリポジトリの追加登録方法【AlmaLinux 9】」を参照して、先に「Raven」リポジトリをインストールしておいて下さい。
※モジュールは必要に応じて選択してインストールして下さい。
# dnf install apr
# dnf install apr-devel
# dnf install apr-util
# dnf install apr-util-devel
# dnf install apr-util-ldap
# dnf install almalinux-logos-httpd

# dnf --disablerepo=appstream --enablerepo=raven-modular install httpd*
# dnf --disablerepo=appstream --enablerepo=raven-modular install mod_ldap*
# dnf --disablerepo=appstream --enablerepo=raven-modular install mod_session*
※デフォルトの「appstream」を無効化します。
※「raven-modular」の場合最後に*(アスタリスク)を付けないと、「すべての検出結果は引数のモジュラーフィルタリングに一致しません(filter out)」というエラーが出ます。

※ELBを使用する場合にはインストールしないので、この項目をスキップして下さい。
# dnf --disablerepo=appstream --enablerepo=raven-modular install mod_ssl*
# dnf --disablerepo=appstream --enablerepo=raven-modular install mod_md*
# dnf install mod_http2

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」は必ず削除して下さい。

※ELB経由の場合にはELBのIPアドレスが記録されてしまうので、「X-Forwarded-For」ヘッダを追記します。
これによりきちんとアクセス元のIPアドレスが記録されます。
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

ELBを使用している場合には、ELB-HealthCheckerのログが大量に書き込まれるので、これを抑止します。
また、1日ごとにログを分ける場合には以下のように書きます。
ErrorLog "|/usr/sbin/rotatelogs logs/www.example.jp-error_log-%Y%m%d.log 86400 540"
 
SetEnvIf User-Agent "ELB-HealthChecker.*" nolog
SetEnvIf Request_URI "_health\.html|health\.html|\.(gif|jpg|png|ico)$" nolog
CustomLog "|/usr/sbin/rotatelogs logs/www.example.jp-access_log-%Y%m%d.log 86400 540" combined env=!nolog
デフォルト設定の場合
ErrorLog logs/error_log
 
SetEnvIf User-Agent "ELB-HealthChecker.*" nolog
SetEnvIf Request_URI "_health\.html|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>
SSIを使用する場合に、その拡張子を指定します。
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

#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
 
<IfModule mod_headers.c>
    Header set X-XSS-Protection "1;mode=block"
    Header set X-Content-Type-Options nosniff
    Header always unset X-Powered-By
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    Header always set Content-Security-Policy "default-src 'self'; img-src 'self' data: https:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https:; style-src 'self' 'unsafe-inline' https:; frame-ancestors 'self'; object-src 'none'; base-uri 'self'; form-action 'self'"
</IfModule> 

■追加設定(VirtualHostで記述)
# vi /etc/httpd/conf.d/_01-www.example.jp.conf
※ELBを使用する場合
<VirtualHost *:80>
  RemoteIPHeader X-Forwarded-For
 
  ServerName www.example.jp
  ServerAlias ec2-www.example.jp
 
  DocumentRoot "/var/www/html"
  <Directory "/var/www/html">
    Options FollowSymLinks IncludesNOEXEC
    AllowOverride All
    Require all granted
  </Directory>
 
  TraceEnable Off
  ProxyErrorOverride on
 
  <Location "/">
    <LimitExcept GET POST HEAD>
        Require all denied
    </LimitExcept>
  </Location>
 
  ErrorLog "|/usr/sbin/rotatelogs logs/www.example.jp-error_log-%Y%m%d.log 86400 540"
 
  SetEnvIf User-Agent "ELB-HealthChecker.*" nolog
  SetEnvIf Request_URI "_health\.html|health\.html|\.(gif|jpg|png|ico)$" nolog
  CustomLog "|/usr/sbin/rotatelogs logs/www.example.jp-access_log-%Y%m%d.log 86400 540" combined env=!nolog
 
  Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>

※ELBを使用しない場合
<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>
  RemoteIPHeader X-Forwarded-For
 
  ServerName www.example.jp
  ServerAlias ec2-www.example.jp
 
  DocumentRoot "/var/www/html"
  <Directory "/var/www/html">
    Options FollowSymLinks IncludesNOEXEC
    AllowOverride All
    Require all granted
  </Directory>
 
  TraceEnable Off
  ProxyErrorOverride on
 
  ErrorLog "|/usr/sbin/rotatelogs logs/www.example.jp-error_log-%Y%m%d.log 86400 540"
 
  SetEnvIf User-Agent "ELB-HealthChecker.*" nolog
  SetEnvIf Request_URI "_health\.html|health\.html|\.(gif|jpg|png|ico)$" nolog
  CustomLog "|/usr/sbin/rotatelogs logs/www.example.jp-access_log-%Y%m%d.log 86400 540" combined env=!nolog
 
  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サーバ証明書のインストールを参照して設定して下さい。
※ELBを使用する場合にはインストールしないので、この項目をスキップして下さい。

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

DocumentRoot "/var/www/html"
ServerName www.example.jp:443

ログは通常のCustomLogを使用。
1日ごとにログを分ける場合には以下のように書きます。
#ErrorLog logs/ssl_error_log
#TransferLog logs/ssl_access_log
ErrorLog "|/usr/sbin/rotatelogs logs/www-example.jp-error_log-%Y%m%d.log 86400 540"
 
SetEnvIf User-Agent "ELB-HealthChecker.*" nolog
SetEnvIf Request_URI "_health\.html|health\.html|\.(gif|jpg|png|ico)$" nolog
CustomLog "|/usr/sbin/rotatelogs logs/www-example.jp-access_log-%Y%m%d.log 86400 540" combined env=!nolog
※デフォルトの場合
ErrorLog logs/error_log
SetEnvIf User-Agent "ELB-HealthChecker.*" nolog
SetEnvIf Request_URI "_health\.html|health\.html|\.(gif|jpg|png|ico)$" nolog
CustomLog logs/access_log combined env=!nolog

■その他の設定変更
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は、上記のようになっています。
これは暗号化スイートの設定作業を簡単にするため「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サーバ証明書+中間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 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
デフォルトの「event」のままでOKです。
#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-systemd.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
※ELBを使用する場合には不要なので、必ず無効にしておきます。このファイルが存在しない場合は無視して下さい。
HTTP/2対応とするので必須です。既に有効化されていますので、このままでOKです。
LoadModule http2_module modules/mod_http2.so

(14) /etc/httpd/conf.modules.d/10-proxy_h2.conf
※ELBを使用する場合には不要なので、必ず無効にしておきます。このファイルが存在しない場合は無視して下さい。
このままでOKです。
LoadModule proxy_http2_module modules/mod_proxy_http2.so

(15) /etc/httpd/conf.d/manual.conf
脆弱性として指摘される場合もあるので、これは無効にしておきます。
# cd /etc/httpd/conf.d
# mv /etc/httpd/conf.d/manual.conf{,.bak} 

(16) 設定ファイルのエラーチェック
設定ファイルにエラーがないかどうかチェックします。
# apachectl configtest
※「Syntax OK」と表示されたらOKです。

4. サービスの起動

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


5. 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



最終更新:2026年05月20日 10:31