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

はじめに

nginxは、Webサーバであると同時にリバースプロキシとしても使用することができる。
例えば

  • 静的コンテンツはそのままnginxで返し、動的な処理はapacheへ回す
  • フロントにnginxを配置し、LoadBalancerとしてリクエストを各Webサーバへ振り分ける

といった使い方がされている。

今回、以下の方針でセットアップを行なっているので、備忘のためにconfを書き残す。

  1. 特定のサブドメイン宛のhttpリクエストはステータス444を返答
  2. 特定のサブドメイン宛のhttpリクエストはapacheへフォワード
  3. 特定のサブドメイン宛のhttpsリクエストはapacheへフォワード
  4. WebDav over SSLをnginxで運用

事前準備

まず、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" "-"

/var/log/httpd/access.log

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" "-"

/var/log/httpd/access.log

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以下に設定しているが、一定期間アクセスがないと消えてしまうので、ここは変えたほうが良いかもしれない。

また、通常のSSLリクエストと証明書が異なるのは、無料サービスでワイルドカードSSL証明書が作れなかったため。