Bueno, como dije en el anterior post, voy a explicar como integrar Rails con Apache, para que sea éste nuestro servidor Web. El servidor de Rails WEBrick (ejecutando script/server en el directorio de nuestra aplicación de Rails) cumple su función, sobre todo es útil para el desarrollo, pues muestra mucha información. Pero para un entorno real, no puede competir con un servidor web "de los de verdad" (estarÃa bien respaldar ésto con números, para otro dÃa que me aburra...). Otra opción serÃa usar Rails con lighttpd, ésto lo he visto mucho por la red, y parece dar buenos resultados, pero como Apache es mucho Apache, prefiero usarlo
.
Seguiré desde el HowTo anterior, es decir, tenemos una aplicación básica en ~/dev/rails la cual al final de este tutorial será servida a los clientes mediante apache. Supongo que estamos usando Ubuntu Dapper, para otra distro serÃa todo perfectamente aplicable, pero habrÃa que cambiar, posiblemente, algunos de los binarios/directorios/archivos/nombres_de_paquetes por otros ligeramente diferentes. Intentaré ir explicando las cosas de la forma más generica posible... ok, entonces ¿qué necesitamos para poder servir aplicaciones RoR con apache?
- Mod_rewrite (para apache)
- Mod_fcgid (para apache)
- fcgid en nuestro sistema
- Modulo fcgid para ruby
- Configurar apache, añadiendo un virtualhost (o un Directory + Alias)
Vayamos por partes, como dijo Jack el destripador. Mod_rewrite lo tendrás casi 100% seguro, a no ser que hayas compilado apache indicandole que no quieres ese modulo. ¿Cómo sabemos que lo tenemos?
$ /usr/sbin/apache2 -l # [el binario de apache] -l
Compiled in modules:
core.c
(...)
mod_alias.c
mod_so.c
$ ls /etc/apache2/mods-enabled/ # aquà aparecerán los módulos activos
Debe de salir en uno de esos dos comandos, si lo tienes instalado de los repositorios de ubuntu, saldrá en mods-enabled
.
Mod_fcgid para apache, ok. Instalemoslo o si eres un autentico macho ibérico que compila todo, compila tu apache con este modulo!. Para el resto de mortales, simplemente esto:
$ sudo aptitude install libapache2-mod-fcgid
$ sudo /etc/init.d/apache2 force-reload
$ more /etc/apache2/mods-enabled/fcgid.conf # ahora tendremos estos dos ficheros, este
AddHandler fcgid-script .fcgi
SocketPath /var/lib/apache2/fcgid/sock
$ more /etc/apache2/mods-enabled/fcgid.load # y este!
LoadModule fcgid_module /usr/lib/apache2/modules/mod_fcgid.so
Ahora instalemos fcgi en nuestro sistema como librerÃa compartida, podemos hacer un aptitude search fcgi para ver paquetes candidatos, en el caso de Ubuntu Dapper, simplemente:
$ sudo aptitude install libfcgi0
Ahora solo nos queda por instalar el modulo fcgi para ruby, para ello hacemos un:
$ sudo aptitude install libfcgi-ruby1.8 # o la que nos corresponda
Ahora hagamos la prueba definitiva, para saber si todo va bien:
$ irb
irb(main):001:0> require 'fcgi.so'
=> true
irb(main):002:0> require 'fcgi'
=> true
Muy bien!, ya tenemos todo preparado, ahora configuremos apache!. Haré la configuración con un Virtualhost, pues lo veo más cómodo (pero se podrÃa hacer también con un "Directory" más un alias). Añadimos a la configuración de apache lo siguiente:
$ sudo vi /etc/apache2/sites-available/default # en dapper, serÃa en este fichero
<VirtualHost *> ServerName rails DocumentRoot /home/blaxter/dev/rails/public/ ErrorLog /home/blaxter/dev/rails/log/apache.log <Directory /home/blaxter/dev/rails/public/ > Options ExecCGI +FollowSymLinks AllowOverride all Allow from all Order allow,deny </Directory> </VirtualHost>
$ sudo vi /etc/hosts # añadimos un linea como esto:
127.0.0.1 rails
$ sudo /etc/init.d/apache2 force-reload # reiniciamos apache
Debes cambiar /home/blaxter/dev/rails por la ruta de tu aplicación rails!.
Ahora debemos hacer un par de cosas antes de dejar todo listo. Primero borrar las sesiones actuales
$ cd ~/dev/rails # dir de nuestra aplicación
$ rm tmp/sessions/* # es importante hacer esto, hazlo!
luego permitir al servidor leer y escribir en nuestra aplicación, Apache corre como usuario www-data, una forma de permitirle leer los archivos y escribir (concretamente debe escribir en ./tmp/*), serÃa poner el proyecto con nombre de usuario www-data y luego añadirnos a nosotros como miembro de www-data, esta es una opción, puede haber cientas, dependiendo del sistema de cada uno...
$ chown www-data:www-data -R . # apache corre como usuario www-data
$ sudo vigr # modificamos la linea de www-data, si tenÃamos algo como esto:
www-data:x:33:
la modificamos a algo como esto:
www-data:x:33:blaxter
Ahora, ya para finalizar, solo nos queda modificar el .htaccess, concretamente ~/dev/rails/public/.htaccess, que debe quedar asÃ:
Options +FollowSymLinks +ExecCGI
RewriteEngine On
#####################################
# Si configuramos la aplicacion con un Directory mas un alias tipo
# Alias /rails /home/blaxter/dev/rails/public
# DeberÃamos descomentar la siguiente linea
# RewriteBase /rails
#####################################
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]ErrorDocument 500 "Application error. Rails application failed to start properly"
Ok, todo hecho. Ya solo queda entrar a http://rails/ o http://rails/adminDeCosas o http://rails/prueba y todo funcionará!. Además podremos ver el log en ~/dev/rails/log/apache.log
. Suerte!
Ruby es un lenguaje de script similar a 
