Pesquisa de site

Como conectar NGINX ao PHP-FPM usando UNIX ou soquete TCP/IP


O servidor web NGINX (como proxy reverso) atende aplicativos PHP através do protocolo FastCGI (como um servidor de aplicativos backend). NGINX emprega PHP-FPM (FastCGI Process Manager), uma implementação alternativa do PHP FastCGI que é executada em segundo plano como um daemon, ouvindo CGI. Ele vem com recursos extras projetados para alimentar sites ou aplicativos da web sobrecarregados, mas pode ser usado para sites de qualquer tamanho.

O PHP-FPM não apenas suporta a configuração de pools de recursos do FastCGI, mas também melhora muitos dos componentes internos do FastCGI e aumenta o relatório de erros, scripts rescisão e muito mais. Possui demonização de PHP, gerenciamento de processos, um número dinâmico de processos dos quais as solicitações podem vir, cabeçalho de erro, suporte para upload acelerado e muito mais.

Para aceitar solicitações FastCGI do NGINX, o PHP-FPM pode escutar em um soquete TCP/IP ou em um domínio UNIX soquete. Qualquer endereço que você escolher usar é o que o NGINX usa para se conectar (solicitações de proxy) ao PHP-FPM, usando a diretiva fastcgi_pass.

Este guia explica como configurar o NGINX para servidores de aplicativos PHP usando PHP-FPM. Ele descreve quando usar um soquete TCP/IP ou um soquete de domínio UNIX para conectar o NGINX ao PHP-FPM e por quê.

Este guia pressupõe que você tenha NGINX e PHP-FPM instalados em seu sistema Linux, caso contrário, consulte:

  • Como instalar o servidor LEMP no CentOS 8
  • Como instalar a pilha LEMP PhpMyAdmin no servidor Ubuntu 20.04
  • Como instalar NGINX, MySQL/MariaDB e PHP no RHEL 8
  • Como instalar o LEMP no servidor Debian 10

O que devo usar: soquete de domínio UNIX ou soquete TCP/IP?

Os soquetes de domínio UNIX (ou IPC) são um meio de comunicação entre processos (IPC) que permite a troca eficiente de dados entre processos executados no mesmo sistema operacional enquanto TCP Os soquetes /IP (ou Domínio da Internet) permitem que os processos se comuniquem através de uma rede.

Ao contrário de um soquete TCP/IP que identifica um servidor por um endereço IP e porta (por exemplo, 127.0.0.1:9000), você pode vincular um servidor a um soquete de domínio UNIX usando um nome de caminho de arquivo (por exemplo, /run/php-fpm/www.sock), que é visível no sistema de arquivos.

Um soquete de domínio UNIX é um tipo especial de arquivo – permissões de arquivo e diretório se aplicam a ele (como é o caso de qualquer outro tipo de arquivo UNIX) e pode ser usado para restringir quais processos no host podem ler e gravar no arquivo, (e assim se comunicar com o servidor backend).

Dessa forma, um soquete de domínio UNIX é seguro porque somente processos no host local podem utilizá-lo. Um soquete TCP/IP pode ser exposto à Internet, representando um risco de segurança, a menos que medidas extras de segurança, como um firewall, sejam implementadas.

É importante ressaltar que usar um soquete de domínio UNIX não é o mesmo que usar um soquete TCP/IP em relação ao desempenho. Vários testes e benchmarks provaram que os soquetes de domínio UNIX são mais rápidos. A principal desvantagem dos soquetes de domínio UNIX é que eles são menos escaláveis, pois suportam apenas a comunicação entre processos dentro do mesmo sistema operacional (SO).

Onde posso configurar o endereço de escuta do PHP-FPM?

Você pode configurar o endereço de escuta do PHP-FPM em um arquivo de configuração do pool de recursos. Observe que com PHP-FPM você pode executar vários pools de processos com configurações diferentes. O pool padrão é chamado www.

A localização do arquivo de configuração do pool de recursos depende da forma como o PHP e o PHP-FPM são instalados em um sistema Linux (seja uma versão padrão/única ou múltiplas versões simultaneamente) .

Por exemplo, no CentOS 8, com uma única versão, todos os arquivos de configuração do PHP estão localizados no diretório /etc e no diretório padrão PHP-FPM O arquivo de configuração do pool (www) é /etc/php-fpm.d/www.conf:

