73
74

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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

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

73
74
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73
74

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?