Nginx : FastCGI PHP par socket UNIX
- Mercredi 18 mars 2009
- Publié dans Administration . BSD . Hébergement
- Par Boris HUISGEN
- Ecrire
L’exécution de scripts PHP avec le serveur Web Nginx s’effectue par le biais du module FastCGI. Ce module assure la liaison entre Nginx et un interpréteur PHP par socket UNIX ou TCP (ce dernier cas permet une exécution sur un serveur distinct). L’utilitaire spawn-fcgi fourni avec le serveur Lighttpd assure le lien entre FastCGI et les interpréteurs PHP ; il ouvre la socket et préloade un ou plusieurs interpréteurs php-cgi.
Dans le cas où votre serveur Nginx est en place avec son module FastCGI, il vous reste à créer le script de lancement des interpréteurs PHP. Voici le mien, fcgi-php.sh, qui s’appuie sur une socket UNIX, afin de traiter localement les scripts PHP :
#!/bin/sh
# Boris HUISGEN <bhuisgen@hbis.fr>
# - convert to use UNIX socket support
# - force socket permissions
PROVIDES=php-cgi
SPAWN_FCGI=/usr/local/bin/spawn-fcgi
PHP_CGI=/usr/local/bin/php-cgi
PHP_CGI_CHILDREN=4
SOCKET=/tmp/fcgi-php.sock
SOCKET_USER=www
SOCKET_GROUP=www
SOCKET_PERMS=600
# script
cmd=$1
pcgi_start() {
echo "Starting $PROVIDES..."
$SPAWN_FCGI -s $SOCKET -u $SOCKET_USER -g $SOCKET_GROUP -f $PHP_CGI -C $PHP_CGI_CHILDREN
chown $SOCKET_USER:$SOCKET_GROUP $SOCKET
chmod $SOCKET_PERMS $SOCKET
}
pcgi_stop() {
echo "Stopping $PROVIDES..."
killall $PROVIDES
rm $SOCKET
}
pcgi_restart(){
pcgi_stop
pcgi_start
}
pcgi_status() {
[ -S $SOCKET ] && echo "$PROVIDES running" || echo "$PROVIDES NOT running"
}
pcgi_help() {
echo "Usage: $0 {start|stop|restart|status}"
}
case ${cmd} in
[Ss][Tt][Aa][Rr][Tt]) pcgi_start;;
[Ss][Tt][Oo][Pp]) pcgi_stop;;
[Rr][Ee][Ss][Tt][Aa][Rr][Tt]) pcgi_restart;;
[Ss][Tt][Aa][Tt][Uu][Ss]) pcgi_status 0;;
*) pcgi_help ;;
esac
Attention, la socket doit posséder les permissions suffisantes pour que Nginx puisse y écrire.
Au niveau de Nginx, voici la configuration globale du module FastCGI, fichier fastcgi_params :
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 SCRIPT_NAME $fastcgi_script_name; 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; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;
Finalement, la configuration de l’hôte virtuel :
server {
listen 80;
server_name www.site.fr
location / {
root /home/www/site.fr/html;
index index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/tmp/fcgi-php.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/site.fr/www/html$fastcgi_script_name;
include fastcgi_params;
}
}
L’option location permet de mapper les fichiers d’extension .php au module FastCGI, plus précisément à la socket de spawn-fcgi. Dans le cas d’une connexion socket TCP, il faut modifier le script de démarrage fcgi-php.sh et l’option fastcgi_pass de l’hôte (tutorial)
Au final, en reproduisant cette configuration, un même serveur ou encore site peut exécuter en parallèle des scripts PHP 4 & 5, si chaque interpréteur possède une socket dédiée. D’autres langages sont d’ailleurs possibles, c’est pourquoi mon prochain billet s’attardera au support des scripts CGI / Perl.

Article mis à jour.