カテゴリー:
環境構築
タグ:
 Rails nginx

このエントリーをはてなブックマークに追加
更新日時:
2017年11月02日(木)
作成日時:
2017年11月02日(木)

前の記事 / 次の記事

Rails+Nginxな環境を構築する場合、
動的なページはpumaやunicorn等のアプリケーションサーバーに、
assets/ や system/ といった静的なファイルはNginx等のウェブサーバーに任せることになると思う。

で、passenngerとかunicorn使ってた時はpublic配下とか特に意識した記憶ないんだけど、
nginxでは明示的にpublic配下へのルートを示してあげないとアクセスできない仕様に
なっていたので、その辺のメモ。

デフォルトのままだと

public/assets
public/system
public/sitemap.xml.gz
public/robots.txt

とかみんなアクセスできない。

public直下のディレクトリに対するアクセス方法は情報も沢山あって分かりやすかったのだけど、
public配下のファイルに対するアクセス方法はちょっと分かりにくかったので、備忘録。

参考

public直下のファイルに対するアクセス設定

public/sitemap.xml.gz みたいなファイルにアクセスさせたい時。

vi nginx.conf

server {
  listen 80;
  server_name inchiki.jp;

  location ~ ^/sitemap\.xml\.gz {
    root /var/www/app_name/current/public;
    rewrite ^\/sitemap\.xml\.gz(|\/)$ /sitemap.xml.gz break;
  }
}

みたいな感じで書けばとりあえずアクセスさせられる。
(他にもっとスマートな方法がある気がしてるけど・・・。)

locationディレクティブでリクエストが正規表現 sitemap.xml.gz に一致した時、
ブロック内を実行する。

rewriteディレクティブで、リクエストが /sitemap.xml.gz(|\/) に一致した時、
リクエストを /var/www/app_name/current/public/sitemap.xml.gz に書き換える。

break で脱出して終了。

この書き方の場合、書き換えた後もlocationディレクティブにマッチするので、
breakしないと無限ループするので必ずbreak。

robots.txtに対するアクセスも同様に記述することができる。
そして、両方合体させて次のように書ける。

location ~ ^/(sitemap\.xml\.gz|robots\.txt) {
  root /var/www/app_name/current/public;
  rewrite ^\/sitemap\.xml\.gz(|\/)$ /sitemap.xml.gz break;
  rewrite ^\/robots\.txt(|\/)$ /robots.txt break;
}

public直下のディレクトリ対するアクセス設定

この設定がないとスタイルシートとかJavaScriptが読み込まれなくなるし、
アップロードした画像とかsystemディレクトり配下に突っ込まれるファイルも読めなくなる。

こちらの設定はとても分かりやすく、次のようにすれば良い。

location ~ ^/(assets|system)/ {
  root /var/www/rails/point-hisshoho/current/public;
}

locationディレクティブの正規表現にマッチしたディレクトリは、
rootディレクティブをrootディレクトリとする。

2年おきくらいに新しいアプリケーションサーバーとウェブサーバー出てきてそろそろ勘弁。

Apatch+Passengerの時代が設定超簡単でマジ平和だった。。