Just another IT site ※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。At Your Own Risk!! TURN BACK WHILE YOU CAN
PR

夜間保守のバディ 第28話 逆プロキシのヘッダー

※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。スクリプトはAI生成のものも多いのでコピー&ペーストの際は文字コードに注意ください!
AI連載小説

アプリが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 = falseconfig.assume_ssl = true、またはプロキシIPの許可設定
  • Django: SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')settings.py に追加
  • Spring Boot: server.forward-headers-strategy=nativeapplication.properties に設定
タイトルとURLをコピーしました