Búsqueda de sitios web

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 funciones adicionales diseñadas para impulsar sitios web o aplicaciones web con mucha carga, pero se puede utilizar para sitios de cualquier tamaño.

PHP-FPM no solo admite la configuración de grupos de recursos FastCGI, sino que también mejora muchos de los componentes internos de FastCGI y aumenta los informes de errores, terminación y mucho más. Cuenta con demonización de PHP, gestión de procesos, una cantidad dinámica de procesos de los cuales pueden provenir 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 en un dominio UNIX. enchufe. Cualquier dirección que elija usar es la que NGINX usa para conectarse (solicitudes de proxy) a PHP-FPM, usando la directiva fastcgi_pass.

Esta guía explica cómo configurar NGINX para servir aplicaciones PHP usando PHP-FPM. Describe cuándo utilizar 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 el servidor LEMP 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 utilizar: socket de dominio UNIX o socket TCP/IP?

Los sockets de dominio UNIX (o IPC) son un medio de comunicación entre procesos (IPC) que permite el intercambio eficiente de datos entre procesos que se ejecutan en el mismo sistema operativo mientras TCP Los sockets /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 mediante una dirección IP y un puerto (por ejemplo, 127.0.0.1:9000), puede vincular un servidor a un socket de dominio UNIX usando 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 archivos y directorios (como es el caso con 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 sólo los procesos en el host local pueden usarlo. Un socket TCP/IP puede quedar expuesto a Internet, lo que representa 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 en cuanto al rendimiento; varias pruebas y puntos de referencia 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 y solo admiten la comunicación entre procesos dentro del mismo sistema operativo (SO).

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

Puede configurar la dirección de escucha PHP-FPM en un archivo de configuración del 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 se instalan PHP y PHP-FPM en un sistema Linux (ya sea una versión predeterminada/única o varias versiones simultáneamente). .

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

Para enumerar todos los archivos de configuración de PHP, utilice 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 valor predeterminado PHP-FPM . el archivo de configuración del grupo (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.

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 de escucha y configúrela en el nombre de 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 utiliza un socket de dominio UNIX, también debe configurar los permisos de lectura/escritura adecuados 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.

Entonces, busque los parámetros listen.owner y listen.group y configúrelos en consecuencia. Además, establezca 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 del 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 sólo puede admitir comunicación entre procesos en el mismo sistema operativo. Si NGINX y el servidor de aplicaciones backend (PHP-FPM) se ejecutan en sistemas diferentes, tendrá que configurar PHP-FPM para escuchar un socket TCP/IP para conexiones.

En el archivo de configuración del grupo PHP-FPM, establezca 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 trabajar con el servidor de aplicaciones PHP-FPM

Una vez que haya configurado la dirección en la que PHP-FPM escucha, debe configurar NGINX para que envíe la solicitud mediante proxy a través de esa dirección, utilizando el fastcgi_pass. pará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 bloque location para procesar archivos .php y establezca el parámetro fastcgi_pass de la siguiente manera, si configuró PHP-FPM para escuchar en un UNIX. conector 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 utilice 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 ejecuta en un servidor separado (reemplace 10.42.0.10 con la dirección IP de la máquina en la que se encuentra el servidor PHP-FPM FastCGI Esta corriendo).

fastcgi_pass  10.42.0.10:3000;

Importante: En CentOS 8, PHP-FPM se define como un servidor ascendente en el directorio / 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é configurada 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 la 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 obtiene algún error, puede verificar los archivos de registro 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 NGINX y la documentación de PHP-FPM.