Exemple PHP FastCGI

FastCGI : Nginx l’exemple PHP

(Last Updated On: 26 avril 2022)

Cet exemple est conçu pour PHP version (> = 5.3.3) utilisant  PHP-FPM incluant (FastCGI Process Manager). Il  suppose que PHP-FPM est déjà installé et configuré en utilisant le port 127.0.0.1:9000   TCP ou le socket unix ( ) ( /var/run/php-fpm.sock) .

Il existe de nombreux guides sur la configuration de NGINX  avec PHP-FPM, mais beaucoup d’entre eux sont incomplets, ils  ne gèrent pas correctement PATH_INFO ) ou contiennent des problèmes de sécurité, ( ne vérifient pas si le script est bien un fichier php ).

FastCGI les paramètres

Tout d’abord, je recommande de conserver tous vos paramètres FCGI typiques dans un seul fichier et de les importer, par exemple, sur debian et ubuntu, par défaut, il y a un fichier /etc/nginx/fastcgi_params  qui devrait ressembler à ceci:

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_FILENAME          $racine_document $fastcgi_script_name ; 
fastcgi_param    SCRIPT_NAME              $fastcgi_script_name ; 
fastcgi_param    PATH_INFO                $fastcgi_path_info ; 
fastcgi_param    PATH_TRANSLATED          $racine_document $fastcgi_path_info ; 
fastcgi_param    REQUEST_URI              $request_uri ; 
fastcgi_param    DOCUMENT_URI             $document_uri ; 
fastcgi_param    DOCUMENT_ROOT            $racine_document ; 
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              $port_distant ; 
fastcgi_param    SERVER_ADDR              $server_addr ; 
fastcgi_param    SERVER_PORT              $port_serveur ; 
fastcgi_param    SERVER_NAME              $server_name ;
fastcgi_param    HTTPS                    $https ;
# ----------------------------------------------------------------------------
# PHP uniquement, requis si PHP a été compilé avec --enable-force-cgi-redirect
# ---------------------------------------------------------------------------- 
fastcgi_param    REDIRECT_STATUS          200 ;

Veuillez noter que si vous utilisez Ubuntu Precise (12.04),  vous changez SCRIPT_FILENAME et vous ajoutez des PATH_INFO paramètres.

FastCGI : Connexion de NGINX à PHP-FPM

Maintenant, nous devons dire à NGINX de transmettre les requêtes par proxy à PHP-FPM via le protocole FCGI:

location  ~  [^ /]\.php(/|$) { 
    fastcgi_split_path_info  ^ (.+?\.php)(/.*)$ ; 
    if  (!-f  $racine_document$fastcgi_script_name )  { 
        return  404 ; 
    }

    # Atténuez https://httpoxy.org/vulnérabilités 
    fastcgi_param  HTTP_PROXY  "" ;

    fastcgi_pass  127.0.0.1:9000 ; 
    fastcgi_index index.php;

    # inclure le paramètre 
    fastcgi_param include fastcgi_params ;

    # Le paramètre #SCRIPT_FILENAME est utilisé pour PHP FPM déterminant 
    # le nom du script. S'il n'est pas défini dans le fichier fastcgi_params, 
    # ie /etc/nginx/fastcgi_params ou dans les contextes parents, 
    # veuillez commenter la ligne suivante: 
    # fastcgi_param SCRIPT_FILENAME $racine_document$fastcgi_script_name; 
}

Si vous utilisez une socket unix, passez fastcgi_pass comme suit:

fastcgi_pass  unix:/var/run/php-fpm.sock;

Redémarrez NGINX par:

$ systemctl restart nginx 
ou 
$ service nginx restart

Test

Créer un fichier de script php : test.php sur la racine du serveur  NGINX contenant uniquement ce qui suit:

<? php  var_export ($_SERVER) ?>

Faites attention à la valeur de REQUEST_URI, SCRIPT_FILENAME, SCRIPT_NAME, PATH_INFO et PHP_SELF.

Voici la sortie correcte pour http://lemp.test/test.php/foo/bar.php? V = 1

