Cómo configurar un Vhost para una app hecha en Ruby on Rails

De Departamento de Informatica
Saltar a: navegación, buscar

Contenido

Introducción

Para poder hacer deploying de nuestra aplicación web podemos usar los servicios provistos por apache + passenger o nginx + passenger.

Para contextualizar un poco daremos una pequeña definición de lo que es apache y passenger.

  • Apache es un servidor web HTTP de código abierto para plataformas Unix-like (BSD, GNU/Linux, etc.), Windows, Macintosh y otras, que implementa el protocolo HTTP/1.1 y la noción de sitio virtual.
  • Phusion passenger es un servidor web y servidor de aplicaciones libres con soporte para Ruby, Python y Node.js. Está diseñado para integrarse con el servidor Apache HTTP o el servidor web nginx. Phusion Passenger es compatible con sistemas operativos tipo Unix, y está disponible como gema, tarball , o como paquetes nativos de Linux .

A continuación explicaremos paso a paso como se puede levantar una aplicación hecha en Ruby on Rails usando apache + passenger y la solución a algunos problemas comunes.

Contenido

Instalación

  • Primero que nada debemos instalar nuestro framework Ruby on Rails y Apache, esto se hace desde la terminal utilizando dnf :
 sudo dnf install ruby  
sudo dnf install ruby-devel
sudo dnf install rubygem-rails
  • Luego para poder instalar Apache tenemos que ejecutar en nuestra terminal lo siguiente:
 sudo dnf install httpd 

Para que el servidor inicie cada vez que iniciamos la máquina:

 sudo systemctl enable httpd.service 

Para iniciar el servidor:

 sudo systemctl start httpd.service 

En este punto, al entrar a la página por la IP deberías poder ver la página test de Apache.

  • Finalmente nos queda por instalar passenger, el que actúa como puente entre la aplicación de Ruby on Rails y Apache,

para esto es recomendable instalarlo via dnf:

 sudo dnf install passenger 
 sudo dnf install mod_passenger 

También es posible instalarlo como gema de la siguiente forma:

 sudo gem install passenger 
  • Una vez instalado passenger, debemos correr el módulo de Passenger para Apache (puede tardar unos minutos, pero en algún momento termina):
 sudo passenger-install-apache-module 

Al finalizar la instalación del módulo, passenger pedirá copiar unas líneas desde la terminal al archivo del virtual host, ubicado en /etc/httpd/conf/httpd.conf.

Una buena práctica, es mantener los archivos del VirtualHost separados del archivo de configuración de Apache, esto es, mantenerlos en /etc/httpd/conf.d, pero esto lo haremos un poco más adelante.

Tras completar la instalación del módulo, la documentación oficial recomienda verificar:

 sudo passenger-config validate-install 

Finalmente, verificamos si Apache está corriendo el módulo:

 sudo passenger-memory-stats 

Configuración del VirtualHost

Primero se debe ver cuál versión de Ruby es la que va a usar Passenger, en el caso de que existan múltiples versiones corriendo en el sistema. Para esto ejecutamos:

passenger-config about ruby-command 

El que entregara algo similar a esto:

 Command: /usr/local/rvm/gems/ruby-2.2.3/wrappers/ruby 
  Version: ruby 2.2.3p85 (2015-02-26 revision 49769) [x86_64-linux] 
  ...

La ruta que viene a continuación de “Command” ( en este caso usr/local/rvm/gems/ruby-2.2.3/wrappers/ruby es la que usaremos).

Ahora debemos crear el archivo del VirtualHost:

 nano /etc/httpd/conf.d/nombre-del-vh.conf 

y copiamos lo siguiente:

 <VirtualHost *:80> 
     ServerName yourserver.com 
     #Indicar los dns de la página 
     ServerAlias    
     # Indicar la ruta de la carpeta public del proyecto
     DocumentRoot /var/www/myapp/code/public 
     #La ruta conseguida en el paso anterior
     PassengerRuby /path-to-ruby 
     PassengerEnabled on 
     <Directory /var/www/myapp/public>
        Allow from all 
        Options -MultiViews 
        Require all granted 
     </Directory> 
 </VirtualHost>


Donde debemos reemplazar yourserver.com, por la ip o dominio de nuestro servidor, la ruta /var/www/myapp/code, por la ruta donde tendremos alojada la carpeta de nuestro proyecto ( aunque se considera una buena práctica tener nuestro proyecto en /var/www/ ) y el /path-to-ruby por la ruta obtenida anteriormente.

Finalmente para aplicar los cambios reiniciamos el servidor de apache :

 sudo systemctl restart httpd 

Migración del VirtualHost a la carpeta conf.d

Como se mencionó anteriormente, es una muy buena práctica mantener los archivos del VirtualHost separados del archivo de configuración de Apache, por temas de portabilidad. Para esto, debemos crear un nuevo archivo que contenga la configuración Passenger que habíamos copiado en httpd.conf ( esto es opcional) junto con nuestro VirtualHost y dejarlo en la carpeta /etc/httpd/conf.d. Además, para evitar problemas y dolores de cabeza debemos verificar que el archivo de configuración de Apache esté referenciando los archivos que están en la carpeta conf.d. Para esto, basta con verificar que la siguiente línea esté descomentada:

 IncludeOptional conf.d/*.conf 

Problemas comunes

Cada vez que surgen problemas ya sea con apache o passenger lo primero que se debe hacer es apoyarse de la información entregada por los logs, ya que con estos se puede identificar de manera más rapida que es lo que esta fallando y cual es la causa del problema. Por lo general el log de apache es bastante completo, podemos acceder a él de la siguiente forma:

nano /var/log/httpd/error_log 

Problema con los permisos de la carpeta /var/www/myapp

Uno de los principales problemas a la hora de hacer funcionar passenger + apache + RoR tiene que ver con los permisos de las carpetas, con esto nos referimos a que apache pueda ingresar a los archivos de /var/www/myapp, que es donde debemos tener nuestro proyecto. Por defecto, el contenido de la carpeta /var/www pertenece al usuario:grupo root:root. Sin embargo, Apache, por temas de seguridad, no corre como root y Passenger corre como nobody:nobody. Para solucionar este problema, debemos cambiar los permisos de la carpeta cambiando al dueño y al grupo al que pertenece.

Para chequear los permisos de la carpeta, es decir, ver quién es el dueño y al grupo que pertenece, cambiamos al directorio en cuestión, y ejecutamos:

 ls -la 

si nuestra salida es algo similar a esta:

 drwxr-xr-x  3 root root     4096 ene 12 22:57 www/ 

Sabemos que nuestro problema es con los permisos. Para solucionar esto basta con cambiar los permisos con el siguiente comando:

 sudo chown -R apache:apache ./var/www/myapp 

Al ejecutar el comando anterior y al darle la orden -R indicamos que sea recursivo, por lo tanto se cambiará el permiso de la carpeta myapp y a todas las carpetas subyacentes.

Una vez hecho esto apache no debería tener problemas para poder acceder las carpetas y apache debería ser capaz de levantar nuestra aplicación.

Problemas con la ruta root definida routes.rb

Otro posible error, es que passenger NO reconozca la ruta root de nuestra aplicación y solo muestre un index con los archivos que están en la carpeta public del proyecto, y no la página principal. Para corregir esto, basta con poner un redirect hacia la página principal en el VirtualHost:

   RedirectMatch 301 ^/$ /vista_principal

Referencias

Solution to Passenger running as user 'nobody' and group 'nobody
Deploying a Ruby app on an AWS production server
Versión 2.4 de la documentación del Servidor de HTTP Apache

Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Herramientas