Aujourd’hui, chers lecteurs, je fais tourner un projet symfony sur un hébergement gandi (trés bonne offre, au demeurant). Et comme je suis pauvre (pour être précis, disons que je suis radin), j’ai pris l’offre minimale, c’est à dire 1/64ème d’une machine physique.
Alors, mon pauvre bout de serveur avec ses 256Mo de ram, comme il se trimbale un apache, un mysql, un exim, et un solr avec le JRE que va bien derrière, forcément, il tire un peu la langue. Et mon site, lui, se traine.
Comme tout radin qui se respecte, plutôt que de payer plus cher un hébergement plus approprié, j’ai d’abord essayé d’alléger tout ça. Et pour commencer, j’ai voulu tester un remplaçant d’apache nommé nginx.
Nginx (ça se prononce engineX, parait-il) est un serveur http + reverse proxy codé spécifiquement pour servir des sites à fortes charges. Depuis sa naissance, il est de plus en plus utilisé.
Cet article reprendra l’installation d’nginx avec symfony, et puis en bonus, quelques tests de charge.
L’installation
Les tutos sur l’installation ne manquent pas (cf. les sources à la fin). Je vais quand même reprendre ça ici, histoire d’avoir quelques chose de centralisé. Le système est une debian lenny.
aptitude install nginx lighttpd php5-cgi update-rc.d -f lighttpd remove
Quelques explications : notre installation nécessite que php tourne en mode cgi. Et nous aurons besoin d’un script particulier fourni avec lighttpd. Nous aurions pu le récupérer de manière plus optimale, mais je le répète, je suis un fainéant.
Nous allons créer un script de démarrage pour le script en question.
vi /usr/bin/php-fastcgi #!/bin/sh /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi vi /etc/init.d/init-fastcgi #!/bin/bash PHP_SCRIPT=/usr/bin/php-fastcgi RETVAL=0 case "$1" in start) $PHP_SCRIPT RETVAL=$? ;; stop) killall -9 php RETVAL=$? ;; restart) killall -9 php $PHP_SCRIPT RETVAL=$? ;; *) echo "Usage: php-fastcgi {start|stop|restart}" exit 1 ;; esac exit $RETVAL ### fin du fichier chmod 755 /usr/bin/php-fastcgi chmod 755 /etc/init.d/init-fastcgi /etc/init.d/init-fastcgi start update-rc.d init-fastcgi defaults
Et voilou. Occupons nous de la conf nginx.
vi /etc/nginx/sites-available/monprojet server { # en prime, redirection vers le www server_name monprojet; rewrite ^(.*) http://www.monprojet.com$1 permanent; } server { listen 80; server_name www.monprojet.com alias monalias; access_log /var/log/nginx/monprojet.access.log; location / { root /var/www/monprojet/web/; index index.php; if (-f $request_filename) { expires max; break; } if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") { rewrite ^(.*) /index.php last; } } location /sf/ { root /usr/share/php/data/symfony/web/; expires max; } location ~ \.php($|/) { set $script $uri; set $path_info ""; if ($uri ~ "^(.+\.php)(/.+)") { set $script $1; set $path_info $2; } fastcgi_pass 127.0.0.1:9000; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME /var/www/monprojet/web$script; fastcgi_param PATH_INFO $path_info; } } ## Fin du fichier rm /etc/nginx/sites-enabled/default ln -s /etc/nginx/sites-available/monprojet /etc/nginx/sites-enabled/ /etc/init.d/nginx start update-rc.d nginx defaults
C’est prêt. Vous devriez pouvoir accéder à votre projet via l’url que vous avez configuré.
Quelques tests de charge
J’avais prévu de vous donner en pâture quelques tests de charge, mais d’autres ont déjà fait le boulot. Je vous laisse consulter leur travail.
Conclusions et références
En conclusion, nginx ne fera pas des miracles, mais pour une installation de base, ses perfs sont légérement meilleures que celles d’apache. Alors pourquoi s’en priver ?
http://spindrop.us/2008/01/20/nginx-and-symfony/
http://www.howtoforge.com/nginx_php5_fast_cgi_xcache_ubuntu7.04


Un Commentaire
Il manque la ligne `fastcgi_param SCRIPT_NAME $script;`dans le bloque php
cf : http://wiki.nginx.org/NginxSymfony