揮発性のメモ2

知識をメモ書きしておく

nginxでリバースプロキシの設定

VPN越しにルータのWEB管理画面を参照したかったので、nginxでリバースプロキシの設定をした

    +----+     VPN        +------+                +--------+
    | PC +----------------+ 装置 +----------------+ ルータ |
    +----+            tap +------+ eth1           +--------+
192.168.36.x    192.168.36.5   192.168.10.x      192.168.10.1


http://192.168.36.5:8001/
           ↓
http://192.168.10.1/


/etc/nginx/conf.d/proxy.conf を追加し、nginxを再起動

server {
    listen  8001;
    proxy_set_header Host $proxy_host;   # ←無くてもいい

    location / {
        proxy_pass http://192.168.0.1;
        proxy_redirect default;
    }
}


I-ODATAのルータに接続する際、proxy_set_headerで下手にHostを設定するとリダイレクトがループしてしまう現象に悩まされた。

#   proxy_set_header Host $host;  # NG
#   proxy_set_header Host $host:$proxy_port;  # NG
    proxy_set_header Host $proxy_host;  # OK (というか、これがデフォルト設定)


それぞれの変数の実際の値を調べてみる

    proxy_set_header HOGE_host $host;
#   proxy_set_header HOGE_port $port;  # こんな変数は無い
    proxy_set_header HOGE_proxy_host $proxy_host;
    proxy_set_header HOGE_proxy_port $proxy_port;
    proxy_set_header HOGE_http_host $http_host;
    proxy_set_header HOGE_http_port $http_port;  # なぜかリクエストヘッダに無い

これでリクエストヘッダを見ると次のようになる

HOGE_host: 192.168.36.5
HOGE_proxy_host: 192.168.10.1
HOGE_proxy_port: 80
HOGE_http_host: 192.168.36.5:8001

サーバ側からしたら自分のホスト名は192.168.10.1なので、それをもとにHTML内のURIを生成したりしてるんだろう、たぶん。
nginxの仕様によると、$proxy_host はポート80以外のときはポート番号も入ってくれるらしい。