miércoles, 3 de febrero de 2010

Appliance Redmine+Apache+Phusion Passenger+Ruby Enterprise usando Ubuntu JeOS (4-Exprimiendo todavía más...)

En posts anteriores se ha visto cómo optimizar una máquina de VMware en menos de 5 minutos, cómo instalar Ubuntu JeOS (que no trae entorno gráfico) y manejarlo con Webmin, asi como las opciones más importantes a tocar para que no haga falta tocar el sistema.

También se ha visto de qué va Redmine y, usando el instalador de Bitnami, se ha creado un appliance listo para usar. Incluso se ha optimizado el appliance:
  • Usando servidores DHCP y DNS existentes para establecer la configuración del equipo en la red.
  • Haciendo que los ficheros que escribe residan en un share remoto Windows usando CIFS, facilitando el balanceo de la aplicación en caso de ser necesario.
  • Sacando la BD a otro servidor, con lo que la restauración del appliance se reduce a volver a levantar un backup de la máquina.
Y parece que va muy bien... Esto de Redmine funciona y parece que las mejoras, el soporte y los plugins aumentan cada día, incluso han sacado uno para Firefox.

Pues aplicando un poco de filosofía kaizen, el appliance montado en entradas anteriores es posible mejorarlo haciendo una instalación limpia (fresh install) de todos los componentes, pero esta vez desde su repositorio correspondiente para asegurarnos de tener una copia EXACTA y saber qué hemos puesto.

A fuerza de mirar esto de Ruby, he visto que hay una variante para trabajar desde Apache sin usar Mongrel: Phusion Passenger. Evita montar tanto cristo de instalación y es más fácilmente escalable y se recupera mejor ante fallos. Por otro lado he visto que la versión Enterprise de Ruby ofrece una mejora considerable en el uso de memoria, mejorando un 33% el rendimiento total (a mi incluso me parece mejor).

Pues ahora más, más rápido y desde las fuentes: se instala Ubuntu JeOS, se inicia sesión en consola y... (leer los comentarios ANTES de ejecutar cada instrucción):

# Instalar Servidor SSH (para usar consola remota yo uso Putty)
sudo apt-get install openssh-server

# Actualizar el sistema
sudo apt-get update && sudo apt-get upgrade -f -y --force-yes

# Instalar paquetes y dependencias necesarias
sudo apt-get install build-essential linux-headers-$(uname -r) apache2-threaded-dev subversion psmisc acpid wget perl libnet-ssleay-perl openssl libauthen-pam-perl libio-pty-perl libmd5-perl rdoc php5-imagick libmagick9-dev libopenssl-ruby libapr1-dev libaprutil1-dev libapache2-svn libapache-dbi-perl libapache2-mod-perl2 libdbd-mysql-perl libdigest-sha1-perl libapache2-mod-fcgid libfcgi-dev smbclient smbfs htop libmysqlclient15-dev apache2-threaded-dev libfcgi-dev libapr1-dev libaprutil1-dev git-core iptables cron at logrotate locate zip unzip -y --force-yes

# Instalar Webmin
wget http://prdownloads.sourceforge.net/webadmin/webmin_1.500_all.deb
sudo dpkg -i webmin_1.500_all.deb
rm webmin_1.500_all.deb
# Ojo al usuario/contraseña para webmin
sudo /usr/share/webmin/changepass.pl /etc/webmin root adminsq3
# Se accede a webmin por https://x.x.x.x:10000

# Instalar Ruby Enterprise
sudo wget http://rubyforge.org/frs/download.php/68718/ruby-enterprise_1.8.7-2010.01_i386.deb
sudo dpkg -i ruby-enterprise_1.8.7-2010.01_i386.deb
sudo rm ruby-enterprise_1.8.7-2010.01_i386.deb

# Instalar RubyGems
cd /opt
sudo mkdir gems
cd /opt/gems
sudo wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz
sudo tar -xzvf rubygems-1.3.5.tgz
sudo rm rubygems-1.3.5.tgz
cd rubygems-1.3.5
sudo ruby setup.rb -V
sudo ln -s /usr/bin/gem1.8 /usr/bin/gem

# Instalar Redmine
cd /var/www
# Opción SVN
sudo svn co http://redmine.rubyforge.org/svn/trunk redmine
# Opción GIT (comentada)
# sudo mkdir redmine
# cd redmine

# sudo git clone git://github.com/edavis10/redmine.git


# Instalar Gems requeridos
cd redmine
sudo gem install activesupport activerecord actionpack actionmailer activeresource gem_plugin fastthread rails rake rack passenger rmagick mysql reek roodi --no-ri --no-rdoc
sudo gem install rubyist-aasm --source http://gems.github.com --no-ri --no-rdoc
sudo rake rails:update

