Railsの静的ファイルをnginxでルーティングする
railsアプリに使ってるドメイン内で静的ファイルを公開したくなったので調べた。
serve_static_assets
config.serve_static_assets
がtrue
になっていると、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