unicornをApacheで動かす
メモ。
unicornは本家がnginxを勧めてることもあってか、リバースプロキシとして使っているWebサーバはnginxの例が多いようです。とはいえ、慣れたApacheを使いたいとか、すでにApacheで動いてるものがあるとかの場合、Apacheだけで何とかしたいです。という場合の例。
unicorn側は普通に設定。ただしUNIX domain socketが使える気がしないのでTCPで。
rails_env = ENV['RAILS_ENV'] || 'production' worker_processes 3 preload_app true timeout 30 listen 8888, :tcp_nopush => true 【以下略】
Apache側のhttpd.conf(というかdebianならsites-available/以下)は以下のような感じになります。静的ファイルはApache側で、それ以外はunicorn側に渡しています。
<VirtualHost *:80>
ServerAdmin webmaster@example.com
ServerName www.example.com
DocumentRoot /path/to/railsapp/current/public
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
LogLevel warn
CustomLog /var/log/apache2/www-example-access.log combined
ErrorLog /var/log/apache2/www-example-error.log
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /images !
ProxyPass /stylesheets !
ProxyPass /javascripts !
ProxyPass /robots.txt !
ProxyPass /favicon.ico !
ProxyPass / http://localhost:8888/
ProxyPassReverse / http://localhost:8888/
</VirtualHost>基本的にはPassengerを使ったときと同じような感じで、DocumentRootにはcurrent/publicに指定しています(あ、capistranoを使ってます。なのでcurrent)。
違う点はProxyPassで、/imagesや/stylesheetsなどをApache側で処理するために、「!」を指定してプロキシしないようにしています。
本当はpathで判断するよりは、静的ファイルはstatic.example.comに置くような感じにした方がいいかもですが、今のところそんなにホスト名増やしたくないのでこんな感じで。
簡単にテストをしてる分には問題なく動いているようです。
- 参考: 「Apacheのリバースプロキシで特定のパスをプロキシしない。」 http://d.hatena.ne.jp/takuya_1st/20100511/1273577034