Heim >Backend-Entwicklung >PHP-Problem >So richten Sie PHP in Nginx ein

So richten Sie PHP in Nginx ein

藏色散人
藏色散人Original
2020-12-01 09:52:073827Durchsuche

So richten Sie PHP in Nginx ein: Ändern Sie zuerst die Konfigurationsdateien fastcgi_params und fastcgi.conf in Nginx. Verwenden Sie dann den Befehl try_files, um einmal zu filtern, wenn cgi.fix_pathinfo in PHP aktiviert ist.

So richten Sie PHP in Nginx ein

Empfohlen: „PHP-Video-Tutorial

Die Betriebsumgebung dieses Tutorials: Linux5.9.8-System, PHP7.1-Version. Diese Methode ist für alle Computermarken geeignet.

Nginx+PHP konfigurieren

Für viele Menschen ist die Konfiguration von Nginx+PHP nichts anderes, als nach einem Tutorial zu suchen und es dann zu kopieren und einzufügen. Es hört sich so an, als wäre daran nichts auszusetzen, aber tatsächlich sind viele Informationen im Internet in einem schlechten Zustand und voller Lücken. Wenn Sie sie einfach kopieren und einfügen, ohne nach einem tieferen Verständnis zu suchen, werden Sie früher oder später den Preis zahlen.

Angenommen, wir verwenden PHP, um einen Front-End-Controller zu implementieren, oder um es klar auszudrücken, einen einheitlichen Eingang: Senden Sie alle PHP-Anfragen an dieselbe Datei und implementieren Sie dann das Routing, indem Sie „REQUEST_URI“ in dieser Datei analysieren.

Zu diesem Zeitpunkt erfahren Sie in vielen Tutorials, wie Sie Nginx + PHP wie folgt konfigurieren:

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

Es gibt viele Fehler oder zumindest schlechte Gerüche. Wenn Sie einen Blick darauf werfen, können Sie einige finden.

Wir müssen zunächst die Vererbungsbeziehung der Anweisungen in der Nginx-Konfigurationsdatei verstehen: Die Nginx-Konfigurationsdatei ist in viele Blöcke unterteilt, die von außen nach innen am häufigsten vorkommen sind „http“, „server“, „ „Standort“ usw. Die Standardvererbungsbeziehung verläuft von außen nach innen, was bedeutet, dass der innere Block automatisch den Wert des äußeren Blocks als Standardwert erhält (es gibt Ausnahmen, Einzelheiten finden Sie in der Referenz).

Beginnen wir mit dem Befehl „index“, der in der Problemkonfiguration in „location“ definiert ist:

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

Sobald in Zukunft ein neuer „location“ hinzugefügt werden muss, wird es zwangsläufig doppelte Definitionen geben Dies liegt daran, dass mehrere „Standorte“ eine horizontale Beziehung haben und keine Vererbung erfolgt. Zu diesem Zeitpunkt sollte „Index“ in „Server“ definiert werden alle „Standorte“ Alle sind wirksam.

Werfen wir einen Blick auf den „if“-Befehl. Man kann ohne Übertreibung sagen, dass es der am meisten missverstandene Nginx-Befehl ist:

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

Viele Leute verwenden den „if“-Befehl gerne, um eine Reihe von Befehlen auszuführen prüft, aber das ist eigentlich Es liegt in der Verantwortung der Anweisung „try_files“:

try_files $uri $uri/ /index.php;

Darüber hinaus denken Anfänger oft, dass die Anweisung „if“ eine Anweisung auf Kernelebene ist, aber tatsächlich ist sie Teil des Rewrite-Moduls. und die Nginx-Konfiguration ist tatsächlich deklarativ und nicht prozedural. Wenn sie also mit Anweisungen von nicht umschreibbaren Modulen gemischt wird, entsprechen die Ergebnisse möglicherweise nicht Ihren Wünschen.

Werfen wir einen Blick auf die Konfigurationsdatei „fastcgi_params“:

include fastcgi_params;

Nginx hat zwei Fastcgi-Konfigurationsdateien, nämlich „fastcgi_params“ und „fastcgi.conf“. Der einzige Unterschied besteht darin Letzteres Es gibt eine Zeile mehr der Definition von „SCRIPT_FILENAME“ als Ersteres:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Hinweis: Zwischen $document_root und $fastcgi_script_name gibt es kein /.

Ursprünglich hatte Nginx nur „fastcgi_params“. Später stellte ich fest, dass viele Leute beim Definieren von „SCRIPT_FILENAME“ Hartcodierung verwendeten, daher wurde „fastcgi.conf“ eingeführt, um die Verwendung zu standardisieren.

Aber das wirft eine Frage auf: Warum müssen wir eine neue Konfigurationsdatei einführen, anstatt die alte Konfigurationsdatei zu ändern? Dies liegt daran, dass die Anweisung „fastcgi_param“ ein Array-Typ ist. Die innere Schicht ersetzt die äußere Schicht. Der Unterschied zur gewöhnlichen Anweisung besteht darin, dass sie bei mehrfacher Verwendung auf derselben Ebene hinzugefügt wird ersetzt. Mit anderen Worten: Wenn „SCRIPT_FILENAME“ zweimal auf derselben Ebene definiert ist, werden beide an das Backend gesendet, was zu potenziellen Problemen führen kann. Um solche Situationen zu vermeiden, wurde eine neue Konfigurationsdatei eingeführt.

Darüber hinaus müssen wir auch ein Sicherheitsproblem berücksichtigen: Wenn PHP „cgi.fix_pathinfo“ aktiviert, analysiert PHP möglicherweise den falschen Dateityp als PHP-Datei. Wenn Nginx und PHP auf demselben Server installiert sind, besteht die einfachste Lösung darin, den Befehl „try_files“ zum Filtern zu verwenden:

try_files $uri =404;

...

Laut der vorherigen Analyse liegt eine verbesserte Version vor, oder? als die Originalversion:

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

Tatsächlich gibt es immer noch einige Mängel, hauptsächlich weil „try_files“ und „fastcgi_split_path_info“ nicht kompatibel genug sind. Obwohl es gelöst werden kann, ist die Lösung hässlich, daher werde ich nicht auf Details eingehen .

Hinzugefügt: Da „location“ eingeschränkt wurde, ist „fastcgi_index“ eigentlich nicht notwendig.

Das obige ist der detaillierte Inhalt vonSo richten Sie PHP in Nginx ein. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn