nginxのリバースプロキシ設定
はじめに
nginxは、Webサーバであると同時にリバースプロキシとしても使用することができる。
例えば
- 静的コンテンツはそのままnginxで返し、動的な処理はapacheへ回す
- フロントにnginxを配置し、LoadBalancerとしてリクエストを各Webサーバへ振り分ける
といった使い方がされている。
今回、以下の方針でセットアップを行なっているので、備忘のためにconfを書き残す。
事前準備
まず、nginxとapacheがインストールされ、プロセスが起動しているものとする。
注意が必要なのは、nginx/apache共にポート80をデフォルトで使用するため、変更する必要があることだ。
nginxはリバースプロキシとしてポート80で待つ必要があるため、ここではapacheのポートを8080に変更する。
apacheのポート変更は、httpd.conf内の
Listen 80
↓
Listen 8080
に変更する。
同様にSSLについてもポート443が競合するため、
Listen 443 https
↓
Listen 8443 https
に変更しておく。
ただし、nginxからapacheへのフォワードについてはSSLを使う必要はないため、実際の転送はhttpとして8080で行う。
また、フォワードされる側のapache側でも予めバーチャルホストの設定が必要になる。
confの設定
1. httpリクエストに対しステータス444を返答
www宛に来たリクエストへはステータス444を返す設定とする。
また、default_serverに設定しているので、IPで直接アクセスされた場合にも同じレスポンスが返る。
server { listen 80 default_server; server_name www.hogehoge.net; return 444; }
実際にアクセスされると以下のログが残る。
192.168.0.245 - - [17/Sep/2015:15:46:05 +0900] "GET / HTTP/1.1" 444 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36" "-"
2. httpリクエストをapacheへフォワード
apache.hogehoge.net宛に来たhttpリクエストはapacheへフォワードする。
server { listen 80; server_name apache.hogehoge.net; location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header HOST $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
ログを見るとステータス200を返している。
/var/log/nginx/access.log
192.168.0.245 - - [17/Sep/2015:15:53:32 +0900] "GET / HTTP/1.1" 200 13296 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36" "-"
127.0.0.1 - - [17/Sep/2015:15:53:32 +0900] "GET / HTTP/1.0" 200 13268 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36"
3. httpsリクエストをapacheへフォワード
SSLを使ったアクセスについても同様にapacheへフォワードができる。
server { listen 443 ssl; server_name secure.hogehoge.net; ssl on; ssl_certificate /etc/pki/tls/certs/secure.crt; ssl_certificate_key /etc/pki/tls/certs/secure.key; ssl_ciphers RC4-SHA:HIGH:!ADH; ssl_prefer_server_ciphers on; location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header HOST $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
SSLに関する設定項目が増えている。
先述の通り、443で受け取ったhttpsリクエストについても8080でapacheへフォワードしている。
/var/log/nginx/access.log
192.168.0.245 - - [17/Sep/2015:16:01:22 +0900] "GET / HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36" "-"
127.0.0.1 - - [17/Sep/2015:16:01:22 +0900] "GET / HTTP/1.0" 200 21 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36"
4. WebDav over SSLをnginxで運用
WebDavについてはSSL化した上で、nginxで運用を行う。
server { listen 443; server_name webdav.hogehoge.net; ssl on; ssl_certificate /etc/pki/tls/certs/webdav.crt; ssl_certificate_key /etc/pki/tls/certs/webdav.key; ssl_ciphers RC4-SHA:HIGH:!ADH; ssl_prefer_server_ciphers on; root /var/www/webdav; charset utf-8; location / { dav_methods PUT DELETE MKCOL COPY MOVE; dav_ext_methods PROPFIND OPTIONS; dav_access user:rw group:rw all:r; client_body_temp_path /tmp/nginx/webdav; create_full_put_path on; } }
apacheへのフォワードを行わないのでproxy系の設定項目がなくなっている。
代わりに、dav系の設定が増えている。
なお、client_body_temp_pathで一時ファイルの保存先を /tmp以下に設定しているが、一定期間アクセスがないと消えてしまうので、ここは変えたほうが良いかもしれない。