Embauchez-moi

Je suis freelance ! Besoin d'un professionnel du développement web ? Pourquoi ne pas me passer un coup de fil ?

Plus d'infos sur… http://thibault.jouannic.fr

mots-cles : Ingénieur web freelance Symfony eZ Publish Solr

Faire tourner Symfony sous nginx

Highway Insomnia
Creative Commons License photo credit : Nrbelex

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

  1. Posté le 14/12/2010 à 20:58 | Permalien

    Il manque la ligne `fastcgi_param SCRIPT_NAME $script;`dans le bloque php

    cf : http://wiki.nginx.org/NginxSymfony