MochiuWiki : SUSE, EC, PCB
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
コンテナ - Apache2のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
コンテナ - Apache2
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Apache2は、世界で最も広く使用されているWebサーバソフトウェアである。<br> <br> Dockerコンテナとして実行することで、開発環境や本番環境で簡単にWebサーバを構築できる。<br> 静的ファイルの配信、PHPなどの動的コンテンツの処理、リバースプロキシ等の様々な用途に使用される。<br> <br> Apache2コンテナの主な機能を以下に示す。<br> * HTTPサーバ機能 *:デフォルト : 80番ポート * HTTPSサーバ機能 *: デフォルト : 443番ポート * 静的ファイルの配信 * モジュールによる機能拡張 * .htaccessによるディレクトリ単位の設定 <br><br> == Containerfile == Containerfileを作成する。<br> <br> <syntaxhighlight lang="dockerfile"> FROM httpd:2.4 COPY ./public-html/ /usr/local/apache2/htdocs/ EXPOSE 80 443 CMD ["httpd-foreground"] </syntaxhighlight> <br> コンテナイメージをビルドする。<br> podman build -t apache2:custom -f Containerfile . <br> ビルドしたイメージからコンテナを実行する。<br> podman run -d \ --name apache2 \ -p 0.0.0.0:8080:80 \ -v ./public-html:/usr/local/apache2/htdocs/ \ apache2:custom <br><br> == Compose == Composeファイルを作成する。<br> <br> <syntaxhighlight lang="yaml"> 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: </syntaxhighlight> <br> Composeファイルを実行して、コンテナを作成および実行する。<br> podman-compose up -d # または podman-compose -f <Composeファイル名> up -d <br><br> == アクセス方法 == コンテナが起動したら、以下のURLでアクセスできる。<br> <br> * HTTP *: http://localhost:8080 * HTTPS *: https://localhost:8443 <br> ==== デフォルトページの確認 ==== コンテナを起動後、Webブラウザでアクセスすると It works! というメッセージが表示される。<br> <br> ==== カスタムHTMLの配置 ==== ホスト側のディレクトリ (例: ./public-html) にHTMLファイルを配置することにより、独自のコンテンツを表示できる。<br> <br> mkdir -p public-html echo "<h1>Hello from Apache2 Container</h1>" > public-html/index.html <br><br> == 設定ファイルのカスタマイズ == Apache2の設定ファイルをカスタマイズする場合は、httpd.confをホスト側に配置する。<br> <br> ==== 設定ファイルのコピー ==== 実行中のコンテナから設定ファイルをコピーする。<br> podman cp apache2:/usr/local/apache2/conf/httpd.conf ./apache-conf/httpd.conf <br> ==== 設定の反映 ==== 設定ファイルを編集後、コンテナを再起動する。<br> podman restart apache2 <br> または、設定の構文チェックを行う。<br> podman exec apache2 apachectl configtest <br><br> == 仮想ホストの設定 == 複数のサイトを1つのApache2コンテナで運用する場合、仮想ホストを設定する。<br> <br> ==== 仮想ホスト設定ファイルの作成 ==== ホスト側に仮想ホスト用の設定ファイルを作成する。<br> <br> <syntaxhighlight lang="apache"> <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> </syntaxhighlight> <br> ==== Composeファイルでの設定例 ==== 仮想ホストを使用する場合のCompose設定を以下に示す。<br> <br> <syntaxhighlight lang="yaml"> 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: </syntaxhighlight> <br><br> == SSL / TLS設定 == HTTPS通信を有効化するための設定を行う。<br> <br> ==== SSL証明書の準備 ==== 自己署名証明書を作成する例を以下に示す。<br> <br> 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" <br> ==== SSL設定ファイルの作成 ==== HTTPS用の仮想ホスト設定を作成する。<br> <br> <syntaxhighlight lang="apache"> 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> </syntaxhighlight> <br> ==== SSL有効化のCompose設定 ==== <syntaxhighlight lang="yaml"> 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 </syntaxhighlight> <br><br> == PHP-FPMとの連携 == Apache2コンテナでPHPアプリケーションを動作させる場合、PHP-FPMと連携する設定例を示す。<br> <br> ==== Composeファイルでの連携設定 ==== <syntaxhighlight lang="yaml"> 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 </syntaxhighlight> <br> ==== Apache2側のPHP設定 ==== httpd.confに対して、以下に示す設定を追加する。<br> <br> <syntaxhighlight lang="apache"> 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> </syntaxhighlight> <br><br> == リバースプロキシの設定 == Apache2をリバースプロキシとして使用する設定例を以下に示す。<br> <br> ==== 基本的なリバースプロキシ設定 ==== <syntaxhighlight lang="apache"> 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> </syntaxhighlight> <br> ==== ロードバランサー設定 ==== 複数のバックエンドサーバに負荷分散する設定を以下に示す。<br> <br> <syntaxhighlight lang="apache"> <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> </syntaxhighlight> <br><br> == .htaccessの設定 == .htaccessファイルを使用したディレクトリ単位の設定例を示す。<br> <br> ==== Basic認証の設定 ==== 特定のディレクトリにBasic認証を設定する。<br> <br> パスワードファイルを作成する。<br> podman exec -it apache2 htpasswd -c /usr/local/apache2/.htpasswd username <br> .htaccessファイルを作成する。<br> <br> <syntaxhighlight lang="apache"> AuthType Basic AuthName "Restricted Area" AuthUserFile /usr/local/apache2/.htpasswd Require valid-user </syntaxhighlight> <br> ==== URL書き換えの設定 ==== mod_rewriteを使用したURL書き換えの例を以下に示す。<br> <br> <syntaxhighlight lang="apache"> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </syntaxhighlight> <br> ==== キャッシュ制御の設定 ==== 静的ファイルのキャッシュ制御を設定する。<br> <br> <syntaxhighlight lang="apache"> <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> </syntaxhighlight> <br><br> == ログの管理 == Apache2のアクセスログとエラーログを管理する方法を示す。<br> <br> ==== ログの確認 ==== コンテナ内のログをリアルタイムで確認する。<br> <br> # アクセスログ podman exec apache2 tail -f /usr/local/apache2/logs/access_log # エラーログ podman exec apache2 tail -f /usr/local/apache2/logs/error_log <br> または、podman logsコマンドでコンテナログを確認する。<br> podman logs -f apache2 <br> ==== ログのローテーション ==== ログファイルをホスト側で管理する場合の設定を以下に示す。<br> <br> <syntaxhighlight lang="yaml"> 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 </syntaxhighlight> <br> logrotateを使用したログローテーション設定を作成する。<br> <br> * /etc/logrotate.d/apache2 ファイルの例 *: <syntaxhighlight lang="text"> /path/to/logs/*.log { daily rotate 14 compress delaycompress notifempty create 0640 root root sharedscripts postrotate podman exec apache2 apachectl graceful endscript } </syntaxhighlight> <br><br> == モジュールの有効化 == Apache2で使用するモジュールを有効化する方法を示す。<br> <br> ==== モジュールの読み込み==== httpd.confファイルを開いて、モジュールのロードを確認する。<br> <br> <syntaxhighlight lang="apache"> # リライトモジュール 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 </syntaxhighlight> <br> ==== 有効なモジュールの確認 ==== コンテナ内で有効なモジュールを確認する。<br> podman exec apache2 apachectl -M <br><br> == パフォーマンスチューニング == Apache2のパフォーマンスを最適化するための設定を示す。<br> <br> ==== MPMの設定 ==== マルチプロセッシングモジュールの設定を最適化する。<br> <br> <syntaxhighlight lang="apache"> <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> </syntaxhighlight> <br> ==== 圧縮の有効化 ==== テキストベースのコンテンツを圧縮して転送する。<br> <br> <syntaxhighlight lang="apache"> <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> </syntaxhighlight> <br> ==== KeepAliveの設定 ==== 持続的接続を最適化する。<br> <br> <syntaxhighlight lang="apache"> KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 5 </syntaxhighlight> <br><br> == セキュリティ設定 == Apache2のセキュリティを強化するための設定を示す。<br> <br> ==== サーバ情報の非表示 ==== サーバ情報をレスポンスヘッダーから削除する。<br> <br> <syntaxhighlight lang="apache"> ServerTokens Prod ServerSignature Off </syntaxhighlight> <br> ==== セキュリティヘッダの追加 ==== セキュリティ関連のHTTPヘッダを追加する。<br> <br> <syntaxhighlight lang="apache"> <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> </syntaxhighlight> <br> ==== ディレクトリリスティングの無効化 ==== ディレクトリの内容を一覧表示しないようにする。<br> <br> <syntaxhighlight lang="apache"> <Directory /usr/local/apache2/htdocs> Options -Indexes </Directory> </syntaxhighlight> <br> ==== 特定のファイルへのアクセス制限 ==== 機密ファイルへのアクセスを制限する。<br> <br> <syntaxhighlight lang="apache"> <FilesMatch "^\.ht"> Require all denied </FilesMatch> <FilesMatch "\.(bak|config|sql|log|ini)$"> Require all denied </FilesMatch> </syntaxhighlight> <br><br> == トラブルシューティング == ==== コンテナが起動しない ==== 設定ファイルの構文エラーを確認する。<br> <br> podman logs apache2 podman exec apache2 apachectl configtest <br> ==== ポート番号の競合 ==== 他のサービスとポート番号が競合している場合、別のポートを使用する。<br> <br> podman run -d --name apache2 -p 0.0.0.0:8081:80 httpd:2.4 <br> ==== パーミッションエラー ==== ボリュームマウントしたディレクトリのパーミッションを確認する。<br> <br> chmod -R 755 ./public-html chown -R 1000:1000 ./public-html <br> ==== 502 Bad Gateway エラー ==== プロキシ設定でバックエンドサーバへの接続を確認する。<br> <br> # バックエンドサーバの稼働確認 podman exec apache2 curl http://backend:8000 # プロキシモジュールの確認 podman exec apache2 apachectl -M | grep proxy <br> ==== メモリ不足 ==== MaxRequestWorkers の値を調整して、メモリ使用量を最適化する。<br> <br> <syntaxhighlight lang="apache"> <IfModule mpm_prefork_module> MaxRequestWorkers 50 </IfModule> </syntaxhighlight> <br><br> == ファイヤーウォールの設定 == 同一ネットワーク上の外部PCからアクセスする場合は、ファイヤーウォールのポート開放を行う。<br> <br> ==== 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 <br> ==== Windows 11 ==== PowerShellを管理者権限で起動して、以下に示すコマンドを実行する。<br> <br> HTTPポートの受信ルールを追加する。<br> New-NetFirewallRule -DisplayName "Apache2 HTTP" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow <br> HTTPSポートの受信ルールを追加する。<br> New-NetFirewallRule -DisplayName "Apache2 HTTPS" -Direction Inbound -Protocol TCP -LocalPort 8443 -Action Allow <br> 正常にポート開放が行われているかどうかを確認する場合、別PCからPowerShellを起動して、以下に示すコマンドを実行する。<br> Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 8080 Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 8443 <br> ファイアウォールルールを削除する場合は、以下に示すコマンドを実行する。<br> # HTTPポートのルール削除 Remove-NetFirewallRule -DisplayName "Apache2 HTTP" -ErrorAction SilentlyContinue # HTTPSポートのルール削除 Remove-NetFirewallRule -DisplayName "Apache2 HTTPS" -ErrorAction SilentlyContinue <br> ==== Windows 10 ==== PowerShellを管理者権限で起動して、以下に示すコマンドを実行する。<br> <br> HTTPポートの受信ルールを追加する。<br> New-NetFirewallRule -DisplayName "Apache2 HTTP" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow <br> HTTPSポートの受信ルールを追加する。<br> New-NetFirewallRule -DisplayName "Apache2 HTTPS" -Direction Inbound -Protocol TCP -LocalPort 8443 -Action Allow <br> 正常にポート開放が行われているかどうかを確認する場合、別PCからPowerShellを起動して、以下に示すコマンドを実行する。<br> Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 8080 Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 8443 <br> ファイアウォールルールを削除する場合は、以下に示すコマンドを実行する。<br> # HTTPポートのルール削除 Remove-NetFirewallRule -DisplayName "Apache2 HTTP" -ErrorAction SilentlyContinue # HTTPSポート(8443)のルール削除 Remove-NetFirewallRule -DisplayName "Apache2 HTTPS" -ErrorAction SilentlyContinue <br><br> __FORCETOC__ [[カテゴリ:コンテナ]]
コンテナ - Apache2
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse