Cómo conectar NGINX a PHP-FPM usando UNIX o TCP/IP Socket


El servidor web NGINX (como proxy inverso) sirve aplicaciones PHP a través del protocolo FastCGI (como servidor de aplicaciones backend). NGINX emplea PHP-FPM (FastCGI Process Manager), una implementación alternativa de PHP FastCGI que se ejecuta en segundo plano como un demonio, escuchando solicitudes CGI. Viene con características adicionales diseñadas para impulsar sitios web o aplicaciones web con mucha carga, pero se puede usar para sitios de cualquier tamaño.

PHP-FPM no solo admite la configuración de los grupos de recursos de FastCGI, sino que también mejora muchos de los componentes internos de FastCGI y aumenta los informes de errores, la terminación de scripts y mucho más. Cuenta con demonización de PHP, administración de procesos, número dinámico de procesos de los que pueden provenir las solicitudes, encabezado de error, soporte de carga acelerada y más.

Para aceptar solicitudes FastCGI de NGINX, PHP-FPM puede escuchar en un socket TCP/IP o un socket de dominio UNIX. Cualquiera que sea la dirección que elija usar es la que usa NGINX para conectarse (solicitudes de proxy) a PHP-FPM, usando la directiva fastcgi_pass .

Esta guía explica cómo configurar NGINX para servidor de aplicaciones PHP usando PHP-FPM. Describe cuándo usar un socket TCP/IP o un socket de dominio UNIX para conectar NGINX a PHP-FPM y por qué.

Esta guía asume que tiene NGINX y PHP-FPM instalados en su sistema Linux; de lo contrario, consulte:

  • Cómo instalar LEMP Server en CentOS 8
  • Cómo instalar la pila LEMP PhpMyAdmin en el servidor Ubuntu 20.04
  • Cómo instalar NGINX, MySQL/MariaDB y PHP en RHEL 8
  • Cómo instalar LEMP en Debian 10 Server

Los sockets de dominio UNIX (o IPC) son un medio de comunicación entre procesos (IPC) que permiten un intercambio de datos eficiente entre procesos que se ejecutan en el mismo sistema operativo, mientras que los sockets TCP/IP (o dominio de Internet) permiten que los procesos se comuniquen a través de una red.

A diferencia de un socket TCP/IP que identifica un servidor por una dirección IP y un puerto (por ejemplo, 127.0.0.1:9000), puede vincular un servidor a un socket de dominio UNIX utilizando un nombre de ruta de archivo (por ejemplo,/run/php-fpm/www. sock), que es visible en el sistema de archivos.

Un socket de dominio UNIX es un tipo especial de archivo: se le aplican permisos de archivo y directorio (como es el caso de cualquier otro tipo de archivo UNIX) y se puede usar para restringir qué procesos en el host pueden leer y escribir en el archivo. (y así comunicarse con el servidor backend).

De esta manera, un socket de dominio UNIX es seguro porque solo los procesos en el host local pueden usarlo. Un socket TCP/IP puede estar expuesto a Internet y presentar un riesgo de seguridad a menos que se implementen medidas de seguridad adicionales, como un firewall.

Es importante destacar que usar un socket de dominio UNIX no es lo mismo que usar un socket TCP/IP con respecto al rendimiento, varias pruebas y evaluaciones han demostrado que los sockets de dominio UNIX son más rápidos. El principal inconveniente de los sockets de dominio UNIX es que son menos escalables, solo admiten la comunicación entre procesos dentro del mismo sistema operativo (SO).

Puede configurar la dirección en la que escucha PHP-FPM en un archivo de configuración de grupo de recursos. Tenga en cuenta que con PHP-FPM, puede ejecutar varios grupos de procesos con diferentes configuraciones. El grupo predeterminado se llama www .

La ubicación del archivo de configuración del grupo de recursos depende de la forma en que PHP y PHP-FPM están instalados en un sistema Linux (ya sea una versión predeterminada/única o varias versiones simultáneamente).

Por ejemplo, en CentOS 8, con una sola versión, todos los archivos de configuración de PHP se encuentran en el directorio /etc y el archivo de configuración predeterminado del grupo de PHP-FPM (www) es /etc/php-fpm.d/www.conf:

Para enumerar todos los archivos de configuración de PHP, use el siguiente comando ls.

# ls /etc/php*

