Website-Suche

So verbinden Sie NGINX mit PHP-FPM über UNIX oder TCP/IP-Socket


Der NGINX-Webserver (als Reverse-Proxy) stellt PHP-Anwendungen über das FastCGI-Protokoll bereit (als Backend-Anwendungsserver). NGINX verwendet PHP-FPM (FastCGI Process Manager), eine alternative PHP FastCGI-Implementierung, die im Hintergrund als Daemon ausgeführt wird und auf CGI-Anfragen. Es verfügt über zusätzliche Funktionen, die für den Betrieb stark ausgelasteter Websites oder Webanwendungen konzipiert sind, kann aber für Websites jeder Größe verwendet werden.

PHP-FPM unterstützt nicht nur die Konfiguration von FastCGI-Ressourcenpools, sondern verbessert auch viele der FastCGI-Interna und verbessert die Fehlerberichterstattung und das Skript Kündigung und vieles mehr. Es bietet PHP-Dämonisierung, Prozessmanagement, eine dynamische Anzahl von Prozessen, von denen Anfragen kommen können, Fehlerheader, beschleunigte Upload-Unterstützung und mehr.

Um FastCGI-Anfragen von NGINX zu akzeptieren, kann PHP-FPM entweder auf einem TCP/IP-Socket oder einer UNIX-Domäne lauschen Steckdose. Unabhängig davon, welche Adresse Sie verwenden, wird NGINX verwendet, um mithilfe der fastcgi_pass-Direktive eine Verbindung (Proxy-Anfragen) zu PHP-FPM herzustellen.

In dieser Anleitung wird erläutert, wie Sie NGINX für den Server von PHP-Anwendungen mit PHP-FPM konfigurieren. Es beschreibt, wann ein TCP/IP-Socket oder UNIX-Domänen-Socket verwendet werden sollte, um NGINX mit PHP-FPM zu verbinden und warum.

In dieser Anleitung wird davon ausgegangen, dass NGINX und PHP-FPM auf Ihrem Linux-System installiert sind. Andernfalls siehe:

  • So installieren Sie den LEMP-Server unter CentOS 8
  • So installieren Sie den LEMP-Stack PhpMyAdmin auf dem Ubuntu 20.04 Server
  • So installieren Sie NGINX, MySQL/MariaDB und PHP auf RHEL 8
  • So installieren Sie LEMP auf einem Debian 10-Server

Was sollte ich verwenden: UNIX-Domänen-Socket oder TCP/IP-Socket?

UNIX-Domänen-Sockets (oder IPC-Sockets) sind ein Mittel zur Interprozesskommunikation (IPC), das einen effizienten Datenaustausch zwischen Prozessen ermöglicht, die unter TCP auf demselben Betriebssystem ausgeführt werden /IP-Sockets (oder Internetdomänen) ermöglichen Prozessen die Kommunikation über ein Netzwerk.

Im Gegensatz zu einem TCP/IP-Socket, der einen Server anhand einer IP-Adresse und eines Ports identifiziert (z. B. 127.0.0.1:9000), können Sie einen Server mit an einen UNIX-Domänen-Socket binden ein Dateipfadname (z. B. /run/php-fpm/www.sock), der im Dateisystem sichtbar ist.

Ein UNIX-Domänen-Socket ist ein besonderer Dateityp – für ihn gelten Datei- und Verzeichnisberechtigungen (wie bei jedem anderen UNIX-Dateityp) und können verwendet werden, um einzuschränken, welche Prozesse auf dem Host die Datei lesen und schreiben können. (und somit mit dem Backend-Server kommunizieren).

Auf diese Weise ist ein UNIX-Domänen-Socket sicher, da ihn nur Prozesse auf dem lokalen Host verwenden können. Ein TCP/IP-Socket kann dem Internet ausgesetzt sein und ein Sicherheitsrisiko darstellen, sofern keine zusätzlichen Sicherheitsmaßnahmen wie eine Firewall implementiert werden.

