読者です 読者をやめる 読者になる 読者になる

TakayukiKoyama Geek Blog

Create, Entertain, Experience

RailsのProduction環境でAssetsが通らなくて3時間詰まった話

 ApacheでのRails本番環境を構築するのは初めてなのでかなり詰まりました。

環境

Rails:4.1.1
Apache
Unicorn
・さくらVPS 1G

 サーバ環境は既にApacheを動かしていたのでPassengerで動かそうかなと思ってましたが、WEB+DB Press vol.70の@mirakuiさんの記事を読むと『1リクエストでメモリを多く消費し、レスポンスに数百ミリ秒以上かかるようなアプリケーションではUnicornが向いている傾向にあるようです。』と書いてあったのでUnicornにしました。

 実際は、ActiveRecordのN+1問題とかを最適化して100ミリ秒以上かかることはないですが、将来的にデータが増えたら100ミリ秒超える気がするのでUnicornにしてます。

本題

 ということでApache+UnicornでProduction環境を構築します。まず、ApacheでProxypassを設定して、unicornを以下のように実行しました(ポートは8888)。

unicorn -p 8888 -E production

 エラーはでないものの、ブラウザで開いてみると、JSとCSSが読み込まれずレイアウトがグチャグチャでした。これはよくある話のようで、config/environments/production.rbの『config.serve_static_assets = false』をtrueに変えれば表示されるのですが、trueにすると動的ではないJSとCSSのファイルを読み込むだけのために、毎回Unicornにアクセスしてしまい負荷が掛かります。

config.serve_static_assets = trueは非推奨

 なので、ApacheやNginxを使う場合は『config.serve_static_assets = false』にすることが推奨されています。しかし、falseにするとJSとCSSが読み込まれないので、Apacheから見に行くようにしないといけません。

 その前に、Assetパイプラインコンパイルしておく必要があるので、下記のコマンドを実行しました。

# rake assets:precompile

 で、問題となっていることは。

Unicornのログには特に細かいエラー内容は表示されていない。 ・ChromeのDeveloperToolsを見ると、JSとCSSとImageが403もしくは500のエラーになっていた。

 この時点で403に意識せずApacheが問題だろうと思い込み、http.confに色々と書き込みました。

/etc/httpd/conf/http.conf

ProxyPass /img/ !
ProxyPass /assets/ !
ProxyPass /images !
ProxyPass /stylesheets !
ProxyPass /javascripts !
ProxyPass /robots.txt !
ProxyPass /favicon.ico !

Alias /assets/ /home/user/app/to/path/public/assets/

ProxyPass / http://localhost:8888/
ProxyPassReverse / http://localhost:8888/

 そうしたら、とりあえず500エラーは解決しました。でも403エラーは解決せず。で、どうしたらいいんだとググりながら考えを巡らせていると、『よく考えたら403ってことはパーミッションが通ってないだけか』と気づいて、パーミッションをチェックしていたら、userディレクトリが実行権限を持ってなかったので403になっていいたようです。

# chmod 701 /home/user

 ということで解決しました。同様の問題を抱えていた人もいましたが、コメントにもある通り、実行ユーザを直せばそれで良かったような気がしたので、後で直そうと思います。

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

広告を非表示にする