Configuration de Nginx pour DotClear en mode PATH_INFO
Par Bounga le vendredi, 6 février 2009, 11:11 - Documentations - Lien permanent
J'ai très récemment décidé de switcher du couple Apache / Mongrel à Nginx / Thin pour mes applis Rails, les différences de performance sont visibles à l'oeil nu et les ressources utilisées (mémoire et CPU) ont été très largement réduites. Un vrai bonheur !
Sur ma lancée, j'ai décidé de migrer également mon blog pour pouvoir me séparer d'Apache. Mon blog, comme vous le savez peut-être, tourne sous DotClear en mode PATH_INFO ce qui permet d'avoir des URLs plus élégantes.
J'ai donc voulu partager avec vous mon expérience et vous propose une documentation sur la mise en place d'un DotClear en mode PATH_INFO avec Nginx.
Voici ma petite recette qui semble très bien fonctionner (surtout depuis la ré-écriture complète de la config suite aux problèmes liés à l'espace d'administration).
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.
Commentaires
l'url d'admin de dotclear
nomdedomain/admin/ ne fonctionne pas. on doit forcer le http://nomdedomain/admin/auth.php
location ~ \.php(/|$) {
include fastcgi_params; set $path_info ""; if ($uri ~ \.php/.) { set $path_info $uri; } fastcgi_param PATH_INFO $path_info;}
fonctionne mieux que le fastcgi_parms PATH_INFO request_uri; il evite le rewrite nom de domaine.
il y a aussi ds le php.ini la variable cgi.fix.path_info = 1 au lieu du 0
sans oublié le fastcgi_parms HTTPS on; quand on veut utiliser le https pour se connecter sur l'admin dotclear.
@aldo : Merci beaucoup Aldo ! Tu m'enlèves un épine du pied, je cherchais depuis des semaines !
voila la soluce qui marche dans tout les cas:
php.ini mettre le cgi.fix.path_info à 1.
et ce petit morceaux de code sans rewrite:
location ~ \.php($|/) {
set $good_script $uri; set $good_path_info "";if ($uri ~ "^(.+\.php)(/.+)") { set $good_script $1; set $good_path_info $2; }fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$good_script; fastcgi_param SCRIPT_NAME $good_script; fastcgi_param PATH_INFO $good_path_info; }quelques astuces:
location ~* ^.+.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$
{
access_log off;
}
location ~* ^.+.(css|swf)$
{
access_log off;
}
location ~ /\.ht {
deny all; }besoin de rien d'autre pas de fastcgi_params include non plus.