アプリがHTTPSなのにHTTP扱いになり、リダイレクトループした。瀬名はアプリ設定を疑い、律はリバースプロキシのヘッダーを見た。
`X-Forwarded-Proto` が渡っていない。
プロキシ配下では、アプリは直接の接続だけを見る。外側がHTTPSでも、内側がHTTPなら勘違いする。
二人はNginxにヘッダーを追加し、アプリ側のtrusted proxy設定も確認した。
「見えている世界が違うと、判断も変わる」
瀬名が言うと、律は言った。
「だから、どこから見ているか伝えないと」
それは運用の話で、たぶん二人の話でもあった。
人物紹介
瀬名悠真
- 男性、30代
- サーバ運用・インフラ担当
- 手は動くが、初動で少し焦りやすい
久坂律
- 女性、30代
- 監視、自動化、ログ解析、運用設計に強い
- 冷静で、原因調査の順序を大事にする
用語メモ
X-Forwarded-Proto が渡っていない問題は、Nginxがバックエンドアプリへ http/https のスキーム情報を送信していないこと、またはアプリ側がそのヘッダーを信頼する設定になっていないことが原因です。Nginxに proxy_set_header を追加し、アプリ側で信頼するプロキシ(Trusted Proxy)を設定します。 [1, 2, 3]Nginxでのヘッダー追加設定
Nginxの設定ファイル(
nginx.conf やバーチャルホストの設定)の location ブロックに、proxy_set_header X-Forwarded-Proto $scheme; を追加します。 [1]- 設定例:
nginx
location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # ← これを追加 }コードは注意してご使用ください。
- 反映コマンド:
sudo nginx -tで構文チェック後、sudo systemctl reload nginxで再読み込みします。 [1]
アプリ側の Trusted Proxy 設定
Nginxからヘッダーを送っても、アプリ側がリバースプロキシからのヘッダーを安全なものとして信用(信頼)していないと、元のプロトコルを正しく認識できません。各フレームワークで信頼する設定が必要です。
- Express (Node.js):
app.set('trust proxy', true);または信頼するIPを指定
- Ruby on Rails:
config.action_dispatch.ip_spoofing_check = falseやconfig.assume_ssl = true、またはプロキシIPの許可設定
- Django:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')をsettings.pyに追加
- Spring Boot:
server.forward-headers-strategy=nativeをapplication.propertiesに設定

