それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

nginx でhttp/https をリダイレクトせずにバックエンドサーバに任せる。

nginx で http は http まま維持して、httpshttpsのままバックエンドサーバにリクエストを投げつけるとする。

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プロキシしてくれるればいいってときはどうやるんだっけと。しばし考えてしまったのでメモ