# Como se supone que tenemos "una" configuración funcionando que queremos migrar,
# copiamos los ficheros existentes database.yml y email.yml a /var/www/redmine/config/
# En caso contrario, copiar y modificar los de ejemplo:

# database.yml.example ==> database.yml

# email.yml.example ==> email.yml

# Puede ser necesario reaplicar los permisos dentro de Webmin (Otros==>Explorador de archivos). Se muestran los más permisivos:

# Generar session stores y limpiar
sudo rake config/initializers/session_store.rb
sudo rake tmp:cache:clear
sudo rake tmp:sessions:clear

# Crear/migrar/actualizar BD a la nueva versión (el programa escoge)
# Si genera la estructura de una nueva BD, se accede con admin/admin
sudo rake db:migrate RAILS_ENV=production

# Migrar/actualizar información de plugins
sudo rake db:migrate_plugins RAILS_ENV=production

# Reaplicar permisos R/W a /var/www/redmine (root:www-data) con Webmin

# Opcional, para ver que todo va bien, probar con WebBrick en http://x.x.x.x:3000/
sudo ruby script/server webrick -e production

Hasta aquí se ha conseguido dejar la máquina con Redmine operativo, pero vamos a exprimirlo un poco más modificando el fichero /etc/fstab e incluir la linea para mapear el share de Windows a la carpeta /var/www/redmine/files (ver entrada anterior). A continuación configuraremos Apache para poder servir aplicaciones Ruby con Phusion Passenger:

# Configurar Apache y optimizar opciones de Phusion Passenger
# (crear los siguientes ficheros):

# "redmine.conf" -> Ver http://snippets.dzone.com/posts/show/10071
# "passenger" -> Ver http://snippets.dzone.com/posts/show/10073
# "virtualhost_redmine.conf" -> Ver http://snippets.dzone.com/posts/show/10075

# Integramos Passenger con Apache (Ojo a las instrucciones en pantalla)
sudo passenger-install-apache2-module


# En Webmin:
# Eliminar servidor virtual por defecto.

# Quitar modulos (Global Configuration): perl php5 dav dav_svn

# Poner módulos
(Global Configuration): proxy proxy_balancer cache proxy_http rewrite mem_cache deflate expires passenger

# Plugins que merecen la pena. Algunos requieren un fichero de traducción alternativo (es) inexistente; he creado unos para poderlos ver correctamente:

cd /var/www/redmine

# Charts (Gráficos): http://github.com/mszczytowski/redmine_charts
sudo ./script/plugin install git://github.com/pullmonkey/open_flash_chart.git
sudo git clone git://github.com/mszczytowski/redmine_charts.git redmine_charts

# Exception handler (avisos por email): https://projects.littlestreamsoftware.com/projects/show/redmine-exception
# Traducción http://snippets.dzone.com/posts/show/10079
sudo ./script/plugin install git://github.com/edavis10/redmine-exception-handler-plugin.git

# Reports (informes): http://github.com/edavis10/redmine_reports
# Traducción http://snippets.dzone.com/posts/show/10077
sudo ./script/plugin install git://github.com/edavis10/redmine_reports.git

# Graphs: (Gráficos): http://github.com/bradbeattie/redmine-graphs-plugin
#
Traducción http://snippets.dzone.com/posts/show/10081
sudo ./script/plugin install git://github.com/bradbeattie/redmine-graphs-plugin.git

# Kanban (organizador):
http://theadmin.org/articles/2009/07/22/redmine-kanban-plugin/
#
Traducción http://snippets.dzone.com/posts/show/10083
sudo ./script/plugin install git://github.com/edavis10/redmine_kanban.git

# Migrar BD a la nueva versión
sudo rake db:migrate RAILS_ENV=production
# Actualizar información de plugins
sudo rake db:migrate_plugins RAILS_ENV=production

# Limpiar al final
sudo apt-get autoclean

# Reiniciar el appliance (única vez) para asegurarnos que
# monta bien el share CIFS automáticamente y que todo arranque bien.

# Abrir la página de Redmine en http://x.x.x.x


Con esto se ha pasado a usos de RAM de 100 Mb a 210 Mb como mucho (en producción), además de la mejora en velocidad. Junto con las optimizaciones que se han publicado en entradas anteriores, hacen que este appliance vaya como la seda.

Y no se tarda tanto en montarlo... ¿no?.

6 comentarios:

Anónimo dijo...

Un excelente tutorial, todo muy bien explicado

