はじめに
Rails を勉強中に遭遇したトラブルを共有します。
環境はインフラは、Amazon Web Services (AWS) の EC2 をつかっており、ミドルウェアの構成は、
- Nginx
- Unicorn
- Rails4
という標準的な構成です。
development では動くのに、production では動かない
Rails4 のデフォルトの設定ですが、assets pipeline という仕組みがあり、development 環境だと、*.scss
や *.coffee
は 動的に それぞれ *.css
、*.js
にコンパイルされますが、production 環境だと動的にコンパイルされない設定になっています。パフォーマンスに関わるからでしょう。
その設定は以下のファイルに記述されています。
# 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
をして無事解決しました。