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に置くような感じにした方がいいかもですが、今のところそんなにホスト名増やしたくないのでこんな感じで。

簡単にテストをしてる分には問題なく動いているようです。