コンテナ - Apache2

提供: MochiuWiki : SUSE, EC, PCB

2025年12月10日 (水) 17:26時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == Apache2は、世界で最も広く使用されているWebサーバソフトウェアである。<br> <br> Dockerコンテナとして実行することで、開発環境や本番環境で簡単にWebサーバを構築できる。<br> 静的ファイルの配信、PHPなどの動的コンテンツの処理、リバースプロキシ等の様々な用途に使用される。<br> <br> Apache2コンテナの主な機能を以下に示す。<br> * HTTPサ…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

概要

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でアクセスできる。


デフォルトページの確認

コンテナを起動後、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