Installation de ruby on rails sur debian etch avec apache et mod_rails

La version 4 de Debian (etch) ne propose dans ses paquets stables qu'une très vieille version de ruby, la 1.8.5. Bien que cette dernière fonctionne avec Rails, pour tirer meilleur parti de la dernière version 2.1 du framework, on va installer la 1.8.6.
On regarde ici : ftp://ftp.ruby-lang.org/pub/ruby/1.8/ pour connaitre le dernier patch de la 1.8.6. A titre d'exemple, au jour de la rédaction de cet article, c'est 1.8.6-p287, qui sera le source que nous téléchargerons.

Installation de ruby et de rubygems

La procédure est tirée de ce snippet. On procède en deux étapes : d'une part l'installation du langage ruby lui-même, d'autre l'installation du gestionnaire de paquets ruby -l'équivalent du CPAN pour perl-, nommé rubygems. Un paquet ruby est appelée une gemme.

On installe d'abord tout l'attirail pour compiler, télécharger les sources, plus les client mysql et sqlite3 et deux trois librairies intéressantes pour la suite

sudo aptitude install ssh gcc sudo build-essential make git-core subversion -y
sudo aptitude install bash man-db cron wget lynx bind9 -y
sudo aptitude install mysql-server mysql-client libmysqlclient15-dev libmysql-ruby sqlite3 imagemagick -y

si on est sur un vserver, on prendra soin immédiatement de dire à mysql d'écouter sur l'adresse IP du vserver plutôt que sur localhost :
sudo nano /etc/mysql/my.cnf
bind-address = x.x.x.x
Puis on télécharge et on compile ruby
wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p287.tar.gz   (
# attention : il faut peut-être faire un export ftp_proxy="http://runcache.univ-reunion.fr:8080/" pour sortir !
# évidemment, on remplace ruby-1.8.6-p287 par la version choisie sur ftp.ruby-lang.org
tar xfz ruby-1.8.6-p287.tar.gz
cd ruby-1.8.6-p287
./configure --prefix=/usr/local
sudo make
sudo make install
Deuxième étape : on passe à la récupération et à la compilation de rubygems.
Pas besoin ici, d'aller chercher la toute dernière version. En effet, depuis la version 0.9 de rubygems, le gestionnaire sait se mettre à jour tout seul ensuite par la commande "gem update --system".
cd /usr/src
wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz
# toujours la même chose : on pensera à avoir la variable http_proxy de son environnement à jour export http_proxy="http://runcache.univ-reunion.fr:8080/"
tar xfz rubygems-1.2.0.tgz
cd rubygems-1.2.0
sudo ruby setup.rb
sudo gem update --system
A partir de là, ruby 1.8.6 et son gestionnaire de paquets sont installés.
On peut vérifier :
ruby -v
gem -v

Installation de rails

Rails est tout bêtement une gemme de ruby.
L'installation est donc immédiate (ça prend un certain temps) et on vérifie ensuite :

sudo gem install rails
rails -v


Il est judicieux, pour utiliser mysql, d'utiliser le pilote compilé afin d'améliorer les performances :

sudo gem install mysql

Par défaut, les applications Rails iront chercher la socket de mysql dans /tmp/mysql.sock. Donc, soit il faut le changer dans chaque fichier de conf database.rd ou database.yml dans chaque appli, soit plus simplement :
ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
# vérifier les droits

Installation d'apache

Rails est livré avec un petit serveur web intégré nommé webrick. Webrick est suffisant pour le développement, mais pas pour une vraie application en production.
Il existe plusieurs façons de déployer Rails derrière un serveur web, dont voici quelques unes :
  • rails derrière un serveur apache en fcgi (méthode classique des hébergeurs, pas la plus stable)
  • rails servi par un serveur mongrel (ou un cluster de mongrels) derrière un frontal apache (permet le load balancing, mais plus compliqué à mettre en place)
  • rails servi par un serveur thin (ou plusieurs) derrière un frontal nginx (solution la plus performante et stable, à voir dans un autre tuto à écrire)
  • une combinaison différente des deux points précédents entre mongrel/thin et apache/nginx/lighttp
  • rails servi directement par apache avec passenger mod_rails : déploiement ultra-simple, vélocité de mongrel ou lighttp, mais latence de redémarrage de fcgi

On fait le choix de la dernière option : apache2 + mod_rails

Installation d'Apache :

sudo apt-get install apache2
Ensuite, on suit la procédure d'installation de mod_rails. Passenger est tout simplement une gemme ruby (attention, il faudra avoir un make installé) :
sudo gem install passenger
sudo passenger-install-apache2-module
Et on suit les instructions :
Par exemple, l'installeur, nous signale qu'il a besoin de OpenSSL pour ruby et des headers de développement pour Apache et il explique comment les installer :
sudo apt-get install apache2-prefork-dev
On n'installe pas via apt libopenssl-ruby car les paquets debian ne correspondent pas à la version compilée du langage. On va donc compiler la librairie openssl téléchargée avec le source :
cd $HOME/ruby-1.8.6-p287/ext/openssl
sudo ruby extconf.rb
make
sudo make install
On reprend donc :
sudo passenger-install-apache2-module
Cette fois, ça passe et on obtient :
The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.3/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.3
PassengerRuby /usr/local/bin/ruby

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

Press ENTER to continue.
Suivi de
Deploying a Ruby on Rails application: an example

Suppose you have a Ruby on Rails application in /somewhere. Add a virtual host
to your Apache configuration file, and set its DocumentRoot to
/somewhere/public, like this:

<VirtualHost *:80>
ServerName www.yourhost.com
DocumentRoot /somewhere/public
</VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips and other useful information:

/usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.3/doc/Users guide.html

Comme demandé, on copie dans /etc/apache2/apache.conf les trois lignes suivantes (attention à copier/coller les lignes données par l'installeur, les chemins peuvent différents de l'exemple cité ci-dessous selon votre installation) :

# mod_passenger
   LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.3/ext/apache2/mod_passenger.so
   PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.3
   PassengerRuby /usr/local/bin/ruby

Reste donc à faire le virtual host pour votre application : tutoriel. Et relancer apache : /etc/init.d/apache2 restart

Attention :

- par défaut, mod_rails est déployé pour l'environnement de production de rails. Si vous voulez pointer sur l'environnement de déploiement, il faut ajouter dans la conf du vhost Apache l'option :
RailsEnv development

- si les styles et les images ne s'affichent pas, peut-être que la conf apache est trop restrictive. Dans ce cas, on peut aussi ajouter dans le vhost, ce type de bloc :

<Directory "/somewhere/public">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>

Ensuite, une fois que l'application est codée, il suffit d'ajouter un fichier restart.txt dans le répertoire tmp de l'appli pour permettre à l'application de redémarrer sans avoir à redémarrer le serveur.

touch /path/to/app/tmp/restart.txt


Petits réglages à vérifier :

Si ça ne fonctionne pas bien, on peut toujours voir pourquoi dans /var/log/apache2/error.log

Par exemple : s'assurer qu'apache fait bien tourner mod_rewrite : a2enmod rewrite , suivi de /etc/init.d/apache2 force-reload

doc de mod_passenger en ligne
Comments