Tutoriel Vidéo Nginx Ruby on Rails Héberger Rails avec nginx et Passenger

Télécharger la vidéo

Un des problème que l'on rencontre avec Ruby on Rails c'est le manque d'informations concernant l'hébergement d'une application. Il existe bien des solutions sur le cloud mais les prix sont prohibitifs pour une petite application. Une solution est donc d'héberger notre application sur notre propre serveur dédié.

Pour ce tutoriel nous allons utiliser une machine debian 7. Si vous souhaitez expérimenter avec cette installation je vous conseille de commencer sur une machine virtuelle (pour la casser sans risque ^^)

Avant d'aller plus loin assurez vous que votre liste de dépôt est à jour et que votre système est à niveau :

sudo apt-get update
sudo apt-get upgrade

Ruby : installation de RVM

La première étape est l'installation de Ruby, nous utiliserons ici rvm pour gérer plusieurs version de ruby.

sudo \curl -sSL https://get.rvm.io | bash -s stable

La commande rvm n'est pas immédiatement disponible et il faudra lancer le script rvm pour le rendre disponible

source ~/.rvm/scripts/rvm

Enfin on peut choisir la version de ruby à installer. Pour connaitre les différentes version disponible on utiliser la commande rvm list known

rvm install 2.1

Maintenant que l'on a installé ruby 2.1.X on peut enfin installer rails sur notre serveur. On utilisera l'argument --no-document pour ne pas installer la documentation (car ça met des plombes...)

gem install rails --no-document

La base de donnée : MySQL

Dans mon cas l'application que je souhaite mettre en ligne utilise une base de donnée mysql. Avant de pouvoir faire un coup de bundle install il me faut d'abord installer mysql.

sudo apt-get install mysql-server mysql-client libmysqlclient-dev

La librairie libmysqlclient-dev permet de compiler la gem mysql2.
Pendant cette installation un mot de passe vous sera demandé pour l'administrateur root (mettez quelque chose d'impossible à deviner ^^).

Vous pouvez ensuite vous connecter à votre serveur mysql pour créer une nouvelle base.

mysql -uroot -p
mysql> CREATE DATABASE masuperbase;
mysql> exit

Pour plus de sécurité il est conseillé de créer une nouvel utilisateur n'ayant accès qu'à cette base de donnée.

mysql> GRANT ALL PRIVILEGES ON masuperbase.* To 'masuperbase'@'localhost' IDENTIFIED BY 'monmotdepasse';

Une fois que vous avez configuré votre base vous pouvez mettre à jour la configuration database.yml de rails et lancer un

bundle install

Essayez de lancer votre application en utilisant rails s pour vérifier que tout fonctionne correctement. Il faut parfois changer un peu les permissions pour que l'installation marche.

sudo chmod -R 777 RAILS/tmp
rails s
# Si l'application se lance et fonctionne
# vous pouvez continuer ^^

Le serveur HTTP : nginx

Pour gérer les requêtes HTTP nous allons utiliser nginx avec le module passenger. Contrairement à apache il n'est pas possible de charger des modules à la volée et il faudra donc compiler passenger avec nginx mais rassurez vous on peut télécharger une version précompilée depuis phusion passenger.

On met à jour la liste de nos dépôt avec ceux de phusion passenger. Ces lignes sont issus de la documentation. Si vous utilisez une autre version de Linux que debian 7 merci de vous y référer.

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
sudo apt-get install apt-transport-https ca-certificates
sudo vi /etc/apt/sources.list.d/passenger.list
# On ajoute la ligne
# deb https://oss-binaries.phusionpassenger.com/apt/passenger wheezy main
sudo chown root: /etc/apt/sources.list.d/passenger.list
sudo chmod 600 /etc/apt/sources.list.d/passenger.list
sudo apt-get update

Maintenant que la liste des dépôts est à jour on peut télécharger nginx précompilé avec un simple apt-get.

sudo apt-get install nginx-extras passenger

nginx devrait démarrer automatiquement (si ce n'est pas le cas, un petit coup de sudo service nginx start devrait faire l'affaire.

Si vous vous rendez sur l'ip de votre serveur vous devriez voir une page d'accueil nginx. Si c'est le cas nginx est bien installé.

Configuration de nginx avec passenger

Pour faire fonctionner passenger sur nginx il va falloir décommenter 2 instructions dans la conf d'nginx se situant dans /etc/nginx/nginx.conf

passenger_root ....
passenger_ruby /usr/bin/ruby

Au passage le chemin de ruby n'est pas le bon, il faut le faire pointer vers la version que l'on a installé avec rvm. Pour connaitre ce chemin il vous suffit de le demander à passenger.

passenger-config --ruby-command

Cette commande vous donnera un dossier semblable à HOME/.rvm/gems/ruby-2.1.3/wrappers/ruby, vous devez copier ce chemin et rééditer le fichier nginx.conf pour le mettre dans passenger_ruby.

passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
passenger_ruby $HOME$/.rvm/gems/ruby-2.1.3/wrappers/ruby

Enfin, si votre installation de ruby utilise des variables d'environnement il faut les définir dans ce fichier de conf. Dans mon cas le fichier secret.yml de mon installation de rails a besoin d'une clef SECRET_KEY_BASE. Si vous souhaitez ajouter des variables de configuration, il vous suffit d'utiliser la commande env au tout début de votre fichier nginx.conf

env SECRET_KEY_BASE="chaine_aleatoire"

Configurer le server {} nginx

Maintenant que passenger est configuré on va pouvoir passer à la dernière étapes, la configuration du server. nginx stocke les différentes configuration dans un dossier sites-available. Nous allons directement modifier la configuration de base mais vous pouvez tout à fait en créer une nouvelle.

sudo vi /etc/nginx/sites-available/default

Je vous donne ici la configuration la plus basique possible, vous devrez ensuite l'améliorer.

server {

    listen 80;

    # Pointer le dossier public de votre app
    root RAILS/public;
    passenger_enabled on;

    server_name localhost votredomaine.com;
}

Vous pouvez redémarrer nginx pour prendre en compte toutes les modifications.

sudo service nginx restart

On va ensuite se "brancher" sur le log d'erreur pour voir en live tout ce qui peut poser problème

tails -n100 -f /var/log/nginx/error.log

Vous pouvez maintenant vous connectez à votre application en utilisant l'ip de votre serveur ou avec votre nom de domaine si il est correctement configuré.

Remarques

Quelques remarques avant de nous quitter. Les assets ne sont pas automatiquement disponible et il faudra les precompiler lors de la mise en prod de votre application.

rake assets:precompile

Enfin, si vous faites des modifications sur votre application elles ne sont pas automatiquement appliquées (on est pas sur PHP ^^). Mais rassurez vous, vous n'avez pas à tout redémarrer. Passenger écoute un fichier tmp/restart.txt, dès que ce fichier change de date de modification, votre application rails est automatiquement rechargée.

touch RAILS/tmp/restart.txt

Vous pouvez même concevoir un petit bouton dans votre backoffice pour mettre à jour ce fichier, comme ça vous n'aurez plus besoin de vous connecter au serveur.