Installation de NGINX / Passenger pour vos applications Ruby On Rails sous Debian 5
Chose promises, chose due, ici, vous allez retrouver, toute l'installation et la configuration de NGINX pour vos applications en Ruby On Rails.
NGINX, c'est quoi concrètement ?
NGINX est un service de pages Web. Il a pour réputation d'être plus rapide (en terme de réponse) que son homologue Apache 2. Il a également la faculté d'être moins gourmant en CPU et en Mémoire. Je vous invite à consulter les différents benchmarks pour vous faire votre propre idée.
NGINX n'a pas seulement des avantages, en effet, c'est une solution multiplateforme et rempli pleins de fonctions que ne seront pas incluses dans ce tutoriel. Mais par exemple, il faut "bidouiller" un petit peu pour activer les services CGI-BIN. Il faut créer soit même le fichier "service" dans /etc/init.d/. Non, loin de moi de vous proposer la solution ultime bling-bling en terme de service Web, tout dépendera de votre environnement d'accueil, il se pourra que Apache 2 corresponde plus à vos attentes.
Ce qu'il vous faut
- Un environnement Debian
- Ruby Entreprise Edition d'installé sur votre machine (Si ce n'est pas fait, je vous invite à lire mon billet à ce sujet)
- Une connexion Internet (Comme vous êtes arrivés ici, ça ne devrait pas poser de problème :D)
- Un clavier
On retrousse ses manches et on y va !
Récupération d'NGINX
Après vous êtres logué sur votre environnement Debian, on va commencer par récupérer la dernière version stable (ou unstable) d'NGINX.
Comme, on est pas des couche tard (*sic*), et qu'on a pas envie de refresh le bugzilla toute la nuit pour corriger la petite feature qui nous manque, on va prendre la version stable. Pour se faire, rien de plus facile, un petit WGET fera l'affaire.
wget http://sysoev.ru/nginx/nginx-0.7.62.tar.gz tar -zxvf nginx-0.7.62.tar.gz
Installations d'NGINX et du module passenger-nginx.
Une fois décompressé, on se dirige vers REE, et on lance le binaire d'installation des modules passenger pour NGINX.
Si vous avez suivi mon tutorial d'installation de REE, il est dans /opt/ree/, sinon, si vous avez fait ça à là "j'y vais comme un porc, je verrai après), je vous invite à faire fonctionner vos méninges pour vous souvenir du PATH.
sudo /opt/ree/bin/passenger-install-nginx-module
Choississez l'option numéro 2 (No: I want to customize my Nginx installation. (for advanced users), permettant ainsi d'inclure le module SSL dans l'installation d'NGINX.
3 petites questions viennent à nous.
Please specify the directory: /votre/repertoire/contenant/les/sources/nginx-0.7.62 Please specify a prefix directory [/opt/nginx]: /opt/nginx Extra arguments to pass to configure script: --with-http_ssl_module
Une fois compilé, voilà, vous êtes l'heureux possesseur d'un service NGINX sur votre Debian, après avoir daemonisé NGINX, il vous restera l'étape la plus difficile, la configuration.
Daemonisation d'NGINX
Lancer NGINX en mode console, c'est pas très pratique pour un environnement de production :D Alors, pour mettre NGINX en tant que démon de la machine, il faut suivre les instructions suivantes.
Éditer en mode super utilisateur le fichier /etc/init.d/nginx et copier le contenu suivant :
#! /bin/sh # Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and # run 'sudo update-rc.d nginx defaults', or use the appropriate command on your # distro. # # Author: Ryan Norbauer <ryan.norbauer@gmail.com> # Modified: Geoffrey Grosenbach http://topfunky.com set -e PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/nginx/ DESC="nginx daemon" NAME=nginx DAEMON=/opt/nginx/sbin/$NAME CONFIGFILE=/opt/nginx/conf/nginx.conf PIDFILE=/opt/nginx/logs/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME # Gracefully exit if the package has been removed. test -x $DAEMON || exit 0 d_start() { $DAEMON -c $CONFIGFILE || echo -n " already running" } d_stop() { kill -QUIT `cat $PIDFILE` || echo -n " not running" } d_reload() { kill -HUP `cat $PIDFILE` || echo -n " can't reload" } case "$1" in start) echo -n "Starting $DESC: $NAME" d_start echo "." ;; stop) echo -n "Stopping $DESC: $NAME" d_stop echo "." ;; reload) echo -n "Reloading $DESC configuration..." d_reload passenger_pool_idle_time 0 echo "reloaded." ;; restart) echo -n "Restarting $DESC: $NAME" d_stop # One second might not be time enough for a daemon to stop, # if this happens, d_start will fail (and dpkg will break if # the package is being upgraded). Change the timeout if needed # be, or change d_stop to have start-stop-daemon use --retry. # Notice that using --retry slows down the shutdown process somewhat. sleep 1 d_start echo "." ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2 exit 3 ;; esac exit 0
Une fois ceci fait, il vous suffit de rendre executable /etc/init.d/nginx
sudo chmod +x /etc/init.d/nginx
Et voilà, maintenant, (et après configuration), vous serez en mesure de faire des commandes du type
sudo /etc/init.d/nginx start sudo /etc/init.nginx stop etc...
Configuration d'NGINX pour votre application Ruby On Rails
On va supposer que vous avez une application Ruby On Rails dans /var/www/masuperappli et que vous vouliez la diffuser via le service NGINX.
Pour se faire, on va configurer NGINX pour qu'il aille servir nos pages dans /var/www/masuperappli/public
TIP Avant toute chose, je vous conseille fortement de sauvegarder votre fichier de configuration initial. ;-)
Edition du fichier /opt/nginx/conf/nginx.conf
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { passenger_root /opt/ruby-enterprise-1.8.7-20090928/lib/ruby/gems/1.8/gems/passenger-2.2.5; passenger_ruby /opt/ruby-enterprise-1.8.7-20090928/bin/ruby; include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name ledomaine.demasuperappli.com; root /var/www/masuperappli/public; passenger_enabled on; #charset koi8-r; #access_log logs/host.access.log main; # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ .php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ .php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /.ht { # deny all; #} } }
D'une manière généralement, voilà comment est hiérarchisé le fichier de configuration d'NGINX.
<conf> # Configuration générale basé sur le fonctionnement d'NGINX # Nombre de processus maitre # Emplacement des fichiers logs # etc.. <events> # Nombre de processus esclave </events> <http> # Paramètres généraux # Inclusion de modules pour NGINX (ex : passenger) # Emplacement des fichiers logs <server> # Definition du port d'écoute pour le serveur en question # Définition du nom d'hôte (VirtualHost) </server> </http> </conf>
En espérant que ce billet vous apportera bonheur et prospérité.
Mickaël ALLAIN.