Installation d’un environnement de production pour ruby on rails
Comment installer proprement un serveur de production pour des applications en ruby on rails, en utilisant le moins de ressources possibles, de la manière la plus fiable et pérenne qu’il soit. (Sur un serveur sous une distribution linux Debian ou autre descendants comme Ubuntu.)
Note : Ce qui va suivre a été testé sour Ubuntu TLS 8.40
Installation de ruby entreprise
Tout d’abord, pourquoi ruby entreprise ?
Ruby entreprise est simplement un interpréteur ruby et tout ce qu’il y a autour, qui a été modifié sur certains points critiques notamment le système d’allocation mémoire et de ramasse miettes de façon à l’adapter à l’utilisation que l’on a de ruby dans un environnement de production d’une application en ruby on rails où les processus ruby restent lancés très longtemps, et la quantité de mémoire utilisée est une donnée critique. Des outils de profilage de l’utilisation de la mémoire vive par ruby ont aussi été ajoutés ainsi que d’autres outils de débuggage des performances.
Au final ruby entreprise c’est ruby, mais qui utilise 33% de RAM en moins et qui est sensiblement plus rapide, et qui supporte très bien les très longues périodes d'exécutions.
L’installation
Les sources sont bien entendu disponibles sur le site internet du projet, ce projet étant open source. (même si dans son nom «Entreprise» peut faire peur) Ils proposent aussi deux package pour Ubuntu, l’un pour une architecture 32 bits et l’autre pour du 64bits.
Je vous conseille d’utiliser ces packages, c’est fiable, pret pour un environnement de production solide comme un rock.
Il suffit de télécharger le packet correspondant à l'architecture de la machine cible sur le site du projet http://www.rubyenterpriseedition.com/download.html (Onglet Ubuntu Linux)
Note : Pour installer le .deb il suffit d’effectuer un :
sudo dpkg -i nomdupacket.deb
Si vous n'êtes pas sous Ubuntu, téléchargez le code source et suivez les consignes qu'il contient. Vous pouvez aussi essayer de trouver un packet pour votre distribution. Mais il y a peu de chance qu'il soit à jour.
Par ailleurs, il n’y a pas de crainte sur les conséquences de l’installation de ruby entreprise sur votre ancienne installation de ruby si il en existe une. Les deux versions cohabitent parfaitement, et il sera facile de décider plus loin la quelle des deux versions nous allons utiliser pour servir notre application ruby on rails.
Installation du serveur web
Quel serveur web utiliser ?
Mon choix s’oriente sur nginx pour de multiples raisons :
- La première c’est qu’il est lèger, il n’a pas un héritage du passé douloureux comme apache, il est programmé d’une manière novatrice qui fait qu’il utilise vraiment intensément les architectures multi processeurs.
- Deuxièmement il est très approprié pour servir des applications en ruby on rails parce qu’il est fortement intégré avec le module que nous allons utiliser pour exécuter l’application rails (ce module étant fortement intégré avec ruby entreprise par ailleurs)
- Troisièmement, ce choix d’nginx est celui qui a été fait par de nombreux sites programmés en ruby on rails, pour ne nommer que eux, 37signals, l’entreprise qui a fait naître ruby on rails l’utilise.
- Quatrièmement nginx c’est Russe, c’est fiable, robuste, solide, bref c’est fait pour durer
l’installation
Il faut commencer par installer le gem du module qui nous permettra d’exécuter des applications ruby on rails sur le serveur web, ce module s’appelle passenger.
Attention, il faut l’installer avec le ruby-gem de l’installation de ruby entreprise, les gems entre une éventuelle installation de ruby standart et une installation de la version entreprise ne sont pas partagés, il faut utiliser le ruby gem de chaque installation pour installer le gem dans la version de ruby souhaitée.
Quelques dépendances de Passager à installer :
sudo apt-get install build-essential libssl-dev zlib1g-dev
Essentiellement les fichiers de développement et la lib openssl dans la quelle il prend sa fonction md5. Ainsi que la compression Zlib dont il a besoin avec son système gzip intégré.
Maintennant que nous avons les dépendances, nous pouvons lancer l’installation de passenger.
sudo /usr/local/bin/gem install passenger
sudo passenger-install-nginx-module
Une fois les explications affichées dans le terminal pressez entrée pour débuter l’installation. Le programme effectue des vérifications sur les dépendances nécessaires à l’installation. Puis propose deux choix,
1. Yes: download, compile and install Nginx for me. (recommended)
2. No: I want to customize my Nginx installation. (for advanced users)
Nous selectionnerons le premier, de facon a ce que l’installeur s’occupe de tout. Par contre cela n'installera pas le module SSL.
A un moment le script demandera dans quel dossier installer nginx
--------------------------------------------
Where do you want to install Nginx to?
Please specify a prefix directory [/opt/nginx]:
Je vous conseille de laisser ce dossier, à moins que vous avez une raison valable de faire autrement.
Configuration
Si vous avez laissé le dossier par défaut comme dossier d'installation d'nginx, le fichier de configuration se trouve dans /op/nginx/config/nginx.conf
L'installeur modifie (normalement) automatiquement la configuration en ajoutant ces deux lignes dans la section http de la configuration d'nginx. La première passenger_root donne le chemin vers le dossier racine de l'installation de passager à utiliser. La seconde la version de ruby à utiliser, c'est la que l'on peut choisir si on veut utiliser ruby entreprise ou non. Il est vivement recommandé d'utiliser ruby entreprise. (c'est d'ailleurs ainsi que l'installeur aura automatiquement renseigné la ligne).
http {
passenger_root /[......]/gems/passenger-2.2.8;
passenger_ruby /[.....]/usr/bin/ruby;
}
Ensuite il faudra ajouter une directive serveur, qui correspond donc à une application ruby on rails. Vous devez faire pointer root vers le dossier public de votre application. Attention à ne pas oublier les point-virgules à la fin des lignes. Et supprimer la directive serveur d'exemple.
server {
listen 80;
server_name votrenomdedomaine; # Sera le nom virtuel sur le quel le serveur écoutera (donc plusieurs directive serveur avec des server_name diffèrent c'est Ok
root /somewhere/public; # Doit pointer vers le dossier public de l'application ror
passenger_enabled on;
}
Choses importantes sur la sécurité :
- Le processus de nginx sera possédé par l'utilisateur donné à la directive user en haut du fichier de config. (laisser #user nobody commenté c'est très bien, c'est le paramètre par défaut.)
- L'application ruby on rails sera lancée par l'utilisateur qui possède le fichier environnement.rb, si ce utilisateur n'existe pas sur le système, l'utilisateur qui exécute nginx en sera le possesseur. (donc nobody par défaut)
Tester
Maintennant il suffit de lancer nginx :
sudo /opt/nginx/sbin/nginx
Pas d'inquiétude à le lancer en root, ensuite qui prendra le bon utilisateur comme pocesseur. Et gardera un processus superviseur en root. Glaner sur internet un script d'init.d peut être intéressant.
Et voila normalement votre environnement de production est opérationnel.
Administration
Pour relancer une application ruby on rails il suffit de modifier/créer le fichier /tmp/restart.txt a la racine de l'application.
Oubliez pas que par défaut les logs de nginx sont dans /opt/nginx/logs/ ça risque de rapidement prendre beaucoup de place.
Julien.N
Merci de me contacter avant d'utiliser ailleurs ce contenu.