Select Boot Arch Linux (x86_64) in the boot menukodi 18apache-http-server2Configurer apache 2 pour la mise en cache du navigateurAMD Radeon Select Boot Arch Linux (x86_64) in the boot menukodi 18apache-http-server2Configurer apache 2 pour la mise en cache du navigateurAMD Radeon
Exemple PHP FastCGI

NGINX: Exemple PHP FastCGI

Select Boot Arch Linux (x86_64) in the boot menukodi 18apache-http-server2Configurer apache 2 pour la mise en cache du navigateurAMD Radeon(Dernière mise à jour le: 27 avril 2021)

Partager :  

Cet exemple est pour PHP plus récent (> = 5.3.3) utilisant le PHP FPM inclus (FastCGI Process Manager).

Ce guide suppose que PHP FPM est déjà installé et configuré en utilisant le port 127.0.0.1:9000TCP ( /var/run/php-fpm.sock) ou le socket unix ( ).

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

Paramètres FastCGI

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 /etc/nginx/fastcgi_paramsfichier 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), je change SCRIPT_FILENAMEet ajoute des PATH_INFOparamètres.

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 un socket unix, passez fastcgi_passà:

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

Redémarrez NGINX.

Test

Créer test.phpsur la racine du document NGINX contenant uniquement:

<? php  var_export ( $_SERVER ) ?>

Dans le navigateur, essayez de demander: # /test.php # /test.php/ # /test.php/foo # /test.php/foo/bar.php # /test.php/foo/bar.php?v= 1

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_INFOet de vérifier correctement que l’extension est bien .php (pas .phps) s’il y a PATH_INFO ou non.

  2. Le fastcgi_split_path_inforegex capable de gérer correctement les requêtes comme /test.php/foo/blah.phpou /test.php/.

  3. Le ifpermet à NGINX de vérifier si le *.phpexiste 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 à la try_filesplace de if, si vous faites cela, méfiez-vous du bogue NGINX # 321 . Personnellement, je pense que ifc’est plus approprié pour cela, même If is Evil … lorsqu’il est utilisé dans un contexte de localisation, d’ accord, c’est l’une des choses 100% sûres à utiliser if.

  4. Le SCRIPT_FILENAMEparamètre 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 .fastcgi_params file/etc/nginx/fastcgi_params``so the users could import all the CGI params via the ``includeinclude fastcgi_paramsfastcgi_params file

    Si ce paramètre n’est pas défini, PHP FPM répond 200 OK avec un contenu vide, et il n’y a ni 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 .

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

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

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

Read other posts by lotfi

Partager :  

2 réflexions sur « NGINX: Exemple PHP FastCGI »

  1. —-
    In response to pat « mazza »:
    Hi, yes our blog editor uses WYSIWYG and automatic HTML coding, this is WodPress it is made for that.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

cinq − un =

Translate »