Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung des Kommunikationsmechanismus zwischen PHP-FPM und Nginx

Zusammenfassung des Kommunikationsmechanismus zwischen PHP-FPM und Nginx

coldplay.xixi
coldplay.xixinach vorne
2020-08-28 17:29:122580Durchsuche

Zusammenfassung des Kommunikationsmechanismus zwischen PHP-FPM und Nginx

【Verwandte Lernempfehlungen: php-Grafik-Tutorial

PHP-FPM-Einführung

CGI-Protokoll und FastCGI-Protokoll

für jede dynamische Sprache (PHP, Python usw.) Codedateien müssen den entsprechenden Parser passieren, um vom Server erkannt zu werden, und das CGI-Protokoll wird verwendet, um dem Interpreter und dem Server die Kommunikation miteinander zu ermöglichen. Das Parsen von PHP-Dateien auf dem Server erfordert die Verwendung eines PHP-Interpreters in Verbindung mit dem entsprechenden CGI-Protokoll, damit der Server PHP-Dateien analysieren kann.

Da der Mechanismus von CGI es erfordert, bei jeder Verarbeitung einer Anfrage einen CGI-Prozess zu forken und den Prozess dann nach Abschluss der Anfrage abzubrechen, was in praktischen Anwendungen eine Verschwendung von Ressourcen darstellt, erschien eine verbesserte Version von CGI, FastCGI Nachdem die Anfrage verarbeitet wurde, wird der FastCGI-Prozess nicht abgebrochen, sondern weiterhin mehrere Anfragen verarbeiten, was die Effizienz erheblich verbessert.

Was ist PHP-FPM? PHP-FPM ist PHP-FastCGI Process Manager. Es ist die Implementierung von FastCGI und bietet Prozessverwaltungsfunktionen. Der Prozess umfasst zwei Typen: Master-Prozess und Worker-Prozess; es gibt nur einen Master-Prozess, der für das Abhören des Ports und den Empfang von Anforderungen vom Server verantwortlich ist, während es im Allgemeinen mehrere Worker-Prozesse gibt (die spezifische Anzahl wird entsprechend der tatsächlichen konfiguriert). benötigt), und in jedem Prozess ist ein PHP-Interpreter eingebettet, in dem der Code tatsächlich ausgeführt wird.

Kommunikationsmechanismus zwischen Nginx und PHP-FPM

Wenn wir eine Website (z. B. www.test.com) besuchen, ist der Verarbeitungsablauf wie folgt:

  www.test.com
        |
        |
      Nginx
        |
        |
路由到 www.test.com/index.php
        |
        |
加载 nginx 的 fast-cgi 模块
        |
        |
fast-cgi 监听 127.0.0.1:9000 地址
        |
        |
www.test.com/index.php 请求到达 127.0.0.1:9000
        |
        |
     等待处理...

[Empfohlene verwandte Artikel:

Nginx-Tutorial] Die Kombination von Nginx und PHP-FPM

Unter Linux gibt es zwei Möglichkeiten, zwischen Nginx und PHP-FPM zu kommunizieren: TCP-Socket und Unix-Socket.

Der Vorteil des TCP-Sockets besteht darin, dass er serverübergreifend verwendet werden kann. Diese Methode kann nur verwendet werden, wenn sich Nginx und PHP-FPM nicht auf demselben Computer befinden.

Unix-Socket, auch IPC-Socket (Inter-Process-Communication) genannt, wird verwendet, um die Interprozesskommunikation auf demselben Host zu implementieren. Diese Methode erfordert das Ausfüllen des Socket-Dateispeicherorts von php-fpm in der Nginx-Konfigurationsdatei.

Der Datenübertragungsprozess der beiden Methoden ist in der folgenden Abbildung dargestellt:


Der Unterschied zwischen den beiden:

Da der Unix-Socket nicht den Netzwerkprotokollstapel durchlaufen muss, ist kein Paket erforderlich Entpacken, Prüfsummen berechnen, Sequenznummern und Antworten verwalten usw., kopieren Sie einfach Daten der Anwendungsschicht von einem Prozess in einen anderen. Daher ist seine Effizienz höher als die des TCP-Sockets, wodurch unnötiger TCP-Overhead reduziert werden kann. Unix-Sockets sind jedoch instabil, wenn die Anzahl der Verbindungen explodiert. Ohne die Unterstützung eines verbindungsorientierten Protokolls können große Datenpakete direkt fehlschlagen Ausnahme. Verbindungsorientierte Protokolle wie TCP können die Korrektheit und Integrität der Kommunikation besser gewährleisten.

Um Nginx und php-fpm zu kombinieren, müssen Sie nur Einstellungen in den jeweiligen Konfigurationsdateien vornehmen:

1) Konfiguration in Nginx

Nehmen Sie die TCP-Socket-Kommunikation als Beispiel

server {
    listen       80; #监听 80 端口,接收http请求
    server_name  www.test.com; #就是网站地址
    root /usr/local/etc/nginx/www/huxintong_admin; # 准备存放代码工程的路径
    #路由到网站根目录 www.test.com 时候的处理
    location / {
        index index.php; #跳转到 www.test.com/index.php
        autoindex on;
    }   

    #当请求网站下 php 文件的时候,反向代理到 php-fpm
    location ~ \.php$ {
        include /usr/local/etc/nginx/fastcgi.conf; #加载 nginx 的 fastcgi 模块
        fastcgi_intercept_errors on;
        fastcgi_pass   127.0.0.1:9000; # tcp 方式,php-fpm 监听的 IP 地址和端口
       # fasrcgi_pass /usr/run/php-fpm.sock # unix socket 连接方式
    }

}

2) Konfiguration von php-fpm

listen = 127.0.0.1:9000
# 或者下面这样
listen = /var/run/php-fpm.sock

Beachten Sie, dass es bei Verwendung eines Unix-Sockets zum Herstellen einer Verbindung Probleme mit der Berechtigungskontrolle gibt, da es sich bei der Socket-Datei im Wesentlichen um eine Datei handelt. Sie müssen daher auf die Berechtigungen des Nginx-Prozesses und die Berechtigungen von PHP-FPM achten, andernfalls werden Sie dies tun aufgefordert werden, ohne Erlaubnis darauf zuzugreifen. (Benutzer in den jeweiligen Konfigurationsdateien festlegen)

Die Kommunikation zwischen PHP-FPM und Nginx kann über die obige Konfiguration abgeschlossen werden.

Auswahl in der Anwendung

Wenn Nginx und PHP-FPM auf demselben Server ausgeführt werden und die Parallelität nicht hoch ist (nicht mehr als 1000), wählen Sie einen Unix-Socket, um die Kommunikationseffizienz von Nginx und PHP-FPM zu verbessern.

Wenn Sie mit einem hohen gleichzeitigen Geschäft konfrontiert sind, sollten Sie die Verwendung eines zuverlässigeren TCP-Sockets in Betracht ziehen, um die Effizienz durch Betriebs- und Wartungsmethoden wie Lastausgleich und Kerneloptimierung aufrechtzuerhalten.


Wenn die Parallelität hoch ist, Sie aber dennoch den Unix-Socket verwenden möchten, können Sie die Stabilität des Unix-Sockets mit den folgenden Methoden verbessern.

1) Platzieren Sie die Sock-Datei im Verzeichnis /dev/shm, damit der Speicher schneller gelesen und geschrieben werden kann.

2) Backlog verbessern

Backlog-Standardbit 128, 1024, dieser Wert wird durch Ihren normalen QPS ersetzt, die Konfiguration ist wie folgt.

In der nginx.conf-Datei

server {
        listen 80 default backlog = 1024;
       }

In der php-fpm.conf-Datei

listen.backlog = 1024

3) Fügen Sie die Sock-Datei und die PHP-FPM-Instanz hinzu

Erstellen Sie eine neue Sock-Datei in /dev/shm und übergeben Sie die Anfrage Über das Upstream-Modul in Nginx wird die Last auf zwei Sock-Dateien verteilt, und die beiden Sock-Dateien werden zwei Sätzen von PHP-FPM-Instanzen zugeordnet.

                                                                                                            

Das obige ist der detaillierte Inhalt vonZusammenfassung des Kommunikationsmechanismus zwischen PHP-FPM und Nginx. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen