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.

Vus : 1127
Publié par Mickaël : 9