発端
- 「apacheをnginxにするから設定ファイルを移植してよ」という寝言が聞こえてきた
- ムニャムニャしながらapacheの設定を見たところ、mod_proxy_balancerを使っていたので、nginxではproxy_passに書き換えないとなーと思いつつ二度寝した
- 夢の中の出来事なんじゃないかな?
環境
- nginx 1.6.0
- redhat系OS
構成
- クライアントのリクエストをnginxがプロキシして、backend serverに流す流れ
- apache(backend server)はバーチャルホストがいくつかある
client request ==(HTTP:80)==> [ nginx (proxy) ] ==(HTTP:80)==> [ apache(backend server) ] response to clinet <==(HTTP:80)== [ nginx (proxy) ] <==(HTTP:80)== [ apache(backend server) ]
問題
- nginxの設定ファイルのupstreamのserverにbackend serverのFQDNを書いた
- proxy_passにupstreamの名前を指定したけど、backendのFQDNにアクセスしてくれない
- proxy_passに直接backend serverのFQDNを書くとプロキシしてくれる
原因と対策
*追記:2014/5/21 * Host header追加するだけで良いことがわかった
- backend serverのFQDNのDNSが引けないのが原因だった
- upstream内のserver に書かれたFQDNは、nginx起動時に名前解決されてIPで保持されるらしい
- resolverという設定ができるがここでは触れない
- 引けなかったらエラーにしてくれよ感あるが、まあhostsファイルで解決しちゃってるらしいから仕方なし
- DNS登録するのが面倒だったのでserverにIPを書いてHost headerを書き換える流れ
設定例
- nginxの設定ファイルのhttpの中身を抜粋
- 何となくset $host_headerとした
- 何をやりたかったかは察して欲しい
- これだけだと全てのアクセスをbackend serverに投げつけるので、proxy_cache_pathとproxy_temp_pathとか使ってキャッシュしてあげたほうが良い
server { listen 80; server_name _; access_log logs/access.log main; location / { root html; index index.html index.htm; } } upstream backends { server 192.168.1.1; } server { listen 80; server_name hoge.example.com; access_log logs/hoge.log main; set $host_header "backend.example.com"; location / { root /www/public; } location /data { proxy_pass http://backends/resouce/; # proxy_pass http://backend.example.com/resouce/; # これだとうまくいく proxy_set_header Host $host_header; proxy_redirect default; } }
なお、hostsファイルを抜粋するとこんな感じだったが、今回の設定では使わないので消して良い
192.168.1.1 backend.example.com