Having used Apache with Mongrel, Thin and Passenger, I’ve now moved on to Unicorn. Setting up Apache on Ubuntu to proxy to Unicorn requires the following installation commands:
apt-get install apache2 -y apt-get install libapache2-mod-proxy-html libxml2-dev -y a2enmod headers a2enmod proxy a2enmod proxy_http a2enmod proxy_balancer a2enmod rewrite a2enmod ssl /etc/init.d/apache2 restart
With these modules in place a virtual host can be configured something like this:
<VirtualHost *:80> ServerName myhost.example.com DocumentRoot /opt/example/app/public RewriteEngine On # Redirect all non-static requests to unicorn RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f RewriteRule ^/(.*)$ balancer://unicornservers%{REQUEST_URI} [P,QSA,L] <Proxy balancer://unicornservers> Allow from any BalancerMember http://127.0.0.1:8080 </Proxy> </VirtualHost> <VirtualHost *:443> ServerName myhost.example.com DocumentRoot /opt/example/app/public RewriteEngine On # Redirect all non-static requests to unicorn RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f RewriteRule ^/(.*)$ balancer://unicornservers%{REQUEST_URI} [P,QSA,L] RequestHeader set X-Forwarded-Proto "https" <Proxy balancer://unicornservers> Allow from any BalancerMember http://127.0.0.1:8080 </Proxy> SSLEngine on SSLCertificateFile /etc/apache2/ssl/ssl.crt SSLCertificateKeyFile /etc/apache2/ssl/ssl.key </VirtualHost>
mod_headers and the RequestHeader directive are useful if the Rails app is using ssl_requirement.