Nginx : exécution des scripts PHP par FastCGI

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 l’instance Nginx et l’interpréteur PHP.
L’utilitaire spawn-fcgi fourni avec le serveur Lighttpd est utilisé ici. Il est chargé de créer le pool de processus PHP dédiés à l’exécution des scripts et d’ouvrir une socket serveur en attente de réception des requêtes FastCGI issues de Nginx.
Le script du service init.d est le suivant :
# vim /etc/init.d/fcgi-php
1#!/bin/bash
2# Boris HUISGEN <bhuisgen@hbis.fr>
3# - convert to use UNIX socket support
4# - force socket permissions
5
6PROVIDES=php-fcgi
7
8SPAWN_FCGI=/usr/local/bin/spawn-fcgi
9PHP_CGI=/usr/local/bin/php-cgi
10PHP_CGI_CHILDREN=4
11
12SOCKET=/tmp/fcgi-php.sock
13SOCKET_USER=www
14SOCKET_GROUP=www
15SOCKET_PERMS=600
16
17# script
18cmd=$1
19
20pcgi_start() {
21 echo "Starting $PROVIDES..."
22 $SPAWN_FCGI -s $SOCKET -u $SOCKET_USER -g $SOCKET_GROUP -f $PHP_CGI -C $PHP_CGI_CHILDREN
23 chown $SOCKET_USER:$SOCKET_GROUP $SOCKET
24 chmod $SOCKET_PERMS $SOCKET
25}
26
27pcgi_stop() {
28 echo "Stopping $PROVIDES..."
29 killall $PROVIDES
30 rm $SOCKET
31}
32
33pcgi_restart() {
34 pcgi_stop
35 pcgi_start
36}
37
38pcgi_status() {
39 [ -S $SOCKET ] && echo "$PROVIDES running" || echo "$PROVIDES NOT running"
40}
41
42pcgi_help() {
43 echo "Usage: $0 {start|stop|restart|status}"
44}
45
46case ${cmd} in
47 [Ss][Tt][Aa][Rr][Tt]) pcgi_start;;
48 [Ss][Tt][Oo][Pp]) pcgi_stop;;
49 [Rr][Ee][Ss][Tt][Aa][Rr][Tt]) pcgi_restart;;
50 [Ss][Tt][Aa][Tt][Uu][Ss]) pcgi_status 0;;
51 *) pcgi_help ;;
52esac
Le point important est de vérifier que la socket UNIX possède les permissions suffisantes pour l’utilisateur d’exécution de nginx (droit de lecture et d’écriture).
La configuration du module FastCGI de Nginx est la suivante :
# vim /etc/nginx/fastcgi_params
1fastcgi_param QUERY_STRING $query_string;
2fastcgi_param REQUEST_METHOD $request_method;
3fastcgi_param CONTENT_TYPE $content_type;
4fastcgi_param CONTENT_LENGTH $content_length;
5
6fastcgi_param SCRIPT_NAME $fastcgi_script_name;
7fastcgi_param REQUEST_URI $request_uri;
8fastcgi_param DOCUMENT_URI $document_uri;
9fastcgi_param DOCUMENT_ROOT $document_root;
10fastcgi_param SERVER_PROTOCOL $server_protocol;
11
12fastcgi_param GATEWAY_INTERFACE CGI/1.1;
13fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
14
15fastcgi_param REMOTE_ADDR $remote_addr;
16fastcgi_param REMOTE_PORT $remote_port;
17fastcgi_param SERVER_ADDR $server_addr;
18fastcgi_param SERVER_PORT $server_port;
19fastcgi_param SERVER_NAME $server_name;
20
21# PHP only, required if PHP was built with --enable-force-cgi-redirect
22fastcgi_param REDIRECT_STATUS 200;
Enfin, la configuration de l’hôte virtuel Nginx :
# vim /etc/nginx/sites-available/site.fr.conf
1server {
2 listen 80;
3 server_name www.site.fr
4
5 location / {
6 root /home/www/site.fr/html;
7 index index.php;
8 }
9
10 location ~ \.php$ {
11 fastcgi_pass unix:/tmp/fcgi-php.sock;
12 fastcgi_index index.php;
13 fastcgi_param SCRIPT_FILENAME /home/www/site.fr/www/html$fastcgi_script_name;
14 include fastcgi_params;
15 }
16}
La dernière option location permet de mapper les fichiers d’extension .php au module FastCGI, plus précisément à la socket des processus spawn-fcgi.