Tracking Rails 3.1 and asset pipeline problems with Apache

ubuneu install apache module
sudo apt-get install libapache2-mod-xsendfile

#enki_apache_passenger.conf


LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
LoadModule passenger_module /usr/share/ruby-rvm/gems/ruby-1.8.7-p357/gems/passenger-3.0.11/ext/apache2/mod_passenger.so
#sudo apt-get install libapache2-mod-xsendfile
LoadModule xsendfile_module /usr/lib/apache2/modules/mod_xsendfile.so
PassengerRoot /usr/share/ruby-rvm/gems/ruby-1.8.7-p357/gems/passenger-3.0.11
PassengerRuby /usr/share/ruby-rvm/rubies/ruby-1.8.7-p357/bin/ruby

# PassengerMaxPoolSize 10

#ServerName www.yourhost.com
# DocumentRoot /var/www/enki/public
XSendFile On

RewriteEngine On

# AllowOverride all
# Options -MultiViews
# THIS IS REALLY IMPORTANT
XSendFilePath /var/www/enki

LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
LoadModule expires_module /usr/lib/apache2/modules/mod_expires.so

# Some browsers still send conditional-GET requests if there's a
# Last-Modified header or an ETag header even if they haven't
# reached the expiry date sent in the Expires header.
Header unset Last-Modified
Header unset ETag
# This required etag module to be enabled. Comment out
FileETag None
# RFC says only cache for 1 year
ExpiresActive On
ExpiresDefault "access plus 1 year"

If you have a module version < 0.10, add this to the virtual host config that needs to send files:

XSendFile On
XSendFileAllowAbove On

This allows any file path (not only those below your VHost root) to be sent through X-Sendfile, which is sort of bad practice. You can either live with it or compile a newer version of the module.

If you got a module version >= 0.10 you can whitelist the allowed paths instead:

XSendFile On
XSendFilePath /opt/www/awesome-project

Migrating my blog over to Rails 3.1 beta

# Enable the asset pipeline
config.assets.enabled = true

config/environments/development.rb (remove or comment out the following line)

#config.action_view.debug_rjs             = true

config/environments/production.rb (add these lines)

# Compress both stylesheets and JavaScripts
config.assets.js_compressor  = :uglifier
config.assets.css_compressor = :scss

mkdir app/assets
git mv public/images app/assets/images
git mv public/javascripts app/assets/javascripts
git mv public/stylesheets app/assets/stylesheets

Finally, in your production environment, don’t forget to statically generate your compiled assets with this Rake task:

RAILS_ENV=production bundle exec rake assets:precompile

It will create files such as these:


public/assets/application-2a8947193a591b79c885c52fbc6b01d3.css