Com connectar NGINX a PHP-FPM mitjançant UNIX o TCP/IP Socket


El servidor web NGINX (com a servidor intermediari invers) serveix aplicacions PHP mitjançant el protocol FastCGI (com a servidor d'aplicacions de fons). NGINX utilitza PHP-FPM (FastCGI Process Manager), una implementació alternativa de PHP FastCGI que s'executa en segon pla com a dimoni, escoltant sol·licituds CGI. Ve amb funcions addicionals dissenyades per alimentar llocs web o aplicacions web amb molta càrrega, però es pot utilitzar per a llocs de qualsevol mida.

PHP-FPM no només admet la configuració de conjunts de recursos FastCGI, sinó que també millora molts dels elements interns de FastCGI i augmenta els informes d'errors, la terminació d'scripts i molt més. Disposa de demonització de PHP, gestió de processos, un nombre dinàmic de processos dels quals poden venir les sol·licituds, capçalera d'errors, suport de càrrega accelerada i molt més.

Per acceptar sol·licituds FastCGI de NGINX, PHP-FPM pot escoltar-lo en un sòcol TCP/IP o en un sòcol de domini UNIX. Sigui quina sigui l'adreça que trieu utilitzar és la que utilitza NGINX per connectar-se (sol·licituds de proxy) a PHP-FPM, mitjançant la directiva fastcgi_pass.

Aquesta guia explica com configurar NGINX per al servidor d'aplicacions PHP mitjançant PHP-FPM. Descriu quan utilitzar un sòcol TCP/IP o un sòcol de domini UNIX per connectar NGINX a PHP-FPM i per què.

Aquesta guia suposa que teniu NGINX i PHP-FPM instal·lats al vostre sistema Linux; en cas contrari, consulteu:

  • Com instal·lar el servidor LEMP a CentOS 8
  • Com instal·lar la pila LEMP PhpMyAdmin al servidor Ubuntu 20.04
  • Com instal·lar NGINX, MySQL/MariaDB i PHP a RHEL 8
  • Com instal·lar LEMP al servidor Debian 10

Els sòcols de domini UNIX (o IPC) són un mitjà de comunicació entre processos (IPC) que permeten l'intercanvi eficient de dades entre processos que s'executen en el mateix sistema operatiu mentre que els sòcols TCP/IP (o domini d'Internet) permeten que els processos es comuniquin a través d'una xarxa.

A diferència d'un sòcol TCP/IP que identifica un servidor mitjançant una adreça IP i un port (p. ex. 127.0.0.1:9000), podeu vincular un servidor a un sòcol de domini UNIX mitjançant un nom de ruta de fitxer (p. ex. /run/php-fpm/www. sock), que és visible al sistema de fitxers.

Un sòcol de domini UNIX és un tipus especial de fitxer: s'hi apliquen permisos de fitxer i directori (com és el cas de qualsevol altre tipus de fitxer UNIX) i es pot utilitzar per restringir quins processos de l'amfitrió poden llegir i escriure al fitxer, (i així comunicar-se amb el servidor de fons).

D'aquesta manera, un sòcol de domini UNIX és segur perquè només els processos de l'amfitrió local el poden utilitzar. Un sòcol TCP/IP pot estar exposat a Internet i suposa un risc de seguretat tret que s'implementin mesures de seguretat addicionals, com ara un tallafoc.

És important destacar que utilitzar un sòcol de domini UNIX no és el mateix que utilitzar un sòcol TCP/IP pel que fa al rendiment, diverses proves i punts de referència han demostrat que els sòcols de domini UNIX són més ràpids. El principal inconvenient dels sòcols de domini UNIX és que són menys escalables, només admeten la comunicació entre processos dins del mateix sistema operatiu (SO).

Podeu configurar l'adreça que PHP-FPM escolta en un fitxer de configuració de l'agrupació de recursos. Tingueu en compte que amb PHP-FPM, podeu executar diversos grups de processos amb diferents configuracions. El grup predeterminat s'anomena www.

La ubicació del fitxer de configuració de l'agrupació de recursos depèn de la manera com PHP i PHP-FPM s'instal·len en un sistema Linux (ja sigui una versió predeterminada/única o diverses versions simultàniament).

Per exemple, a CentOS 8, amb una única versió, tots els fitxers de configuració de PHP es troben al directori /etc i el fitxer de configuració per defecte del grup PHP-FPM (www) és /etc/php-fpm.d/www.conf:

Per llistar tots els fitxers de configuració de PHP, utilitzeu l'ordre ls següent.

# ls /etc/php*

A Ubuntu 20.04, els fitxers de configuració de PHP es troben al directori /etc/php// i al fitxer de configuració per defecte del grup PHP-FPM (www) és /etc/php//fpm/pool.d/www.conf:

$ ls /etc/php/7.4/

Configuració de PHP-FPM per escoltar en un sòcol de domini UNIX

Per configurar PHP-FPM perquè escolti en un sòcol de domini UNIX, obriu el fitxer de configuració del grup PHP-FPM predeterminat, utilitzant el vostre editor de text preferit.

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

A continuació, cerqueu la directiva listen i configureu-la amb el nom de ruta del fitxer del sòcol del domini UNIX de la manera següent. Tingueu en compte que la majoria de les instal·lacions utilitzen un sòcol de domini UNIX per defecte.

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

Si utilitzeu un sòcol de domini UNIX, també heu d'establir els permisos de lectura/escriptura adequats per al fitxer, per permetre connexions des del servidor web NGINX. Per defecte, NGINX s'executa com a usuari i grup nginx a CentOS/RHEL/Fedora i www-data a Ubuntu i Debian.

Per tant, cerqueu els paràmetres listen.owner i listen.group i configureu-los en conseqüència. A més, establiu el mode a 0660 mitjançant el paràmetre 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

Tingueu en compte que si els permisos del fitxer de socket del domini UNIX no estan configurats correctament, NGINX pot tornar un error de passarel·la incorrecte.

Configuració de PHP-FPM per escoltar en un sòcol TCP/IP

Tot i que un sòcol de domini UNIX és més ràpid que un sòcol TCP/IP, el primer és menys escalable, perquè només pot suportar la comunicació entre processos al mateix sistema operatiu. Si NGINX i el servidor d'aplicacions de fons (PHP-FPM) s'executen en sistemes diferents, haureu de configurar PHP-FPM per escoltar les connexions en un sòcol TCP/IP.

Al fitxer de configuració del grup PHP-FPM, configureu l'adreça escoltar de la manera següent. Assegureu-vos que el port que heu escollit no l'utilitzi un altre procés o servei del mateix sistema.

listen = 127.0.0.1:3000

Configuració de NGINX per treballar amb el servidor d'aplicacions PHP-FPM

Un cop hàgiu configurat l'adreça en què escolta PHP-FPM, heu de configurar NGINX perquè la sol·liciti a través d'aquesta adreça, utilitzant el paràmetre de configuració fastcgi_pass, en un fitxer de configuració de bloc de servidor virtual.

Per exemple, si el fitxer de configuració del vostre lloc web és /etc/nginx/conf.d/example.com.conf, obriu-lo per editar-lo.

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

Busqueu el bloc ubicació per processar fitxers .php i configureu el paràmetre fastcgi_pass de la següent manera, si heu configurat PHP-FPM per escoltar-lo en UNIX sòcol de domini.

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

O utilitzeu una adreça TCP/IP si heu configurat PHP-FPM per escoltar-lo en un sòcol TCP/IP. Si el servidor d'aplicacions de fons (PHP-FPM) s'està executant en un servidor independent (substituïu 10.42.0.10 per l'adreça IP de la màquina en què s'executa el servidor PHP-FPM FastCGI).

fastcgi_pass  10.42.0.10:3000;

Important: a CentOS 8, PHP-FPM es defineix com un servidor amunt al fitxer /etc/nginx/conf.d/php-fpm.conf, dins d'un bloc amunt, amb el nom php-fpm.

Podeu fer canvis aquí segons l'adreça que PHP-FPM estigui configurada per escoltar, al fitxer de configuració del grup. La configuració predeterminada apunta a un sòcol de domini UNIX.

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

i al fitxer de bloqueig del servidor del vostre lloc, simplement configureu el paràmetre fastcgi_pass tal com es mostra.

fastcgi_pass php-fpm;

Després de fer canvis a les configuracions PHP-FPM i NGINX, comproveu que la seva sintaxi de configuració sigui correcta de la manera següent.

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

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

Tot i que la sortida de l'ordre només mostra el fitxer de configuració principal, tots els altres fitxers de configuració també s'inclouen i es comproven.

A continuació, heu de reiniciar els dos serveis per aplicar els canvis, mitjançant l'ordre 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

Si obteniu algun error, podeu comprovar els fitxers de registre NGINX i PHP-FPM mitjançant l'ordre 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

Això és tot el que teníem per a tu. La secció de comentaris a continuació es pot utilitzar per fer preguntes. Per obtenir més informació, consulteu la documentació PHP-FPM.