Wichtig ist, dass die Verwendung eines UNIX-Domain-Sockets hinsichtlich der Leistung nicht dasselbe ist wie die Verwendung eines TCP/IP-Sockets. Mehrere Tests und Benchmarks haben gezeigt, dass UNIX-Domain-Sockets schneller sind. Der Hauptnachteil von UNIX-Domänen-Sockets besteht darin, dass sie weniger skalierbar sind und nur die Kommunikation zwischen Prozessen innerhalb desselben Betriebssystems (OS) unterstützen.

Wo kann ich die PHP-FPM-Listenadresse konfigurieren?

Sie können die Adresse, an der PHP-FPM lauscht, in einer Ressourcenpool-Konfigurationsdatei konfigurieren. Beachten Sie, dass Sie mit PHP-FPM mehrere Prozesspools mit unterschiedlichen Einstellungen ausführen können. Der Standardpool heißt www.

Der Speicherort der Ressourcenpool-Konfigurationsdatei hängt davon ab, wie PHP und PHP-FPM auf einem Linux-System installiert werden (ob es sich um eine Standard-/Einzelversion oder mehrere Versionen gleichzeitig handelt). .

Beispielsweise befinden sich unter CentOS 8 mit einer einzigen Version alle PHP-Konfigurationsdateien im Verzeichnis /etc und im Standardverzeichnis PHP-FPM Die Konfigurationsdatei für den Pool (www) lautet /etc/php-fpm.d/www.conf:

Um alle PHP-Konfigurationsdateien aufzulisten, verwenden Sie den folgenden ls-Befehl.

ls /etc/php*

Unter Ubuntu 20.04 befinden sich die PHP-Konfigurationsdateien im Verzeichnis /etc/php// und im Standardverzeichnis PHP-FPM > Pool (www)-Konfigurationsdatei ist /etc/php//fpm/pool.d/www.conf:

ls /etc/php/7.4/

Konfigurieren von PHP-FPM zum Abhören eines UNIX-Domänen-Sockets

Um PHP-FPM für die Überwachung eines UNIX-Domänen-Sockets zu konfigurieren, öffnen Sie Ihre standardmäßige PHP-FPM-Pool-Konfigurationsdatei mit Ihrem bevorzugten Texteditor.

sudo vim /etc/php/7.4/fpm/pool.d/www.conf	#Ubuntu/Debian
OR
vim /etc/php-fpm.d/www.conf			#CentOS/RHEL/Fedora

Suchen Sie dann nach der Listen-Direktive und setzen Sie sie wie folgt auf den Dateipfadnamen des UNIX-Domänen-Sockets. Beachten Sie, dass die meisten Installationen standardmäßig einen UNIX-Domänen-Socket verwenden.

listen = /run/php/php7.4-fpm.sock	#Ubuntu/Debian
OR
listen = /run/php-fpm/www.sock		#CentOS/RHEL/Fedora

Wenn Sie einen UNIX-Domänen-Socket verwenden, müssen Sie außerdem entsprechende Lese-/Schreibberechtigungen für die Datei festlegen, um Verbindungen vom NGINX-Webserver zu ermöglichen. Standardmäßig wird NGINX als Benutzer und Gruppe nginx unter CentOS/RHEL/Fedora und www-data unter Ubuntu ausgeführt und Debian.

Suchen Sie also die Parameter listen.owner und listen.group und stellen Sie sie entsprechend ein. Stellen Sie außerdem den Modus mithilfe des Parameters listen.mode auf 0660 ein.

------------- On Debian and Ubuntu -------------
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

------------- On CentOS/RHEL and Fedora  -------------
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Beachten Sie, dass NGINX möglicherweise einen fehlerhaften Gateway-Fehler zurückgibt, wenn die Berechtigungen für die UNIX-Domänen-Socket-Datei nicht korrekt festgelegt sind.

Konfigurieren von PHP-FPM zum Abhören eines TCP/IP-Sockets

Obwohl ein UNIX-Domänen-Socket schneller als ein TCP/IP-Socket ist, ist ersterer weniger skalierbar, da er nur die Kommunikation zwischen Prozessen auf demselben Betriebssystem unterstützen kann. Wenn NGINX und der Backend-Anwendungsserver (PHP-FPM) auf unterschiedlichen Systemen laufen, müssen Sie PHP-FPM zum Abhören konfigurieren ein TCP/IP-Socket für Verbindungen.