Para listar todos os arquivos de configuração do PHP, use o seguinte comando ls.

ls /etc/php*

No Ubuntu 20.04, os arquivos de configuração do PHP estão localizados no diretório /etc/php// e no diretório padrão PHP-FPM o arquivo de configuração do pool (www) é /etc/php//fpm/pool.d/www.conf:

ls /etc/php/7.4/

Configurando PHP-FPM para escutar em um soquete de domínio UNIX

Para configurar o PHP-FPM para escutar em um soquete de domínio UNIX, abra seu arquivo de configuração de pool PHP-FPM padrão, usando seu 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

Em seguida, procure a diretiva listen e defina-a como o nome do caminho do arquivo do soquete de domínio UNIX da seguinte maneira. Observe que a maioria das instalações usa um soquete de domínio UNIX por padrão.

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

Se você usar um soquete de domínio UNIX, também precisará definir permissões de leitura/gravação apropriadas para o arquivo, para permitir conexões do servidor web NGINX. Por padrão, o NGINX é executado como usuário e grupo nginx no CentOS/RHEL/Fedora e www-data no Ubuntu e Debian.

Portanto, encontre os parâmetros listen.owner e listen.group e defina-os de acordo. Além disso, defina o modo como 0660 usando o 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

Observe que se as permissões no arquivo de soquete de domínio UNIX não estiverem definidas corretamente, o NGINX poderá retornar um erro de gateway inválido.

Configurando PHP-FPM para escutar em um soquete TCP/IP

Embora um soquete de domínio UNIX seja mais rápido que um soquete TCP/IP, o primeiro é menos escalável, porque só pode suportar comunicação entre processos no mesmo sistema operacional. Se o NGINX e o servidor de aplicativos backend (PHP-FPM) estiverem rodando em sistemas diferentes, você terá que configurar o PHP-FPM para escutar um soquete TCP/IP para conexões.

No arquivo de configuração do pool PHP-FPM, defina o endereço listen conforme a seguir. Certifique-se de que a porta escolhida não esteja sendo usada por outro processo ou serviço no mesmo sistema.

listen = 127.0.0.1:3000

Configurando o NGINX para funcionar com o servidor de aplicativos PHP-FPM

Depois de configurar o endereço de escuta do PHP-FPM, você precisa configurar o NGINX para solicitar proxy para ele através desse endereço, usando o fastcgi_pass parâmetro de configuração, em um arquivo de configuração de bloco de servidor virtual.

Por exemplo, se o arquivo de configuração do seu site for /etc/nginx/conf.d/example.com.conf, abra-o para edição.

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

Procure o bloco location para processar arquivos .php e defina o parâmetro fastcgi_pass como segue, se você configurou o PHP-FPM para escutar em um UNIX soquete de domínio.

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

Ou use um endereço TCP/IP se você configurou o PHP-FPM para escutar em um soquete TCP/IP. Se o servidor de aplicativos backend (PHP-FPM) estiver sendo executado em um servidor separado (substitua 10.42.0.10 pelo endereço IP da máquina na qual o servidor PHP-FPM FastCGI está correndo).

fastcgi_pass  10.42.0.10:3000;

Importante: No CentOS 8, PHP-FPM é definido como um servidor upstream no / arquivo etc/nginx/conf.d/php-fpm.conf, dentro de um bloco upstream, com o nome php-fpm.

Você pode fazer alterações aqui dependendo do endereço que PHP-FPM está configurado para escutar, no arquivo de configuração do pool. A configuração padrão aponta para um soquete de domínio UNIX.

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

e no arquivo de bloco do servidor do seu site, basta definir o parâmetro fastcgi_pass conforme mostrado.

fastcgi_pass php-fpm;

Depois de fazer alterações nas configurações PHP-FPM e NGINX, verifique a correção da sintaxe de configuração conforme a seguir.

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

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

Embora a saída do comando mostre apenas o arquivo de configuração principal, todos os outros arquivos de configuração também são incluídos e verificados.

Em seguida, você precisa reiniciar os dois serviços para aplicar as alterações, usando o 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 você receber algum erro, poderá verificar os arquivos de log NGINX e PHP-FPM usando o 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

Isso é tudo que tínhamos para você. A seção de comentários abaixo pode ser usada para fazer perguntas. Para obter mais informações, consulte a documentação do NGINX e a documentação do PHP-FPM.