nginx で http は http まま維持して、httpsはhttpsのままバックエンドサーバにリクエストを投げつけるとする。
cli =(http)=> nginx =(http)=> backend:80 cli =(https)=> nginx =(https)=> backend:443
ウェブを検索すると、大体の設定例は次のようになっている。
cli =(http)=> nginx( redirect http to https ) cli =(https)=> nginx =(https)=> backend:443
でもバックエンドサーバにちゃんとリダイレクト機能がある場合、わざわざnginxが受け取る必要がないので。そのまま流してしまえばいいのである。
http / https 設定を2つ書く
if 文で条件分岐でhttp のとき、httpsのときで分ける必要はない。ついつい条件を加工して記入を思案するが、時間の無駄である。
sample.config
server { listen 80; location / { proxy_pass http://backend.local:80; } } server { listen 443 ssl http2; location / { proxy_pass https://backend.local:443; } }
こまかな設定は省略したが、単純に2つ設定掛けばいいのである。
バックエンドサーバがちゃんとリダイレクトをしてくれるなら、nginxは単純にプロキシすればいいだけ。
なぜこんなことを書く?
バックエンドサーバがSSLで証明書付で話す場合、バックエンドサーバがちゃんとリダイレクト機能を持っている場合、それらを使って接続を試し動作チェックをする場合。
このときは、nginx側でリダイレクトすると面倒。単純にHTTPプロキシ、HTTPS+SSLプロキシしてくれるればいいってときはどうやるんだっけと。しばし考えてしまったのでメモ