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

El servidor web &ltstrong&gtNGINX&lt/strong&gt (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 grupos de recursos de FastCGI , sino que también mejora muchos de los componentes internos de &ltstrong&gtFastCGI&lt/strong&gt 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, una cantidad dinámica 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 fastcgi_passdirectiva.

Esta guía explica cómo configurar NGINX para servidor de aplicaciones PHP usando &ltstrong&gtPHP-FPM&lt/strong&gt . 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 el servidor Debian 10

¿Qué debo usar: socket de dominio UNIX o socket TCP / IP?

Los sockets de dominio &ltstrong&gtUNIX&lt/strong&gt (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).

¿Dónde puedo configurar la dirección de escucha de PHP-FPM?

Puede configurar la dirección en la que escucha &ltstrong&gtPHP-FPM&lt/strong&gt 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. Se llama al grupo predeterminado 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 /etcdirectorio y el archivo de configuración del grupo PHP-FPM predeterminado (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*

Listar todos los archivos de configuración de PHPListar todos los archivos de configuración de PHP

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

$ ls /etc/php/7.4/

Listar todos los archivos de configuración de PHP en UbuntuListar todos los archivos de configuración de PHP en Ubuntu

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.

$ sudo vim /etc/php/7.4/fpm/pool.d/www.conf#Ubuntu/Debian
OR
# vim /etc/php-fpm.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, encontrar las listen.ownery los listen.groupparámetros y establecer en consecuencia. Además, configure el modo en 0660 usando el listen.modeparámetro.

------------- 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 PHP-FPMConfiguración PHP-FPM

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 listendirección 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 PHP-FPM para TCP SocketConfiguración de PHP-FPM para TCP Socket

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 &ltstrong&gtPHP-FPM&lt/strong&gt , debe configurar NGINX para que le solicite un proxy a través de esa dirección, utilizando el fastcgi_passparámetro de configuración, 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 locationbloque para procesar .phparchivos y configure el fastcgi_passparámetro de la siguiente manera, si configuró PHP-FPM para escuchar en un socket de dominio UNIX.

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

Conecte Nginx a PHP-FPM usando Unix SocketConecte Nginx a PHP-FPM usando Unix Socket

O use una dirección TCP / IP si configuró PHP-FPM para escuchar en un socket TCP / IP . Si el servidor de aplicaciones backend ( 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

Conecte Nginx a PHP-FPM usando TCP SocketConecte Nginx a PHP-FPM usando TCP Socket

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
}

Configurar el servidor ascendente PHP en NginxConfigurar el servidor ascendente PHP en Nginx

y en el archivo de bloque del servidor de su sitio, simplemente configure el fastcgi_passparámetro como se muestra.

fastcgi_pass php-fpm

Configurar Nginx a PHP-FPM Upstream ServerConfigurar Nginx a PHP-FPM Upstream Server

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 se verifican.

Verifique la configuración de Nginx y PHP-FPM Verifique la configuración de Nginx y PHP-FPM

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 &ltstrong&gtNGINX&lt/strong&gt 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 NGINX y la &lta href=”https://nginx.org/en/docs/” rel=”noopener nofollow noreferrer” target=”_blank”&gtdocumentación de &lt/a&gtPHP-FPM .

CentOS , Debian , Nginx , RedHat , Ubuntu

Leave a Comment

Your email address will not be published. Required fields are marked *

Hazlo Linux