Installation des paquets

J'utilise une Ubuntu Server, je vais donc passer par apt-get pour installer les paquets nécessaires, vous adapterez donc les commandes en fonction de votre distribution.

Allons-y , installons Nginx et la librairie FastCGI. Nous allons également installer Lighttpd qui propose un utilitaire bien pratique pour la gestion des processus FastCGI :

apt-get install nginx lighttpd libfcgi0ldbl
update-rc.d -f lighttpd remove

Vous noterez que nous avons retiré Lighttpd des services à démarrer automatiquement puisque de toute façon nous allons utiliser Nginx comme serveur HTTP.

Mise en place du démarrage automatique des services

Nous allons créer un script d'init qui va se charger de relancer les processus fastcgi à chaque fois que la machine redémarrera, nous créons donc un fichier /etc/init.d/fastcgi

Voici le code qu'il contient :

#!/bin/bash
 
COMMAND=/usr/bin/spawn-fcgi
ADDRESS=127.0.0.1
PORT=9000
USER=www-data
GROUP=www-data
PHPCGI=/usr/bin/php5-cgi
PIDFILE=/var/run/fastcgi-php.pid
RETVAL=0
 
case "$1" in
    start)
      $COMMAND -a $ADDRESS -p $PORT -u $USER -g $GROUP -f $PHPCGI -P $PIDFILE
      RETVAL=$?
  ;;
    stop)
      killall -9 php5-cgi
      RETVAL=$?
  ;;
    restart)
      killall -9 php5-cgi
      $COMMAND
      RETVAL=$?
  ;;
    *)
      echo "Usage: fastcgi {start|stop|restart}"
      exit 1
  ;;
esac      
exit $RETVAL

Il nous faut ensuite rendre ce script exécutable et demander son exécution au démarrage de la machine :

chmod u+x /etc/init.d/fastcgi
update-rc.d fastcgi defaults

Configuration de FastCGI pour Nginx

Nous devons nous assurer qu'un certain nombre de paramètres seront passés à FastCGI par Nginx pour que tout fonctionne correctement, nous allons donc créer un nouveau fichier de conf /etc/nginx/fastcgi.conf qui contient :

fastcgi_intercept_errors on;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 300;
fastcgi_buffer_size 32k;
fastcgi_buffers 32 32k;
fastcgi_busy_buffers_size 32k;
fastcgi_temp_file_write_size 32k;
 
fastcgi_index index.php;
 
fastcgi_param SCRIPT_NAME       $fastcgi_script_name;
 
fastcgi_param QUERY_STRING      $query_string;
fastcgi_param REQUEST_METHOD    $request_method;
fastcgi_param CONTENT_TYPE      $content_type;
fastcgi_param CONTENT_LENGTH    $content_length;
 
fastcgi_param REQUEST_URI       $request_uri;
fastcgi_param DOCUMENT_URI      $document_uri;
fastcgi_param DOCUMENT_ROOT     $document_root;
fastcgi_param SERVER_PROTOCOL   $server_protocol;
 
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE   nginx/$nginx_version;
 
fastcgi_param REMOTE_ADDR       $remote_addr;
fastcgi_param REMOTE_PORT       $remote_port;
fastcgi_param SERVER_ADDR       $server_addr;
fastcgi_param SERVER_PORT       $server_port;
fastcgi_param SERVER_NAME       $server_name;
 
fastcgi_param REDIRECT_STATUS   200;

Configuration du virtual host

Nous n'avons plus maintenant qu'à configurer notre virtual host Nginx. Nous créons donc /etc/nginx/sites-available/blog qui contient le code suivant :

server {
	listen 80;
	server_name  bounga.org www.bounga.org;
 
	root   /home/prod/www/blog;
        index  index.html index.htm index.php;
 
	error_log  /var/log/nginx/blog.errors.log error;
 
	# On redirige toutes les requêtes sur les alias vers notre nom de domaine principal
	if ($host != "www.bounga.org") {
          rewrite ^(.*)$ http://www.bounga.org$1 permanent;
        }
 
        # On s'assure que les fichiers statiques seront servis directement sans traitement particulier
        location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|flv)$ {
          access_log off;
          expires 30d;
          break;
        }
 
        # On empêche l'accès aux .htaccess
        location ~ /\.ht {
          deny all;
        }
 
        # Le vrai travail commence ici
	location / {
            access_log  /var/log/nginx/blog.access.log;
 
            set $good_path_info "";
 
            # On récupére le bon path_info qui va permettre à DotClear d'utiliser les ré-écritures en mode PATH_INFO
            if ($uri ~ "^(/.*)") {
              set $good_path_info  $1;
            }
 
            # Si on se toruve dans l'espace admin, il ne faut pas modifier cette variable (pas de ré-écriture dans l'admin)
            if ($uri ~ "^/admin.*") {
              set $good_path_info "";
            }
 
            # On inclut nos paramètres FastCGI communs
            include /etc/nginx/fastcgi.conf;
 
            # On inclut nos paramètres FastCGI spécifiques à DotClear
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO          $good_path_info;
 
            # Redirige toutes les requetes sur des pseudos fichiers (URL rewrite) vers index.php pour traitement
            if (!-e $request_filename) {
              rewrite . /index.php break;
            }
       }
}

Lancer les serveurs

On peut maintenant activer notre vhost, lancer Nginx et les processus FastCGI pour que notre application soit accessible

cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/blog 
 
/etc/init.d/fastcgi start
/etc/init.d/nginx restart

Et voilà, le tour est joué, votre blog DotClear est accessible et peut utiliser le PATH_INFO. J'ai pour ma part noté une amélioration impressionnante du nombre de req/s possible, une baisse de la consommation mémoire et CPU depuis mon passage a Nginx.

J'espère que ces informations pourront vous être utiles.