Help us understand the problem. What is going on with this article?

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした