Rapid’CGI PHP, nginx et NetBSD

Tags: , , ,
Add comments

Update

Le post ci-dessous est à considérer “historique”, car depuis pkgsrc-2012Q2, php-fpm est disponible en standard et se configure le plus aisemment du monde.


Il y a une foultitude de documentations sur la façon de faire tourner PHP via fastCGI sur un nginx, et à chaque fois, j’ai l’impression de lire des tambouilles copiées/collées de ci et de là. Ça cause de scripts (non portables la plupart du temps), de wrappers, et autres solutions capillotractées, et ça me plaît pas. En dépilant un peu, j’ai abouti à une solution que je trouve élégante… sous NetBSD evidemment :)

Tout d’abord, il s’agit de compiler PHP avec le support fastCGI, sans pollution avec le module CGI. Ceci est réalisé grâce au fichier /etc/mk.conf et la directive suivante:

PKG_OPTIONS.php=        -cgi fastcgi

Un make install clean plus loin, on peut s’assurer du support fastCGI d’un des binaires générés de cette façon:

$ /usr/pkg/libexec/cgi-bin/php -h|grep -i bind
  -b | Bind Path for external FASTCGI Server mode

Il existe dans pkgsrc un outil spécialement dédié à gérer ce type d’implémentation, il s’agit de www/spawn-fcgi, que nous installons donc sans hésiter. spawn-fcgi a le bon goût d’être controlé par le fichier /etc/rc.conf, ainsi, après avoir copié /usr/pkg/share/examples/rc.d/spawnfcgi dans le repertoire /etc/rc.d, on configure le logiciel de cette façon:

$ grep spawn /etc/rc.conf
spawnfcgi=YES
spawnfcgi_jobs="php"
spawnfcgi_php_command="/usr/pkg/libexec/cgi-bin/php"
spawnfcgi_php_args=""
spawnfcgi_php_user="nginx"
spawnfcgi_php_address="127.0.0.1"
spawnfcgi_php_port="9000"
spawnfcgi_php_children="3"

Attention toutefois, il existe un minuscule bug dans rc.d/spawnfcgi que j’ai signalé au mainteneur, voici le patch trivial à appliquer:

--- /usr/pkg/share/examples/rc.d/spawnfcgi      2011-07-24                      
12:57:38.000000000 +0200                                                        
+++ /etc/rc.d/spawnfcgi 2011-07-24 17:16:49.000000000 +0200                     
@@ -38,6 +38,7 @@                                                               
                job_user=$(eval echo \$${name}_${job}_user)                     
                job_cwd=$(eval echo \$${name}_${job}_cwd)                                       job_socket=$(eval echo \$${name}_${job}_socket)                 
+               job_port=$(eval echo \$${name}_${job}_port)                     
                job_socket_mode=$(eval echo \$${name}_${job}_socket_mode)       
                job_address=$(eval echo \$${name}_${job}_address)               
                job_children=$(eval echo \$${name}_${job}_children)

Update bon, on est jamais mieux servi que par soi-même toussa, j’ai donc corrigé le package dans pkgsrc current. Un ptit cvs up -dP -rHEAD et tout devrait rouler.
Nous pouvons alors démarrer spawnfcgi comme n’importe quel autre service:

$ sudo /etc/rc.d/spawnfcgi start

Et de constater:

$ ps axuww|grep php
nginx     795  0.0  0.8  26412  8012 ?       Is    5:16PM  0:00.17 /usr/pkg/libexec/cgi-bin/php 
nginx   18322  0.0  0.7  26412  7816 ?       Is    5:16PM  0:00.14 /usr/pkg/libexec/cgi-bin/php 
nginx   22540  0.0  0.8  26412  8012 ?       Is    5:16PM  0:00.18 /usr/pkg/libexec/cgi-bin/php 

Eeeeeexcellent Smithers.

Il ne reste alors plus qu’à configurer nginx pour qu’il passe à PHP en mode fastCGI les pages de script à interpréter:

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/user/www$fastcgi_script_name;
            include        /usr/pkg/etc/nginx/fastcgi_params;
        }

Il faudra evidemment prendre soin de remplacer /home/user/www par le chemin de votre documentroot. Il doit d’ailleurs certainement y avoir une variable pour s’épargner cela…

On oublie pas le petit phpinfo() qui va bien:

3 Responses to “Rapid’CGI PHP, nginx et NetBSD”

  1. philpep Says:

    La solution d’avenir c’est php-fpm: http://php-fpm.org (>= 5.3). Il tourne sur ma FreeBSD avec nginx depuis plus de 6 mois et j’ai jamais eu de problèmes et niveau performance pas besoin de voir les graphiques pour sentir la différence, suffit de cliquer ici ou là et pouf :)

  2. benoit Says:

    On oubliera pas le petit :

    try_files $uri =403;

    comme écrit dans le forum néginikse :

    http://forum.nginx.org/read.php?2,88845,page=3

  3. iMil Says:

    @philpep

    [~] uname -s
    NetBSD
    [~] pkg_info|grep ^php
    php-5.2.17nb3 PHP Hypertext Preprocessor version 5
    [~] pkgfind fpm
    [rien]

    Et j’ajoute que le serveur en question est utilisé par 2 personnes concurrentes maximum.

    Autrement, j’abonde dans ton sens, PHP-FPM est un très bon soft; il ne faut cependant pas se leurrer, si performant soit le backend, ni une socket UNIX ni une connexion TCP ne peuvent prétendre surpasser la rapidité d’un appel de fonction, un pointeur donc, sur une shared library (mod_php, donc).

Leave a Reply

WP Theme & Icons based on GlossyBlue by N.Design Studio
Banner from www.trynthlas.com
Entries RSS Comments RSS Log in
Performance Optimization WordPress Plugins by W3 EDGE