Railsの静的ファイルをnginxでルーティングする

railsアプリに使ってるドメイン内で静的ファイルを公開したくなったので調べた。

serve_static_assets

config.serve_static_assetstrueになっていると、public以下のファイルにアクセス可能になる。
しかし、速度の問題で静的ファイルはwebサーバーに処理させたほうが良いので、productionではデフォルトでfalseになっている。*1

nginxでの静的ファイルのルーティング

locationの指定には以下の3つの方法がある。

  • 正確にマッチするクエリを指定: location = /hoge/
  • 正規表現を指定: location ~* \.png*2
  • 先頭からマッチするクエリを指定: location /documents/

上から順にマッチし、マッチした場合はそこで検索をストップする。*3

以下がルーティングの例

upstream foo {
  server  unix:/tmp/unicorn_foo.sock;
}

server {
  listen  80; 
  server_name foo.bar.com;
  location ~* \.(gif|jpe?g|png)$ {
    root /path/to/rails_app/public;
    break;
  }
  location / { 
    if (-f $request_filename) { break; }
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass  http://foo;
  }
}

*1:http://guides.rubyonrails.org/configuring.html#rails-general-configuration

*2:^をつけると先頭からマッチ, ~のときcase sensitive, ~*のときcase insensitive

*3:http://wiki.nginx.org/HttpCoreModule#location