En Ubuntu 20.04, los archivos de configuración de PHP se encuentran en el directorio /etc/php// y el archivo de configuración predeterminado del grupo PHP-FPM (www) es /etc/php/ /fpm/pool.d/www.conf :

$ ls /etc/php/7.4/

Configuración de PHP-FPM para escuchar en un socket de dominio UNIX

Para configurar PHP-FPM para escuchar en un socket de dominio UNIX, abra su archivo de configuración de grupo PHP-FPM predeterminado, usando su editor de texto favorito.

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

Luego busque la directiva listen y configúrela en el nombre de la ruta del archivo del socket de dominio UNIX de la siguiente manera. Tenga en cuenta que la mayoría de las instalaciones utilizan un socket de dominio UNIX de forma predeterminada.

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

Si usa un socket de dominio UNIX, también necesita establecer los permisos de lectura/escritura apropiados para el archivo, para permitir conexiones desde el servidor web NGINX. De forma predeterminada, NGINX se ejecuta como usuario y grupo nginx en CentOS/RHEL/Fedora y www-data en Ubuntu y Debian.

Por lo tanto, busque los parámetros listen.owner y listen.group y configúrelos en consecuencia. Además, configure el modo en 0660 usando el parámetro 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

Tenga en cuenta que si los permisos en el archivo de socket de dominio UNIX no están configurados correctamente, NGINX puede devolver un error de puerta de enlace incorrecta.

Configuración de PHP-FPM para escuchar en un socket TCP/IP

Aunque un socket de dominio UNIX es más rápido que un socket TCP/IP, el primero es menos escalable, porque solo puede admitir la comunicación entre procesos en el mismo sistema operativo. Si NGINX y el servidor de aplicaciones backend (PHP-FPM) se ejecutan en diferentes sistemas, tendrá que configurar PHP-FPM para escuchar en un socket TCP/IP para las conexiones.

En el archivo de configuración del grupo PHP-FPM, configure la dirección listen de la siguiente manera. Asegúrese de que el puerto que ha elegido no esté siendo utilizado por otro proceso o servicio en el mismo sistema.

listen = 127.0.0.1:3000

Configuración de NGINX para que funcione con el servidor de aplicaciones PHP-FPM

Una vez que haya configurado la dirección en la que escucha PHP-FPM, debe configurar NGINX para que le solicite un proxy a través de esa dirección, utilizando el parámetro de configuración fastcgi_pass , en un archivo de configuración de bloque de servidor virtual.

Por ejemplo, si el archivo de configuración de su sitio web es /etc/nginx/conf.d/example.com.conf, ábralo para editarlo.

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

Busque el bloque location para procesar archivos .php y configure el parámetro fastcgi_pass de la siguiente manera, si configuró PHP-FPM para escuchar en UNIX socket de dominio.

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

O use una dirección TCP/IP si configuró PHP-FPM para escuchar en un socket TCP/IP. Si el servidor de aplicaciones back-end (PHP-FPM) se está ejecutando en un servidor separado (reemplace 10.42.0.10 con la dirección IP de la máquina en la que se está ejecutando el servidor PHP-FPM FastCGI).

fastcgi_pass  10.42.0.10:3000;

Importante: En CentOS 8, PHP-FPM se define como un servidor ascendente en el archivo /etc/nginx/conf.d/php-fpm.conf, dentro de un bloque ascendente, con el nombre php-fpm.

Puede realizar cambios aquí en consecuencia, dependiendo de la dirección en la que PHP-FPM está configurado para escuchar, en el archivo de configuración del grupo. La configuración predeterminada apunta a un socket de dominio UNIX.

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

y en el archivo de bloqueo del servidor de su sitio, simplemente configure el parámetro fastcgi_pass como se muestra.

fastcgi_pass php-fpm;

Después de realizar cambios en las configuraciones PHP-FPM y NGINX, verifique que su sintaxis de configuración sea correcta de la siguiente manera.

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

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

Si bien la salida del comando muestra solo el archivo de configuración principal, todos los demás archivos de configuración también se incluyen y verifican.

A continuación, debe reiniciar los dos servicios para aplicar los cambios, utilizando el 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

Si recibe algún error, puede verificar los archivos de registro de NGINX y PHP-FPM usando el 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

Eso es todo lo que teníamos para ti. La sección de comentarios a continuación se puede utilizar para hacer preguntas. Para obtener más información, consulte la documentación de PHP-FPM.