Nginx で Rails の assets (css, js) にアクセスできない(403 forbidden が返る)

More than 5 years have passed since last update.


はじめに

Rails を勉強中に遭遇したトラブルを共有します。

環境はインフラは、Amazon Web Services (AWS) の EC2 をつかっており、ミドルウェアの構成は、


  • Nginx

  • Unicorn

  • Rails4

という標準的な構成です。


development では動くのに、production では動かない

Rails4 のデフォルトの設定ですが、assets pipeline という仕組みがあり、development 環境だと、*.scss*.coffee動的に それぞれ *.css*.js にコンパイルされますが、production 環境だと動的にコンパイルされない設定になっています。パフォーマンスに関わるからでしょう。

その設定は以下のファイルに記述されています。


confit/environments/production.rb

  # Do not fallback to assets pipeline if a precompiled asset is missed.↵

config.assets.compile = false

true にすれば動的にコンパイル処理されますが、このままの設定だとブラウザから *.css*.js が存在しないため、画面が正しく表示されないということになります。

つまり明示的に事前にコンパイルする処理が必要になります。以下のコマンドです。

[ec2-user@ip-172-31-XX-XX ]$ bundle exec rake assets:precompile

assets フォルダをのぞくと、以下のようにファイルが生成されています。

ちなみに、AWS の EC2 のデフォルトユーザ(ec2-user)で操作しています。

[ec2-user@ip-172-31-XX-XX ]$ ls public/assets/

application-76ac9a7ed8a05f788622d3fe675b9102.js application-7f4b68e9fcf9a838875e83826b286ad3.css bootstrap
application-76ac9a7ed8a05f788622d3fe675b9102.js.gz application-7f4b68e9fcf9a838875e83826b286ad3.css.gz manifest-8e0f1c0f6279be01674f398420ac273c.json

こんな複雑なファイル名ですが、assets pipeline の仕組みで application.html.erb が動的にこれらのファイルを示すようになっています。

よし、これでOKと思ったら・・・。


assets (css, js) にアクセスできない(403 forbidden)

まず 403 forbidden の前に、nginx 経由で assets フォルダにアクセスしようとする場合は、nginx.conf に明示的にその設定をする必要があります。

    server {

listen 80;
server_name localhost;
#root /usr/share/nginx/html;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;

location ~ ^/assets/ {
root /home/ec2-user/rails_app/public; # 明示的にこれを追加
}

location / {
proxy_pass http://app;

}
:
:

これでブラウザからアクセスができます。

しかし私の場合、どうやら 403 forbidden が返っているようでした。

これはアクセスはできているが、許可されていないということになります。

色々調べた結果、ec2-user のホームディレクトリのパーミッションが rwx------ つまり 700 であることがわかりました。nginx ユーザ からアクセスできなかったことになります。

そこで、Others に実行権限を与えました。

[ec2-user@ip-172-31-XX-XX ]# chmod 701 /home/ec2-user

をして無事解決しました。