Legen Sie in der PHP-FPM-Pool-Konfigurationsdatei die listen-Adresse wie folgt fest. Stellen Sie sicher, dass der von Ihnen gewählte Port nicht von einem anderen Prozess oder Dienst auf demselben System verwendet wird.

listen = 127.0.0.1:3000

Konfigurieren von NGINX für die Arbeit mit dem PHP-FPM-Anwendungsserver

Sobald Sie die Adresse konfiguriert haben, an der PHP-FPM lauscht, müssen Sie NGINX so konfigurieren, dass es Anfragen per Proxy über diese Adresse an sie sendet, indem Sie den fastcgi_pass verwenden Konfigurationsparameter in einer virtuellen Serverblock-Konfigurationsdatei.

Wenn die Konfigurationsdatei für Ihre Website beispielsweise /etc/nginx/conf.d/example.com.conf lautet, öffnen Sie sie zur Bearbeitung.

vim /etc/nginx/conf.d/example.com.conf 

Suchen Sie nach dem Block location für die Verarbeitung von .php-Dateien und legen Sie den Parameter fastcgi_pass wie folgt fest, wenn Sie PHP-FPM für die Überwachung auf einem UNIX konfiguriert haben Domain-Socket.

fastcgi_pass unix:/run/php/php7.4-fpm.sock	#Ubuntu/Debian
OR
fastcgi_pass unix:/run/php-fpm/www.sock		#CentOS/RHEL/Fedora

Oder verwenden Sie eine TCP/IP-Adresse, wenn Sie PHP-FPM für die Überwachung eines TCP/IP-Sockets konfiguriert haben. Wenn der Backend-Anwendungsserver (PHP-FPM) auf einem separaten Server ausgeführt wird (ersetzen Sie 10.42.0.10 durch die IP-Adresse des Computers, auf dem sich der PHP-FPM-FastCGI-Server befindet läuft).

fastcgi_pass  10.42.0.10:3000;

Wichtig: Unter CentOS 8 ist PHP-FPM als Upstream-Server im / definiert. etc/nginx/conf.d/php-fpm.conf-Datei innerhalb eines Upstream-Blocks mit dem Namen php-fpm.

Abhängig von der Adresse, an der PHP-FPM in der Pool-Konfigurationsdatei zum Abhören konfiguriert ist, können Sie hier entsprechende Änderungen vornehmen. Die Standardkonfiguration verweist auf einen UNIX-Domänen-Socket.

upstream php-fpm {
        server unix:/run/php-fpm/www.sock;
}

und legen Sie in der Serverblockdatei Ihrer Site einfach den Parameter fastcgi_pass wie gezeigt fest.

fastcgi_pass php-fpm;

Nachdem Sie Änderungen an den Konfigurationen PHP-FPM und NGINX vorgenommen haben, überprüfen Sie deren Konfigurationssyntax wie folgt auf Richtigkeit.

------------- On Debian and Ubuntu -------------
sudo php-fpm -t
sudo nginx -t

------------- On CentOS/RHEL and Fedora  -------------
php-fpm -t
nginx -t

Während in der Befehlsausgabe nur die Hauptkonfigurationsdatei angezeigt wird, werden auch alle anderen Konfigurationsdateien einbezogen und überprüft.

Als nächstes müssen Sie die beiden Dienste mit dem Befehl systemctl neu starten, um die Änderungen zu übernehmen.

------------- On Debian and Ubuntu -------------
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm

------------- On CentOS/RHEL and Fedora  -------------
systemctl restart nginx
systemctl restart php-fpm

Wenn Sie Fehler erhalten, können Sie die Protokolldateien NGINX und PHP-FPM mit dem Befehl cat überprüfen.

------------- On Debian and Ubuntu -------------
cat /var/log/nginx/error.log
cat /var/log/php7.4-fpm.log

------------- On CentOS/RHEL and Fedora  -------------
cat /var/log/nginx/error.log
cat /var/log/php-fpm/www-error.log

Das ist alles, was wir für Sie hatten. Im Kommentarbereich unten können Sie Fragen stellen. Weitere Informationen finden Sie in der NGINX-Dokumentation und der PHP-FPM-Dokumentation.