Paco Alcaide dijo...

A mi estan viniendo estupendamente todas tus explicaciones de este post y de otros anteriores.
Sinceramente, GRACIAS.

zer007 dijo...

He instalado redmine y me funciona con su propio servidor, ahora estoy intentando instalarlo con passenger y no hay manera. he llegado hasta el punto de tu tutorial
# Integramos Passenger con Apache (Ojo a las instrucciones en pantalla)
sudo passenger-install-apache2-module

En el siguiente no se como encontrar esos modulos en webmin, reinicio Apache y no se como acceder a mi pagina en local (http://127.0.0.1 ¿?)
Tengo instalado redmine en /home/redmine y he cambiado estos valores en redmine.conf, el archivo passenger lo he cambiado dejando solo las lineas de ruby enterprise y ponindo el directorio que toca (es otra version). Y sigue sin funcionar...

Podriais ayudarme por favor

zer007 dijo...

He heo lo que deciis y con passenger no funciona, he mirado el log de apache y me sale esto:

Tue Dec 21 17:22:15 2010] [notice] Apache/2.2.14 (Ubuntu) DAV/2 SVN/1.6.6 PHP/5.3.2-1ubuntu4.5 with Suhosin-Patch Phusion_Passenger/3.0.2 configured -- resuming normal operations
*** Exception Errno::ENOENT in spawn manager (No such file or directory - /var/www/config/environment.rb) (process 4041, thread #):
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/app_process.rb:66:in `read'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/app_process.rb:66:in `detect_framework_version'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/spawn_manager.rb:196:in `spawn_rails_application'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/spawn_manager.rb:132:in `spawn_application'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/spawn_manager.rb:275:in `handle_spawn_application'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/abstract_server.rb:357:in `__send__'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/helper-scripts/passenger-spawn-server:99
[ pid=4051 thr=140357041375040 file=ext/apache2/Hooks.cpp:863 time=2010-12-21 17:22:19.164 ]: Unexpected error in mod_passenger: Cannot spawn application '/var/www': The spawn server has exited unexpectedly.
Backtrace:
in 'virtual Passenger::SessionPtr Passenger::ApplicationPool::Client::get(const Passenger::PoolOptions&)' (Client.h:750)
in 'Passenger::SessionPtr Hooks::getSession(const Passenger::PoolOptions&)' (Hooks.cpp:297)
in 'int Hooks::handleRequest(request_rec*)' (Hooks.cpp:566)

*** Exception Errno::ENOENT in spawn manager (No such file or directory - /var/www/config/environment.rb) (process 4064, thread #):
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/app_process.rb:66:in `read'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/app_process.rb:66:in `detect_framework_version'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/spawn_manager.rb:196:in `spawn_rails_application'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/spawn_manager.rb:132:in `spawn_application'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/spawn_manager.rb:275:in `handle_spawn_application'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/abstract_server.rb:357:in `__send__'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously'
from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/helper-scripts/passenger-spawn-server:99

Por cierto redmine .conf he probado metiendolo en un directorio que he creado de nombre conf o metiendolo en conf.d y modificando virtualhost_redmine.conf
y de ninguna de las formas funciona.

Gracias y espero vuestra ayuda

AdminsQ3 dijo...

@zero007, creo que si tienes la carpeta de Redmine en /home/redmine, de alguna manera Passenger se lo espera en /var/www (así lo indica en los logs).

Cuando instalas Apache con
sudo passenger-install-apache2-module
aparecen en pantalla (consola) instrucciones para configurar Apache y las rutas que emplea. Luego la configuración la haces en Webmin ==> Servidores ==> Apache ==> Global configuration ==> Editar archivos de configuración ==> passenger.conf:

# Usando Ruby Enterprise
LoadModule passenger_module /opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/passenger-2.2.15/ext/apache2/mod_passenger.so
PassengerRoot /opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/passenger-2.2.15
PassengerRuby /opt/ruby-enterprise-1.8.7-2010.02/bin/ruby
PassengerDefaultUser apache

# Usando Ruby
#LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.15/ext/apache2/mod_passenger.so
#PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.15
#PassengerRuby /usr/bin/ruby1.8
#PassengerDefaultUser apache

Por por otro lado, yo lo tengo con Passenger 2.2.15, no he cambiado a la versión 3; desconozco si puede haber problemas.

¡Suerte!

zer007 dijo...

Ya he logrado instalarlo (al final he hecho un enlace al directorio www desde el que esta redmine) ahora lo unico que me queda es acceder sin carpeta, es decir sin localhost/redmine dino sencillamente con localhost.

Muchas gracias