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