Ricerca nel sito web

Come connettere NGINX a PHP-FPM utilizzando UNIX o socket TCP/IP


Il server web NGINX (come proxy inverso) serve applicazioni PHP attraverso il protocollo FastCGI (come server di applicazioni backend). NGINX utilizza PHP-FPM (FastCGI Process Manager), un'implementazione alternativa di PHP FastCGI che viene eseguita in background come demone, ascoltando CGI. Viene fornito con funzionalità extra progettate per alimentare siti Web o applicazioni Web con carichi pesanti, ma può essere utilizzato per siti di qualsiasi dimensione.

Non solo PHP-FPM supporta la configurazione dei pool di risorse FastCGI, ma migliora anche molti dei componenti interni FastCGI e aumenta la segnalazione degli errori, gli script risoluzione e molto altro ancora. È dotato di demonizzazione PHP, gestione dei processi, numero dinamico di processi da cui possono provenire richieste, intestazione di errore, supporto di caricamento accelerato e altro ancora.

Per accettare richieste FastCGI da NGINX, PHP-FPM può essere in ascolto su un socket TCP/IP o su un dominio UNIX PRESA. Qualunque indirizzo tu scelga di utilizzare è quello che NGINX utilizza per connettersi (richieste proxy) a PHP-FPM, utilizzando la direttiva fastcgi_pass.

Questa guida spiega come configurare NGINX per server applicazioni PHP utilizzando PHP-FPM. Descrive quando utilizzare un socket TCP/IP o un socket di dominio UNIX per connettere NGINX a PHP-FPM e perché.

Questa guida presuppone che tu abbia NGINX e PHP-FPM installati sul tuo sistema Linux, altrimenti vedi:

  • Come installare il server LEMP su CentOS 8
  • Come installare lo stack LEMP PhpMyAdmin nel server Ubuntu 20.04
  • Come installare NGINX, MySQL/MariaDB e PHP su RHEL 8
  • Come installare LEMP sul server Debian 10

Cosa dovrei usare: socket di dominio UNIX o socket TCP/IP?

I socket di dominio UNIX (o IPC) sono un mezzo di comunicazione tra processi (IPC) che consente un efficiente scambio di dati tra processi in esecuzione sullo stesso sistema operativo mentre TCP I socket /IP (o dominio Internet) consentono ai processi di comunicare su una rete.

A differenza di un socket TCP/IP che identifica un server tramite un indirizzo IP e una porta (ad esempio 127.0.0.1:9000), puoi associare un server a un socket di dominio UNIX utilizzando un percorso del file (ad esempio /run/php-fpm/www.sock), che è visibile nel filesystem.

Un socket di dominio UNIX è un tipo speciale di file: ad esso si applicano i permessi di file e directory (come nel caso di qualsiasi altro tipo di file UNIX) e può essere utilizzato per limitare quali processi sull'host possono leggere e scrivere sul file, (e quindi comunicare con il server backend).

In questo modo, un socket di dominio UNIX è sicuro perché solo i processi sull'host locale possono utilizzarlo. Un socket TCP/IP può essere esposto a Internet rappresentando un rischio per la sicurezza, a meno che non vengano implementate misure di sicurezza aggiuntive come un firewall.

È importante sottolineare che l'utilizzo di un socket di dominio UNIX non è la stessa cosa che utilizzare un socket TCP/IP per quanto riguarda le prestazioni, diversi test e benchmark hanno dimostrato che i socket di dominio UNIX sono più veloci. Lo svantaggio principale dei socket di dominio UNIX è che sono meno scalabili e supportano solo la comunicazione tra processi all'interno dello stesso sistema operativo (OS).

Dove posso configurare l'indirizzo di ascolto PHP-FPM?

Puoi configurare l'indirizzo su cui PHP-FPM è in ascolto in un file di configurazione del pool di risorse. Tieni presente che con PHP-FPM puoi eseguire diversi pool di processi con impostazioni diverse. Il pool predefinito si chiama www.

La posizione del file di configurazione del pool di risorse dipende dal modo in cui PHP e PHP-FPM sono installati su un sistema Linux (se si tratta di una versione predefinita/singola o di più versioni contemporaneamente) .

Ad esempio, su CentOS 8, con un'unica versione, tutti i file di configurazione PHP si trovano nella directory /etc e nella directory predefinita PHP-FPM Il file di configurazione del pool (www) è /etc/php-fpm.d/www.conf:

Per elencare tutti i file di configurazione PHP, utilizzare il seguente comando ls.

ls /etc/php*

