手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 Apache リバースプロキシの基本設定 – ProxyPass でバックエンドへ転送する

関連する記事

Ubuntu 26.04 の Apache は、静的ファイル配信だけでなく、バックエンドのアプリケーションへ HTTP リクエストを中継するリバースプロキシとしても使えます。

この記事では、Apache の基本設定と TLS 設定ができている前提で、必要モジュール、ProxyPass、転送ヘッダー、バックエンド疎通、WebSocket、ログ確認までをまとめます。

この記事で扱うこと
  • Apache をリバースプロキシとして使う前提
  • proxyproxy_httpheaders などの必要モジュール
  • ProxyPassProxyPassReverse の基本
  • HostX-Forwarded-ForX-Forwarded-Proto の扱い
  • バックエンド疎通、WebSocket、502 の切り分け
対象 OSUbuntu 26.04 Server
Web サーバーApache HTTP Server
主なモジュールproxyproxy_httpheaders、必要に応じて proxy_wstunnel
代表設定ProxyPassProxyPassReverseProxyPreserveHost
設定検証sudo apache2ctl -t
参考書籍
参考書籍
Apache Cookbook
Apache の VirtualHost、リバースプロキシ、モジュール、運用確認を実例で確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見る
このリンクは Amazon アソシエイトリンクです。

リバースプロキシの役割を確認する

リバースプロキシは、クライアントからのリクエストを前段で受け、内部のバックエンドへ転送する構成です。Apache 側で TLS 終端、認証、ログ、WAF を担当し、アプリケーションは内部ポートで待ち受ける形にできます。

  • 公開 FQDN は Apache が受ける
  • バックエンドは 127.0.0.1:3000 や内部 IP で待ち受ける
  • Apache からバックエンドへの疎通を先に確認する
  • アプリケーションが必要とする転送ヘッダーを明示する
  • TLS 終端を Apache で行う場合は X-Forwarded-Proto を渡す

必要な Apache モジュールを有効化する

HTTP リバースプロキシでは proxyproxy_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 -ltnp

ProxyPass の基本形を設定する

VirtualHost 内で ProxyPassProxyPassReverse を設定します。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.conf
コマンド
sudo 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_proxyX-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 -t

WebSocket を扱う

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 -t

502 を切り分ける

リバースプロキシで 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 100

WAF と組み合わせる場合

Apache の前段で WAF を使う場合、リバースプロキシ設定と WAF ルールの両方がリクエストに影響します。誤検知が疑われる場合は、監査ログで対象 URI、パラメータ、ルール ID を確認し、必要最小限の除外に留めます。

WAF によるブロックが発生した場合は、無理に回避せず、監査ログと対象リクエストを確認してから調整します。広い除外を入れると防御範囲が崩れるため、URI やパラメータ単位で絞ります。

公開前の確認ポイント

  • sudo apache2ctl -t が成功する
  • sudo apache2ctl -S で意図した VirtualHost が選ばれている
  • Apache サーバーからバックエンドへ curl で接続できる
  • ProxyRequests Off になっている
  • ProxyPassReverse を設定している
  • TLS 終端時の X-Forwarded-Proto をアプリケーション要件に合わせている
  • 502 の切り分けに使うログ出力先を確認している

まとめ

Ubuntu 26.04 の Apache リバースプロキシでは、必要モジュール、バックエンド疎通、ProxyPassProxyPassReverse、転送ヘッダー、ログ確認を順番に押さえます。

Apache 基本設定と TLS 設定が安定していれば、リバースプロキシはバックエンドアプリケーションを安全に公開する入口になります。WAF と組み合わせる場合は、ブロックされたリクエストを監査ログで確認し、除外は最小限にします。

関連する記事
Ubuntu 26.04 Apache リバースプロキシの基本設定 – ProxyPass でバックエンドへ転送する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る