Heim  >  Artikel  >  Backend-Entwicklung  >  So konfigurieren Sie Nginx + PHP richtig

So konfigurieren Sie Nginx + PHP richtig

不言
不言Original
2018-04-16 17:14:476255Durchsuche

In diesem Artikel werden hauptsächlich die Schritte zur Konfiguration von Nginx + PHP im Detail vorgestellt und das einfache Tutorial zur Konfiguration von Nginx + PHP erläutert.

Für viele Menschen ist die Konfiguration von Nginx + PHP nichts mehr 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 fragen, werden Sie früher oder später den Preis zahlen .

Angenommen, wir verwenden PHP, um einen Front-End-Controller zu implementieren, oder um es ganz klar auszudrücken, es handelt sich um einen einheitlichen Eingang: Senden Sie alle PHP-Anfragen an dieselbe Datei und dann In dieser Datei wird das Routing durch Parsen von „REQUEST_URI“ implementiert.

Konfigurieren Sie es im Allgemeinen so
Zu diesem Zeitpunkt lernen 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;
  }
}

Hier gibt es viele Fehler oder zumindest schlechten Geschmack, werfen Sie einen Blick darauf und Sie werden 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 häufigsten sind von außen nach innen „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.

Beginnen wir mit der „index“-Direktive
In der Problemkonfiguration ist sie in „location“ definiert:

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

Sobald in Zukunft ein neuer „Standort“ hinzugefügt werden muss, werden zwangsläufig wiederholt „Index“-Anweisungen definiert. Dies liegt daran, dass mehrere „Standorte“ in einer horizontalen Beziehung stehen. Zu diesem Zeitpunkt sollte „Index“ in „Server“ definiert werden. Mit der Vererbungsbeziehung kann der Befehl „Index“ an allen „Standorten“ wirksam werden.

Werfen wir einen Blick auf den „if“-Befehl
Man kann ohne Übertreibung sagen, dass es sich um den am meisten missverstandenen Nginx-Befehl handelt:

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

Viele Leute verwenden gerne den „if“-Befehl, um eine Reihe von Prüfungen durchzuführen, aber dies liegt eigentlich in der Verantwortung des „try_files“-Befehls:
try_files $uri $ uri/ /index.php; Darüber hinaus denken Anfänger oft, dass die „if“-Anweisung eine Anweisung auf Kernelebene ist, aber tatsächlich ist sie Teil des Rewrite-Moduls. und die Nginx-Konfiguration ist eigentlich eine Anweisung. Sie ist formal und nicht prozedural. Wenn sie also mit Anweisungen aus 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“, es gibt keinen großen Unterschied zwischen ihnen. Der einzige Unterschied besteht darin, dass letzteres eine Definitionszeile mehr von „SCRIPT_FILENAME“ hat als ersteres:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name ;

Hinweis:
Es gibt kein / zwischen $document_root und $fastcgi_script_name. Ursprünglich hatte Nginx nur „fastcgi_params“. Später stellte sich heraus, dass viele Leute beim Definieren von „SCRIPT_FILENAME“ Hartcodierung verwendeten, daher wurde „fastcgi.conf“ eingeführt, um die Verwendung zu standardisieren. Dies wirft jedoch eine Frage auf: Warum muss eine neue Konfigurationsdatei eingeführt werden, 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 „cgi.fix_pathinfo“ in PHP aktiviert ist, 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; Die vorherige Analyse, hier ist eine verbesserte Version als die Originalversion:



Verwandte Empfehlungen:

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

nginx kann kein PHP-Skript analysieren



Das obige ist der detaillierte Inhalt vonSo konfigurieren Sie Nginx + PHP richtig. 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