Su Ubuntu 20.04, i file di configurazione PHP si trovano nella directory /etc/php// e nella directory predefinita PHP-FPM il file di configurazione del pool (www) è /etc/php//fpm/pool.d/www.conf:

ls /etc/php/7.4/

Configurazione di PHP-FPM per l'ascolto su un socket di dominio UNIX

Per configurare PHP-FPM per l'ascolto su un socket di dominio UNIX, apri il file di configurazione del pool PHP-FPM predefinito, utilizzando il tuo editor di testo preferito.

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

Quindi cercare la direttiva di ascolto e impostarla sul nome del percorso del file del socket del dominio UNIX come segue. Tieni presente che la maggior parte delle installazioni utilizza un socket di dominio UNIX per impostazione predefinita.

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

Se utilizzi un socket di dominio UNIX, devi anche impostare i permessi di lettura/scrittura appropriati per il file, per consentire le connessioni dal server web NGINX. Per impostazione predefinita, NGINX viene eseguito come utente e gruppo nginx su CentOS/RHEL/Fedora e www-data su Ubuntu e Debian.

Quindi, trova i parametri listen.owner e listen.group e impostali di conseguenza. Inoltre, imposta la modalità su 0660 utilizzando il parametro listen.mode.

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

Tieni presente che se le autorizzazioni sul file socket del dominio UNIX non sono impostate correttamente, NGINX potrebbe restituire un errore di gateway non valido.

Configurazione di PHP-FPM per l'ascolto su un socket TCP/IP

Sebbene un socket di dominio UNIX sia più veloce di un socket TCP/IP, il primo è meno scalabile perché può supportare solo la comunicazione tra processi sullo stesso sistema operativo. Se NGINX e il server delle applicazioni backend (PHP-FPM) sono in esecuzione su sistemi diversi, dovrai configurare PHP-FPM per l'ascolto su un socket TCP/IP per le connessioni.

Nel file di configurazione del pool PHP-FPM, imposta l'indirizzo listen come segue. Assicurati che la porta che hai scelto non sia utilizzata da un altro processo o servizio sullo stesso sistema.

listen = 127.0.0.1:3000

Configurazione di NGINX per funzionare con il server delle applicazioni PHP-FPM

Una volta configurato l'indirizzo su cui PHP-FPM è in ascolto, devi configurare NGINX per inoltrare richieste tramite quell'indirizzo, utilizzando fastcgi_pass parametro di configurazione, in un file di configurazione del blocco del server virtuale.

Ad esempio, se il file di configurazione per il tuo sito web è /etc/nginx/conf.d/example.com.conf, aprilo per la modifica.

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

Cerca il blocco location per l'elaborazione dei file .php e imposta il parametro fastcgi_pass come segue, se hai configurato PHP-FPM per l'ascolto su UNIX presa di dominio.

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

Oppure utilizza un indirizzo TCP/IP se hai configurato PHP-FPM per l'ascolto su un socket TCP/IP. Se il server dell'applicazione backend (PHP-FPM) è in esecuzione su un server separato (sostituire 10.42.0.10 con l'indirizzo IP della macchina su cui è installato il server PHP-FPM FastCGI è in esecuzione).

fastcgi_pass  10.42.0.10:3000;

Importante: su CentOS 8, PHP-FPM è definito come server upstream in / etc/nginx/conf.d/php-fpm.conf, all'interno di un blocco upstream, con il nome php-fpm.

Puoi apportare modifiche qui di conseguenza a seconda dell'indirizzo su cui PHP-FPM è configurato per l'ascolto, nel file di configurazione del pool. La configurazione predefinita punta a un socket di dominio UNIX.

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

e nel file di blocco del server del tuo sito, imposta semplicemente il parametro fastcgi_pass come mostrato.

fastcgi_pass php-fpm;

Dopo aver apportato modifiche alle configurazioni PHP-FPM e NGINX, controlla la correttezza della sintassi di configurazione come segue.

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

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

Sebbene l'output del comando mostri solo il file di configurazione principale, anche tutti gli altri file di configurazione sono inclusi e controllati.

Successivamente, è necessario riavviare i due servizi per applicare le modifiche, utilizzando il comando systemctl.

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

Se ricevi errori, puoi controllare i file di registro NGINX e PHP-FPM utilizzando il comando cat.

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

Questo è tutto ciò che avevamo per te. La sezione commenti qui sotto può essere utilizzata per porre domande. Per ulteriori informazioni, consultare la documentazione NGINX e la documentazione PHP-FPM.