Nginx : FastCGI PHP par socket UNIX

Boris HUISGEN March 18, 2009

administration nginx fastcgi php

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 l’interpréteur PHP par socket UNIX ou TCP.

L’utilitaire spawn-fcgi fourni avec le serveur Lighttpd est utilisé ici. Il est chargé d’ouvrir la socket de communication et de maintenir le pool de processus php-cgi.

Voici mon script de lancement des interpréteurs PHP fcgi-php.sh qui s’appuie sur une socket UNIX :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    #!/bin/sh
    # Boris HUISGEN <bhuisgen@hbis.fr>
    # - convert to use UNIX socket support
    # - force socket permissions
    
    PROVIDES=php-fcgi
    
    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

Le fichier socket doit posséder les permissions suffisantes pour que Nginx puisse y écrire.

Au niveau Nginx, la configuration du module FastCGI est la suivante (/etc/nginx/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;

Enfin, 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;
      }
    }

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.

See also

Packet Filter : protection bruteforce SSH
Read more
Firebird : script de désinstallation pour Mac OS X
Read more
OpenSSL : client telnet sécurisé
Read more