Maison  >  Article  >  développement back-end  >  Comment configurer php dans nginx

Comment configurer php dans nginx

藏色散人
藏色散人original
2020-12-01 09:52:073754parcourir

Comment configurer PHP avec nginx : modifiez d'abord les fichiers de configuration fastcgi_params et fastcgi.conf dans Nginx ; puis utilisez la commande try_files pour filtrer une fois lorsque cgi.fix_pathinfo est activé dans PHP.

Comment configurer php dans nginx

Recommandé : "Tutoriel vidéo PHP"

L'environnement d'exploitation de ce tutoriel : système Linux5.9.8, PHP7 Version .1, cette méthode est applicable à toutes les marques d’ordinateurs.

Configurer Nginx+PHP

Pour de nombreuses personnes, configurer Nginx+PHP n'est rien de plus que rechercher un tutoriel puis le copier-coller. Il semble qu'il n'y ait rien de mal à cela, mais en fait, de nombreuses informations sur Internet sont délabrées et pleines de lacunes. Si vous vous contentez de copier et coller sans demander une compréhension plus approfondie, vous en paierez le prix tôt ou tard. .

Supposons que nous utilisions PHP pour implémenter un contrôleur frontal, ou pour parler franchement, une entrée unifiée : envoyez toutes les requêtes PHP vers le même fichier, puis implémentez le routage en analysant "REQUEST_URI" dans ce fichier.

En ce moment, de nombreux tutoriels vous apprendront à configurer Nginx+PHP comme ceci :

server {
    listen 80;
    server_name foo.com;

    root /path;

    location / {
        index index.html index.htm index.php;        if (!-e $request_filename) {
            rewrite . /index.php last;
        }
    }

    location ~ \.php$ {        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /path$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
    }
}

Il y a beaucoup d'erreurs là-dedans, ou du moins de mauvaises odeurs. Jetons un coup d'œil et trouvons-en une. peu.

Nous devons d'abord comprendre la relation d'héritage des instructions dans le fichier de configuration Nginx : le fichier de configuration Nginx est divisé en plusieurs blocs, les plus communs de l'extérieur vers l'intérieur sont "http", "server", "location", etc., la relation d'héritage par défaut est de l'extérieur vers l'intérieur, ce qui signifie que le bloc interne obtiendra automatiquement la valeur du bloc externe comme valeur par défaut (il y a des exceptions, voir la référence pour plus de détails).

Commençons par la directive « index » Dans la configuration du problème, elle est définie dans « location » :

location / {
    index index.html index.htm index.php;
}

Une fois que de nouvelles doivent être ajoutées dans le "emplacement" futur, il y aura inévitablement des instructions "index" définies à plusieurs reprises. En effet, plusieurs "emplacements" sont dans une relation horizontale et il n'y a pas d'héritage à ce stade, "index" doit être défini dans "serveur" avec le. à l'aide de la relation d'héritage, la commande "index" peut prendre effet dans tous les "emplacements".

Jetons un coup d'œil à la commande « if » Il n'est pas exagéré de dire que c'est la commande Nginx la plus mal comprise :

if (!-e $request_filename) {
    rewrite . /index.php last;
}

Beaucoup. les gens aiment l'utiliser L'instruction "if" fait une série de vérifications, mais c'est en fait la responsabilité de l'instruction "try_files" :

try_files $uri $uri/ /index.php;

De plus, les débutants pensent souvent que l'instruction "if" est une instruction au niveau du noyau, mais en fait cela fait partie du module de réécriture, et la configuration de Nginx est en fait déclarative plutôt que procédurale, donc lorsqu'elle est mélangée à des instructions de modules non réécrits, les résultats peuvent ne pas être ceux que vous souhaitez.

Jetons un coup d'œil au fichier de configuration "fastcgi_params" :

include fastcgi_params;

Nginx a deux fichiers de configuration fastcgi, à savoir "fastcgi_params" et "fastcgi.conf". Il n'y a pas beaucoup de différence, la seule différence est que ce dernier a une ligne de définition "SCRIPT_FILENAME" de plus que le premier :

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Remarque : il n'y a pas de / entre $document_root et $fastcgi_script_name.

À l'origine, Nginx n'avait que "fastcgi_params", mais plus tard, il a été découvert que de nombreuses personnes utilisaient du codage en dur pour définir "SCRIPT_FILENAME", donc "fastcgi.conf" a été introduit pour standardiser l'utilisation.

Cependant, cela soulève une question : pourquoi faut-il introduire un nouveau fichier de configuration au lieu de modifier l'ancien fichier de configuration ? En effet, l'instruction "fastcgi_param" est de type tableau. Identique à l'instruction ordinaire : la couche interne remplace la couche externe. La différence avec l'instruction ordinaire est que lorsqu'elle est utilisée plusieurs fois au même niveau, elle est ajoutée à la place. remplacé. En d'autres termes, si "SCRIPT_FILENAME" est défini deux fois au même niveau, ils seront tous deux envoyés au backend, ce qui peut entraîner des problèmes potentiels. Afin d'éviter de telles situations, un nouveau fichier de configuration a été introduit.

De plus, nous devons également prendre en compte un problème de sécurité : lorsque PHP active "cgi.fix_pathinfo", PHP peut analyser le mauvais type de fichier en tant que fichier PHP. Si Nginx et PHP sont installés sur le même serveur, la solution la plus simple est d'utiliser la commande "try_files" pour filtrer :

try_files $uri =404;

Selon l'analyse précédente, donner un Est-ce amélioré version beaucoup plus propre que la version originale :

server {
    listen 80;
    server_name foo.com;

    root /path;
    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri =404;        include fastcgi.conf;
        fastcgi_pass 127.0.0.1:9000;
    }
}

En fait, il y a encore quelques défauts, principalement parce que "try_files" et "fastcgi_split_path_info" ne sont pas assez compatibles. Bien qu'elle puisse être résolue, la solution est plutôt moche. , je n'entrerai pas dans les détails

Supplément : Parce que « location » a été limité, « fastcgi_index » n'est en fait pas nécessaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn