概要
Apache2は、世界で最も広く使用されているWebサーバソフトウェアである。
Dockerコンテナとして実行することで、開発環境や本番環境で簡単にWebサーバを構築できる。
静的ファイルの配信、PHPなどの動的コンテンツの処理、リバースプロキシ等の様々な用途に使用される。
Apache2コンテナの主な機能を以下に示す。
- HTTPサーバ機能
- デフォルト : 80番ポート
- HTTPSサーバ機能
- デフォルト : 443番ポート
- 静的ファイルの配信
- モジュールによる機能拡張
- .htaccessによるディレクトリ単位の設定
Containerfile
Containerfileを作成する。
FROM httpd:2.4
COPY ./public-html/ /usr/local/apache2/htdocs/
EXPOSE 80 443
CMD ["httpd-foreground"]
コンテナイメージをビルドする。
podman build -t apache2:custom -f Containerfile .
ビルドしたイメージからコンテナを実行する。
podman run -d \ --name apache2 \ -p 0.0.0.0:8080:80 \ -v ./public-html:/usr/local/apache2/htdocs/ \ apache2:custom
Compose
Composeファイルを作成する。
version: '3'
services:
apache2:
image: httpd:2.4
container_name: apache2
ports:
- "0.0.0.0:8080:80" # HTTP用(すべてのIPでリッスン)
- "0.0.0.0:8443:443" # HTTPS用(すべてのIPでリッスン)
volumes:
- ./public-html:/usr/local/apache2/htdocs/
- ./apache-conf:/usr/local/apache2/conf/
restart: unless-stopped
volumes:
apache-data:
Composeファイルを実行して、コンテナを作成および実行する。
podman-compose up -d # または podman-compose -f <Composeファイル名> up -d
アクセス方法
コンテナが起動したら、以下のURLでアクセスできる。
- HTTP
- HTTPS
デフォルトページの確認
コンテナを起動後、Webブラウザでアクセスすると It works! というメッセージが表示される。
カスタムHTMLの配置
ホスト側のディレクトリ (例: ./public-html) にHTMLファイルを配置することにより、独自のコンテンツを表示できる。
mkdir -p public-html
echo "
Hello from Apache2 Container
" > public-html/index.html
設定ファイルのカスタマイズ
Apache2の設定ファイルをカスタマイズする場合は、httpd.confをホスト側に配置する。
設定ファイルのコピー
実行中のコンテナから設定ファイルをコピーする。
podman cp apache2:/usr/local/apache2/conf/httpd.conf ./apache-conf/httpd.conf
設定の反映
設定ファイルを編集後、コンテナを再起動する。
podman restart apache2
または、設定の構文チェックを行う。
podman exec apache2 apachectl configtest
仮想ホストの設定
複数のサイトを1つのApache2コンテナで運用する場合、仮想ホストを設定する。
仮想ホスト設定ファイルの作成
ホスト側に仮想ホスト用の設定ファイルを作成する。
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /usr/local/apache2/htdocs/example.com
<Directory /usr/local/apache2/htdocs/example.com>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog /usr/local/apache2/logs/example.com-error.log
CustomLog /usr/local/apache2/logs/example.com-access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName test.local
DocumentRoot /usr/local/apache2/htdocs/test.local
<Directory /usr/local/apache2/htdocs/test.local>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog /usr/local/apache2/logs/test.local-error.log
CustomLog /usr/local/apache2/logs/test.local-access.log combined
</VirtualHost>
Composeファイルでの設定例
仮想ホストを使用する場合のCompose設定を以下に示す。
version: '3'
services:
apache2:
image: httpd:2.4
container_name: apache2
ports:
- "0.0.0.0:8080:80"
volumes:
- ./sites/example.com:/usr/local/apache2/htdocs/example.com
- ./sites/test.local:/usr/local/apache2/htdocs/test.local
- ./vhosts.conf:/usr/local/apache2/conf/extra/httpd-vhosts.conf
- ./httpd.conf:/usr/local/apache2/conf/httpd.conf
- apache-logs:/usr/local/apache2/logs/
restart: unless-stopped
volumes:
apache-logs:
SSL / TLS設定
HTTPS通信を有効化するための設定を行う。
SSL証明書の準備
自己署名証明書を作成する例を以下に示す。
mkdir -p ./ssl openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout ./ssl/server.key \ -out ./ssl/server.crt \ -subj "/C=JP/ST=Tokyo/L=Tokyo/O=MyCompany/CN=localhost"
SSL設定ファイルの作成
HTTPS用の仮想ホスト設定を作成する。
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Listen 443
<VirtualHost *:443>
ServerName localhost
DocumentRoot /usr/local/apache2/htdocs
SSLEngine on
SSLCertificateFile /usr/local/apache2/conf/ssl/server.crt
SSLCertificateKeyFile /usr/local/apache2/conf/ssl/server.key
<Directory /usr/local/apache2/htdocs>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog /usr/local/apache2/logs/ssl-error.log
CustomLog /usr/local/apache2/logs/ssl-access.log combined
</VirtualHost>
SSL有効化のCompose設定
version: '3'
services:
apache2:
image: httpd:2.4
container_name: apache2
ports:
- "0.0.0.0:8080:80"
- "0.0.0.0:8443:443"
volumes:
- ./public-html:/usr/local/apache2/htdocs/
- ./ssl:/usr/local/apache2/conf/ssl/
- ./httpd.conf:/usr/local/apache2/conf/httpd.conf
- ./ssl-vhost.conf:/usr/local/apache2/conf/extra/httpd-ssl.conf
restart: unless-stopped
PHP-FPMとの連携
Apache2コンテナでPHPアプリケーションを動作させる場合、PHP-FPMと連携する設定例を示す。
Composeファイルでの連携設定
version: '3'
services:
apache2:
image: httpd:2.4
container_name: apache2
ports:
- "0.0.0.0:8080:80"
volumes:
- ./public-html:/usr/local/apache2/htdocs/
- ./httpd.conf:/usr/local/apache2/conf/httpd.conf
- ./php-fpm.conf:/usr/local/apache2/conf/extra/php-fpm.conf
depends_on:
- php-fpm
restart: unless-stopped
php-fpm:
image: php:8.2-fpm
container_name: php-fpm
volumes:
- ./public-html:/var/www/html/
restart: unless-stopped
Apache2側のPHP設定
httpd.confに対して、以下に示す設定を追加する。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
<FilesMatch \.php$>
SetHandler "proxy:fcgi://php-fpm:9000"
</FilesMatch>
<Directory /usr/local/apache2/htdocs>
DirectoryIndex index.php index.html
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
リバースプロキシの設定
Apache2をリバースプロキシとして使用する設定例を以下に示す。
基本的なリバースプロキシ設定
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
<VirtualHost *:80>
ServerName proxy.example.com
ProxyPreserveHost On
ProxyPass / http://backend:8000/
ProxyPassReverse / http://backend:8000/
ErrorLog /usr/local/apache2/logs/proxy-error.log
CustomLog /usr/local/apache2/logs/proxy-access.log combined
</VirtualHost>
ロードバランサー設定
複数のバックエンドサーバに負荷分散する設定を以下に示す。
<Proxy balancer://mycluster>
BalancerMember http://backend1:8000
BalancerMember http://backend2:8000
BalancerMember http://backend3:8000
ProxySet lbmethod=byrequests
</Proxy>
<VirtualHost *:80>
ServerName loadbalancer.example.com
ProxyPreserveHost On
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
ErrorLog /usr/local/apache2/logs/lb-error.log
CustomLog /usr/local/apache2/logs/lb-access.log combined
</VirtualHost>
.htaccessの設定
.htaccessファイルを使用したディレクトリ単位の設定例を示す。
Basic認証の設定
特定のディレクトリにBasic認証を設定する。
パスワードファイルを作成する。
podman exec -it apache2 htpasswd -c /usr/local/apache2/.htpasswd username
.htaccessファイルを作成する。
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /usr/local/apache2/.htpasswd
Require valid-user
URL書き換えの設定
mod_rewriteを使用したURL書き換えの例を以下に示す。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
キャッシュ制御の設定
静的ファイルのキャッシュ制御を設定する。
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
</IfModule>
ログの管理
Apache2のアクセスログとエラーログを管理する方法を示す。
ログの確認
コンテナ内のログをリアルタイムで確認する。
# アクセスログ podman exec apache2 tail -f /usr/local/apache2/logs/access_log # エラーログ podman exec apache2 tail -f /usr/local/apache2/logs/error_log
または、podman logsコマンドでコンテナログを確認する。
podman logs -f apache2
ログのローテーション
ログファイルをホスト側で管理する場合の設定を以下に示す。
version: '3'
services:
apache2:
image: httpd:2.4
container_name: apache2
ports:
- "0.0.0.0:8080:80"
volumes:
- ./public-html:/usr/local/apache2/htdocs/
- ./logs:/usr/local/apache2/logs/
restart: unless-stopped
logrotateを使用したログローテーション設定を作成する。
- /etc/logrotate.d/apache2 ファイルの例
/path/to/logs/*.log { daily rotate 14 compress delaycompress notifempty create 0640 root root sharedscripts postrotate podman exec apache2 apachectl graceful endscript }
モジュールの有効化
Apache2で使用するモジュールを有効化する方法を示す。
モジュールの読み込み
httpd.confファイルを開いて、モジュールのロードを確認する。
# リライトモジュール
LoadModule rewrite_module modules/mod_rewrite.so
# SSLモジュール
LoadModule ssl_module modules/mod_ssl.so
# プロキシモジュール
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
# 圧縮モジュール
LoadModule deflate_module modules/mod_deflate.so
# ヘッダモジュール
LoadModule headers_module modules/mod_headers.so
# 期限切れモジュール
LoadModule expires_module modules/mod_expires.so
有効なモジュールの確認
コンテナ内で有効なモジュールを確認する。
podman exec apache2 apachectl -M
パフォーマンスチューニング
Apache2のパフォーマンスを最適化するための設定を示す。
MPMの設定
マルチプロセッシングモジュールの設定を最適化する。
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
圧縮の有効化
テキストベースのコンテンツを圧縮して転送する。
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
AddOutputFilterByType DEFLATE application/javascript application/json
AddOutputFilterByType DEFLATE application/xml application/xhtml+xml
</IfModule>
KeepAliveの設定
持続的接続を最適化する。
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
セキュリティ設定
Apache2のセキュリティを強化するための設定を示す。
サーバ情報の非表示
サーバ情報をレスポンスヘッダーから削除する。
ServerTokens Prod
ServerSignature Off
セキュリティヘッダの追加
セキュリティ関連のHTTPヘッダを追加する。
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "no-referrer-when-downgrade"
Header always set Content-Security-Policy "default-src 'self'"
</IfModule>
ディレクトリリスティングの無効化
ディレクトリの内容を一覧表示しないようにする。
<Directory /usr/local/apache2/htdocs>
Options -Indexes
</Directory>
特定のファイルへのアクセス制限
機密ファイルへのアクセスを制限する。
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
<FilesMatch "\.(bak|config|sql|log|ini)$">
Require all denied
</FilesMatch>
トラブルシューティング
コンテナが起動しない
設定ファイルの構文エラーを確認する。
podman logs apache2 podman exec apache2 apachectl configtest
ポート番号の競合
他のサービスとポート番号が競合している場合、別のポートを使用する。
podman run -d --name apache2 -p 0.0.0.0:8081:80 httpd:2.4
パーミッションエラー
ボリュームマウントしたディレクトリのパーミッションを確認する。
chmod -R 755 ./public-html chown -R 1000:1000 ./public-html
502 Bad Gateway エラー
プロキシ設定でバックエンドサーバへの接続を確認する。
# バックエンドサーバの稼働確認 podman exec apache2 curl http://backend:8000 # プロキシモジュールの確認 podman exec apache2 apachectl -M | grep proxy
メモリ不足
MaxRequestWorkers の値を調整して、メモリ使用量を最適化する。
<IfModule mpm_prefork_module>
MaxRequestWorkers 50
</IfModule>
ファイヤーウォールの設定
同一ネットワーク上の外部PCからアクセスする場合は、ファイヤーウォールのポート開放を行う。
Linux
# Firewalldを使用している場合 sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --permanent --add-port=8443/tcp sudo firewall-cmd --reload # UFWを使用している場合 sudo ufw allow 8080/tcp sudo ufw allow 8443/tcp
Windows 11
PowerShellを管理者権限で起動して、以下に示すコマンドを実行する。
HTTPポートの受信ルールを追加する。
New-NetFirewallRule -DisplayName "Apache2 HTTP" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow
HTTPSポートの受信ルールを追加する。
New-NetFirewallRule -DisplayName "Apache2 HTTPS" -Direction Inbound -Protocol TCP -LocalPort 8443 -Action Allow
正常にポート開放が行われているかどうかを確認する場合、別PCからPowerShellを起動して、以下に示すコマンドを実行する。
Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 8080 Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 8443
ファイアウォールルールを削除する場合は、以下に示すコマンドを実行する。
# HTTPポートのルール削除 Remove-NetFirewallRule -DisplayName "Apache2 HTTP" -ErrorAction SilentlyContinue # HTTPSポートのルール削除 Remove-NetFirewallRule -DisplayName "Apache2 HTTPS" -ErrorAction SilentlyContinue
Windows 10
PowerShellを管理者権限で起動して、以下に示すコマンドを実行する。
HTTPポートの受信ルールを追加する。
New-NetFirewallRule -DisplayName "Apache2 HTTP" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow
HTTPSポートの受信ルールを追加する。
New-NetFirewallRule -DisplayName "Apache2 HTTPS" -Direction Inbound -Protocol TCP -LocalPort 8443 -Action Allow
正常にポート開放が行われているかどうかを確認する場合、別PCからPowerShellを起動して、以下に示すコマンドを実行する。
Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 8080 Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 8443
ファイアウォールルールを削除する場合は、以下に示すコマンドを実行する。
# HTTPポートのルール削除 Remove-NetFirewallRule -DisplayName "Apache2 HTTP" -ErrorAction SilentlyContinue # HTTPSポート(8443)のルール削除 Remove-NetFirewallRule -DisplayName "Apache2 HTTPS" -ErrorAction SilentlyContinue