array  ( 
  'USER'  =>  'www-data' , 
  'HOME'  =>  '/var/www' , 
  'FCGI_ROLE'  =>  'RESPONDER' , 
  'QUERY_STRING'  =>  'v=1' , 
  'REQUEST_METHOD'  =>  'GET' , 
  'CONTENT_TYPE'  =>  '' , 
  'CONTENT_LENGTH'  =>  '' , 
  'SCRIPT_FILENAME'  =>  '/var/www/test.php' , 
  'SCRIPT_NAME'  =>  '/test.php' , 
  'PATH_INFO '  =>  ' /foo/bar.php ' , 
  ' REQUEST_URI '  => '/test.php/foo/bar.php?v=1' , 
  'DOCUMENT_URI'  =>  '/test.php/foo/bar.php' , 
  'DOCUMENT_ROOT'  =>  '/var/www' , 
  'SERVER_PROTOCOL'  =>  'HTTP / 1.1' , 
  'GATEWAY_INTERFACE'  =>  'CGI / 1.1' , 
  'SERVER_SOFTWARE'  =>  'nginx / 1.4.0' , 
  'REMOTE_ADDR'  =>  '192.168.56.1' , 
  'REMOTE_PORT'  =>  '44644 ' , 
  ' SERVER_ADDR '  =>  ' 192.168.56.3 ' , 
  ' SERVER_PORT ' =>  '80' , 
  'SERVER_NAME'  =>  '' ,
  'HTTPS'  =>  '' , 
  'REDIRECT_STATUS'  =>  '200' , 
  'HTTP_HOST'  =>  'lemp.test' , 
  'HTTP_USER_AGENT'  =>  'Mozilla / 5.0 (X11; Ubuntu; Linux x86_64; rv: 20.0) Gecko / 20100101 Firefox / 20.0 ' , 
  ' HTTP_ACCEPT '  =>  ' text /html, application /xhtml + xml, application /xml; q = 0.9, * / *; q = 0.8 ' , 
  ' HTTP_ACCEPT_LANGUAGE '  =>  ' en-US, fr; q = 0.5 ' , 
  ' HTTP_ACCEPT_ENCODING '  =>  ' gzip, deflate ' , 
  ' HTTP_CONNECTION '  =>  'keep-alive ' , 
  ' PHP_SELF '  =>  ' /test.php/foo/bar.php ' ,
  'REQUEST_TIME'  =>  1367829847 , 
)

Remarques

  1. L’emplacement regex capable de gérer PATH_INFO et de vérifier correctement que l’extension est bien .php  et ne pas .phps et s’il y a PATH_INFO ou non.

  2. Le fastcgi_split_path_info regex capable de gérer correctement les requêtes comme /test.php/foo/blah.php ou /test.php/.

  3. Le if permet à NGINX de vérifier si le *.php existe effectivement pour empêcher NGINX d’alimenter un fichier de script PHP-FPM non php (comme l’image téléchargée).

    Certains guides recommandent d’utiliser  try_files à la place de if, si vous faites cela, méfiez-vous du bogue NGINX #321 . Personnellement, je pense que “ifc’est plus approprié pour ce genre de test. lorsqu’il est utilisé dans un contexte local, d’ accord, c’est l’une des choses 100% sûres à utiliser.

  4. Le paramètre SCRIPT_FILENAME est obligatoire car il est passé à PHP-FPM pour déterminer le nom du script.

    Dans les builds de NGINX pour de nombreuses distributions Linux, ce paramètre a été ajouté dans , ie directive, ie . Mais pour certaines distributions, telles que CentOS, ce paramètre n’existe pas dans le fichier des paramètres fastcgi_params (etc/nginx/fastcgi_params), afin que les utilisateurs puissent importer tous les paramètres CGI via le include fastcgi_params.

  5. Si ce paramètre n’est pas défini, PHP-FPM répond 200 OK avec un contenu vide, sans erreur ni avertissement. Pour plus d’informations sur les paramètres CGI, veuillez vous référer au guide du débutant nginx , $ _SERVER en PHP et RFC3875 .

  6. Si vous voyez une page vierge dans le navigateur, veuillez vérifier si le SCRIPT_FILENAME paramètre est défini.

  7. Ce guide fonctionne correctement sur php.ini avec (la valeur par défaut).cgi.fix_pathinfo = 1

    Certains guides insistent pour le changer en,  cgi.fix_pathinfo = 0 PHP_SELFDOCUMENT_URI mais cela rend la variable cassée.


Merci de votez pour cet article :
Votez : Pas malMoyenBienAcès bienExcélent (1 votes, average: 1,00 out of 5)
Loading...

Une réflexion sur « FastCGI : Nginx l’exemple PHP »

Laisser un commentaire

Translate »