今回も、前回に引き続きnginxの設定を見ていきます。 今回はhttpコンテキストにおけるupstream/server/locationディレクティブを用い、個別の仮想サーバに関する設定を行ないます。

目次

はじめに

この記事では汎用的な設定についてまとめるため、SSL/TLS通信に関する設定は書いていません。 SSLに関する設定は過去に書いていますので、そちらをご覧ください。

3つのブロック

httpコンテキストでは、upstream/server/locationという3つのブロックがあり、それぞれについてディレクティブを設定していきます。

まずこの3つについて簡単にまとめます。

upstream

後述するproxy_passディレクティブから参照できるサーバを定義します。

unicornでRailsアプリケーションを動かす場合は、一般的にunicornのソケットのパスを指定します。

server

個別の仮想サーバに関する設定を行ないます。

listenディレクティブでホスト名やポート番号をリスンし、一致したリクエストをどう処理するかを定義していきます。

location

個別の仮想サーバへの、特定のリクエストに関する設定を行ないます。

正規表現などで適用したいURIを表現し、このURIにマッチするリクエストの場合はlocationブロック内のディレクティブが評価されます。

ディレクティブ一覧

listen

リスンするソケット情報を設定します。 IPアドレスやポート番号により指定します。

SSL/TLS通信が有効な場合、http2をあわせて設定することでHTTP/2を有効にできます。

server_name

ホスト名を指定します。 このホスト名に一致したリクエストの場合にserverブロックが適用されます。

return

特定のステータスコードを返し、またURLを指定すればそのURLにリダイレクトします。

root

server/locationブロック内におけるルートディレクトリを設定します。

try_files

リクエストで指定されたファイルを、ここに設定した値の左から順に探します。

後述する設定例において、リクエストがexample.com/fooの場合は、foo/index.htmlfoo.htmlfooと探索し、最終的にバックエンドサーバに処理を委譲します。

error_page

エラーのステータスに応じたページを表示します。

proxy_passを使っている場合、デフォルトだとその先から返すステータスは見てくれません。 この場合、proxy_intercept_errorsonにすることで対応することができます。

expires

ブラウザでキャッシュする期間を設定します。 RailsでプリコンパイルしたアセットのURLは一意なので、ここの値は長く設定するとよいと思います。

gzip_static

リクエストで指定されたファイルの.gzを最初に探し、あればそのまま配信します。

RailsではCSSやJavaScriptはあらかじめ圧縮された状態で配置されるので、nginx側で圧縮せず配置されたものをそのまま配信するようにします。

proxy_pass

バックエンドサーバのURLを設定します。 一般的に、upstreamブロックで設定したバックエンドサーバを指定することになると思います。

proxy_redirect

バックエンドサーバがリダイレクトした際のヘッダのふるまいを設定します。 onならproxy_passをホスト名とし、offならサーバのふるまいどおりにリダイレクトします。

proxy_set_header

ヘッダ情報を付与します。

ここまでの設定まとめ

以上の設定をまとめると、次のようになります。

/etc/nginx/nginx.conf:

upstream app_server {
  server unix:/path/to/.unicorn.sock fail_timeout=0;
}

server {
  listen 80;

  root /path/to/current/public;
  try_files $uri/index.html $uri.html $uri @app;

  error_page 404 /404.html;
  error_page 500 502 503 504 /500.html;

  location ~* \.(?:css|js)$ {
    expires max;
    gzip_static on;
  }

  location ~* \.(?:gif|jpg|png|ico|svg|gz|woff)$ {
    expires max;
  }

  location @app {
    proxy_intercept_errors on;
    proxy_pass http://app_server;
    proxy_redirect off;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

また、前回までの設定をまとめたものをGistに上げましたので、あわせてご覧ください。

参考記事

おわりに

計3回に渡って、Rails+unicornのためのnginxの設定について見てきました。 個別のチューニングの必要はあるものの、ある程度汎用的な設定になったのではないでしょうか。

nginx設定の際の参考になればうれしいです。