Nginx : exécution des scripts PHP par FastCGI

Boris HUISGEN
Boris HUISGEN
|

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.

Boris HUISGEN
Boris HUISGEN
Blog owner
  • #fastcgi
  • #nginx
  • #php