Ubuntu 26.04 の Apache は、静的ファイル配信だけでなく、バックエンドのアプリケーションへ HTTP リクエストを中継するリバースプロキシとしても使えます。
この記事では、Apache の基本設定と TLS 設定ができている前提で、必要モジュール、ProxyPass、転送ヘッダー、バックエンド疎通、WebSocket、ログ確認までをまとめます。
- Apache をリバースプロキシとして使う前提
proxy、proxy_http、headersなどの必要モジュールProxyPassとProxyPassReverseの基本Host、X-Forwarded-For、X-Forwarded-Protoの扱い- バックエンド疎通、WebSocket、502 の切り分け
| 対象 OS | Ubuntu 26.04 Server |
|---|---|
| Web サーバー | Apache HTTP Server |
| 主なモジュール | proxy、proxy_http、headers、必要に応じて proxy_wstunnel |
| 代表設定 | ProxyPass、ProxyPassReverse、ProxyPreserveHost |
| 設定検証 | sudo apache2ctl -t |
リバースプロキシの役割を確認する
リバースプロキシは、クライアントからのリクエストを前段で受け、内部のバックエンドへ転送する構成です。Apache 側で TLS 終端、認証、ログ、WAF を担当し、アプリケーションは内部ポートで待ち受ける形にできます。
- 公開 FQDN は Apache が受ける
- バックエンドは
127.0.0.1:3000や内部 IP で待ち受ける - Apache からバックエンドへの疎通を先に確認する
- アプリケーションが必要とする転送ヘッダーを明示する
- TLS 終端を Apache で行う場合は
X-Forwarded-Protoを渡す
必要な Apache モジュールを有効化する
HTTP リバースプロキシでは proxy と proxy_http を使います。転送ヘッダーを設定する場合は headers、WebSocket を扱う場合は proxy_wstunnel も確認します。
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod headers
sudo a2enmod proxy_wstunnel
sudo apache2ctl -M
sudo apache2ctl -tバックエンドの疎通を確認する
Apache の設定に入る前に、Apache サーバー自身からバックエンドへ接続できることを確認します。ここでは例として、バックエンドが 127.0.0.1:3000 で待ち受けている前提にします。
curl -I http://127.0.0.1:3000/
curl http://127.0.0.1:3000/health
ss -ltnpProxyPass の基本形を設定する
VirtualHost 内で ProxyPass と ProxyPassReverse を設定します。ProxyPreserveHost On にすると、クライアントがアクセスした Host ヘッダーをバックエンドへ渡せます。
sudo tee /etc/apache2/sites-available/app.example.com.conf >/dev/null <<'EOF'
<VirtualHost *:443>
ServerName app.example.com
ProxyPreserveHost On
ProxyRequests Off
RequestHeader set X-Forwarded-Proto https
RequestHeader set X-Forwarded-SSL on
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
ErrorLog ${APACHE_LOG_DIR}/app.example.com-error.log
CustomLog ${APACHE_LOG_DIR}/app.example.com-access.log combined
</VirtualHost>
EOF
sudo a2ensite app.example.com.confsudo apache2ctl -t
sudo systemctl reload apache2.service
sudo apache2ctl -S
curl -I https://app.example.com/転送ヘッダーを確認する
バックエンドアプリケーションが外部 URL、リダイレクト URL、クライアント IP を判断する場合、転送ヘッダーが重要になります。代表的なヘッダーを Apache 側で明示します。
sudo tee /etc/apache2/conf-available/proxy-forwarded-headers.conf >/dev/null <<'EOF'
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto https
RequestHeader set X-Forwarded-SSL on
RequestHeader append X-Forwarded-For %{REMOTE_ADDR}s
EOF
sudo a2enconf proxy-forwarded-headers
sudo apache2ctl -t多くの環境では mod_proxy が X-Forwarded-For を扱いますが、アプリケーションや前段ロードバランサーの構成により、どこで付与するかを決めておきます。
パス単位でバックエンドを分ける
同じ VirtualHost の中で、パスごとに異なるバックエンドへ転送することもできます。API、管理画面、静的ファイルなどを分ける場合は、より具体的なパスを先に書くと意図が明確になります。
sudo tee /etc/apache2/conf-available/proxy-paths-example.conf >/dev/null <<'EOF'
ProxyPass /api/ http://127.0.0.1:3001/api/
ProxyPassReverse /api/ http://127.0.0.1:3001/api/
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
EOF
sudo a2enconf proxy-paths-example
sudo apache2ctl -tWebSocket を扱う
WebSocket を使うアプリケーションでは、proxy_wstunnel を有効化し、ws:// または wss:// のバックエンドを明示します。HTTP の転送設定とは分けて考えると切り分けやすくなります。
sudo tee /etc/apache2/conf-available/proxy-websocket-example.conf >/dev/null <<'EOF'
ProxyPass /socket/ ws://127.0.0.1:3000/socket/
ProxyPassReverse /socket/ ws://127.0.0.1:3000/socket/
EOF
sudo a2enconf proxy-websocket-example
sudo apache2ctl -t502 を切り分ける
リバースプロキシで 502 が出る場合は、Apache の設定だけでなく、バックエンドの起動状態、待ち受けアドレス、ポート、ファイアウォール、TLS 終端の重複を確認します。
systemctl status apache2.service --no-pager
sudo apache2ctl -t
sudo apache2ctl -S
curl -I http://127.0.0.1:3000/
sudo tail -n 100 /var/log/apache2/app.example.com-error.log
journalctl -u apache2.service --no-pager -n 100WAF と組み合わせる場合
Apache の前段で WAF を使う場合、リバースプロキシ設定と WAF ルールの両方がリクエストに影響します。誤検知が疑われる場合は、監査ログで対象 URI、パラメータ、ルール ID を確認し、必要最小限の除外に留めます。
公開前の確認ポイント
sudo apache2ctl -tが成功するsudo apache2ctl -Sで意図した VirtualHost が選ばれている- Apache サーバーからバックエンドへ
curlで接続できる ProxyRequests OffになっているProxyPassReverseを設定している- TLS 終端時の
X-Forwarded-Protoをアプリケーション要件に合わせている - 502 の切り分けに使うログ出力先を確認している
まとめ
Ubuntu 26.04 の Apache リバースプロキシでは、必要モジュール、バックエンド疎通、ProxyPass、ProxyPassReverse、転送ヘッダー、ログ確認を順番に押さえます。
Apache 基本設定と TLS 設定が安定していれば、リバースプロキシはバックエンドアプリケーションを安全に公開する入口になります。WAF と組み合わせる場合は、ブロックされたリクエストを監査ログで確認し、除外は最小限にします。

