Instalando mod_rails en debian, ahorrando RAM

by Gastón Ramos

Hace un tiempo que me enteré que existe mod_rails y que tengo ganas de implementarlo en mi vps (dónde está alojado el sitio de rubylit entre otros) El vps tiene 300 MB de RAM en total, y hasta ahora tenía nada más que 30MB libres ( cada instancia de mongrel me consumia unos 40MB aprox.)

Así que aquí vamos con la instalación de mod_rails.

Primero vamos a instalar Ruby Enterprise Edition cómo recomiendan los chicos de passenger (mod_rails), también podemos usar el ruby convencional.

Para esto nos bajamos el .tar.gz con los sources y lo descomprimimos:

wget -c http://rubyforge.org/frs/download.php/47937/ruby-enterprise-1.8.6-20081205.tar.gz
tar -xvvzf ruby-enterprise-1.8.6-20080810.tar.gz

Yo lo voy a instalar en /opt que es dónde se instalan los paquetes que no vienen con la distro entonces quedaría:

/opt/ruby-enterprise-1.8.6-20080810/

Instalamos las libs necesarias para compilar ruby EE:

apt-get install g++ zlib1g-dev libssl-dev build-essential

Al intentar instalarlo me tiró el siguiente error, pero leyendo algunos mails de la lista de Ruby EE recomendaban ejecutar el instalador de la siguiente manera:

cd /opt/ruby-enterprise-1.8.6-20080810/
./installer --no-tcmalloc

y funcionó…

Ahora tenemos que crear una serie de links simbólicos para que nos quede la versión de Ruby EE instalada correctamente:

ln -fs /opt/ruby-enterprise-1.8.6-20080810/ /opt/ruby-enterprise
ln -fs /opt/ruby-enterprise/bin/gem /usr/bin/gem
ln -fs /opt/ruby-enterprise/bin/irb /usr/bin/irb
ln -fs /opt/ruby-enterprise/bin/rake /usr/bin/rake
ln -fs /opt/ruby-enterprise/bin/rails /usr/bin/rails
ln -fs /opt/ruby-enterprise/bin/ruby /usr/bin/ruby
ln -fs /opt/ruby-enterprise/lib/ruby/ /usr/lib/ruby

Ahora instalamos la gema de mysql

apt-get install libmysqlclient15-dev

/opt/ruby-enterprise-1.8.6-20080810/bin/ruby /opt/ruby-enterprise-1.8.6-20080810/bin/gem install mysql

Ya tenemos instalado Ruby EE entonces ahora vamos a instalar mod_rails.

bajamos los sources de passenger:

wget -c http://rubyforge.org/frs/download.php/47928/passenger-2.0.5.tar.gz
tar -xvvzf passenger-2.0.5.tar.gz

Instalamos las lib necesarias para compilar:

apt-get install ruby-dev libopenssl-ruby rubygems  apache2-prefork-dev build-essential

Instalamos apache prefork:

apt-get install apache2-mpm-prefork

Ahora tenemos que instalar mod_rails:

cd /opt/passenger-2.0.5
./bin/passenger-install-apache2-module

luego editamos el archivo /etc/apache2/mods-available/passenger.conf
y ponemos lo soguiente:

PassengerRoot /opt/passenger-2.0.5
PassengerRuby /opt/ruby-enterprise-1.8.6-20080810/bin/ruby

editamos el archivo /etc/apache2/mods-available/passenger.load
y ponemos lo siguiente:

LoadModule passenger_module /opt/passenger-2.0.5/ext/apache2/mod_passenger.so

luego tenemos que activar el modulo entonces ejecutamos el siguiente comando:

a2enmod passenger

Listo ahora lo único que tenemos que hacer cada vez que agregamos una app
es agregar un virtual host en apache.
Editamos el archivo /etc/apache2/sites-available/nueva_app.com
y ponemos lo siguiente:

    <VirtualHost *:80>
    ServerName www.nueva_app.com
    ServerAlias nueva_app.com
    DocumentRoot /var/www/apps/nueva_app.com/public
    RailsBaseURI /
    CustomLog /var/log/apache2/nueva_app.com.log "%h %l %u %t \"%r\" %>s %b"
   </VirtualHost>

Como pueden ver puse el archivo de log separado del lo general de apache.
luego de esto habilitamos el nuevo virtual host

a2ensite nueva_app.com

y reiniciamos apache:

/etc/init.d/apache2 reload

y listo.

Ahora en mi vps tengo 165MB de RAM libres, así que la migración fue productiva, cabe destacar que tuve que migrar de nginx a apache entonces todos los virtual hosts (státicos y dinámicos) que tenía creados en nginx los tuve que migrar a apache, pero no fue algo complicado.