Poupe até 53% em Servidores VPS, escolha agora. Oferta limitada.

Otimizar Nginx + PHP-FPM no mesmo servidor: conflitos

11 min de leitura  ·  Guia técnico

Otimizar Nginx + PHP-FPM no mesmo servidor exige ajustar sockets, limites de processos e buffers para evitar gargalos de comunicação entre o servidor web e o interpretador PHP. Para eliminar conflitos e extrair o máximo de performance, siga estes passos:

  1. Migrar a comunicação de TCP para socket Unix
  2. Ajustar pm.max_children conforme a RAM disponível
  3. Alinhar usuários e permissões entre Nginx e PHP-FPM
  4. Configurar buffers fastcgi e timeouts adequados
  5. Habilitar pm.status_path para monitoramento
  6. Testar com ferramentas de carga e ajustar iterativamente

Pré-requisitos

  • VPS com Debian 12 ou Ubuntu 24.04 LTS e acesso root via SSH
  • Nginx 1.26 ou superior instalado e ativo
  • PHP 8.3 com pacote php8.3-fpm instalado
  • Mínimo de 2 GB de RAM recomendado para ambientes de produção
  • Ferramentas de diagnóstico: htop, ss, curl e ab (Apache Bench)
  • Backup de /etc/nginx e /etc/php/8.3/fpm antes de qualquer alteração

Conflitos comuns entre Nginx e PHP-FPM no mesmo servidor

Quando o servidor web e o interpretador dividem o mesmo host, surgem disputas por recursos de CPU, memória e file descriptors. O Nginx opera como um processo event-driven assíncrono, enquanto o PHP-FPM usa um modelo pré-fork com workers dedicados. Se os dois não forem dimensionados em harmonia, o resultado típico é erro 502 Bad Gateway, lentidão em horários de pico ou consumo excessivo de swap.

Os três conflitos mais frequentes em ambientes de hospedagem Linux são: (1) permissões incompatíveis no socket Unix, quando o Nginx roda como www-data mas o pool PHP-FPM escuta como outro usuário; (2) fila de requisições PHP-FPM menor que a taxa de chegada do Nginx, causando timeouts; (3) worker_connections do Nginx configurado acima do que pm.max_children consegue atender, gerando backlog.

Antes de qualquer tuning, observe o comportamento real com htop e ss -xl | grep php durante um pico de tráfego. Sem baseline, ajustes viram chute.

Integração via socket Unix: performance e segurança

A comunicação entre Nginx e PHP-FPM pode ocorrer por TCP (127.0.0.1:9000) ou por socket Unix (/run/php/php8.3-fpm.sock). Em um único servidor, o socket Unix é a escolha recomendada porque elimina o overhead da pilha TCP/IP e restringe o acesso ao sistema de arquivos local.

Edite o pool padrão em /etc/php/8.3/fpm/pool.d/www.conf:

listen = /run/php/php8.3-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

No bloco server do Nginx, referencie o mesmo caminho:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_read_timeout 60s;
    fastcgi_buffer_size 16k;
    fastcgi_buffers 8 16k;
}

Reinicie os serviços e valide:

sudo systemctl restart php8.3-fpm nginx
sudo ss -xl | grep php8.3-fpm.sock
Output esperado:
u_str LISTEN 0  128  /run/php/php8.3-fpm.sock 12345  * 0

Se o Nginx retornar 502 após a mudança, verifique se o usuário www-data pertence ao grupo correto com id www-data. Em distribuições como Rocky Linux 9 e AlmaLinux 9, o usuário padrão é nginx em vez de www-data, ajuste listen.owner de acordo.

Dimensionamento de workers PHP-FPM conforme a memória

O parâmetro pm.max_children define quantas requisições PHP podem ser processadas simultaneamente. Valores baixos geram fila; valores altos consomem toda a RAM e disparam OOM killer. A fórmula prática é: RAM disponível para PHP ÷ consumo médio por processo.

Meça o consumo real antes de configurar:

ps -ylC php-fpm8.3 --sort:rss | awk '{sum+=$8; n++} END {print "Media RSS:", sum/n/1024, "MB"}'

Para um VPS de 2 GB com cerca de 1,5 GB livres para PHP e consumo médio de 50 MB por worker, ajuste em www.conf:

pm = dynamic
pm.max_children = 30
pm.start_servers = 6
pm.min_spare_servers = 4
pm.max_spare_servers = 10
pm.max_requests = 500
request_terminate_timeout = 60s

A diretiva pm.max_requests recicla workers após N requisições, mitigando memory leaks em extensões PHP. Para cargas estáveis em servidor dedicado, avalie pm = static — elimina o custo de fork e oferece latência p95 mais consistente. Consulte o artigo Dicas de Otimização de Servidores Linux para recomendações adicionais de kernel tuning.

Ajuste de buffers e timeouts no Nginx para FastCGI

O servidor web precisa de buffers suficientes para armazenar respostas do PHP-FPM sem escrever em disco temporário. Buffers subdimensionados geram warnings em /var/log/nginx/error.log do tipo "an upstream response is buffered to a temporary file".

No /etc/nginx/nginx.conf, dentro do bloco http:

fastcgi_buffer_size 32k;
fastcgi_buffers 16 16k;
fastcgi_busy_buffers_size 64k;
fastcgi_temp_file_write_size 64k;
fastcgi_connect_timeout 5s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 60s;

worker_processes auto;
worker_rlimit_nofile 65535;
events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}

O valor worker_processes auto faz o Nginx detectar automaticamente o número de núcleos da CPU. Já worker_connections 4096 deve ser proporcional ao limite de file descriptors — ajuste também em /etc/security/limits.conf.

Atenção: antes de aplicar, teste a sintaxe com sudo nginx -t. Um bloco malformado derruba o serviço ao recarregar.

sudo nginx -t && sudo systemctl reload nginx

Monitoramento com pm.status_path e logs slow

Para diagnosticar gargalos em tempo real, ative o endpoint de status do PHP-FPM. Adicione em www.conf:

pm.status_path = /fpm-status
ping.path = /fpm-ping
slowlog = /var/log/php8.3-fpm-slow.log
request_slowlog_timeout = 5s

No Nginx, exponha o status apenas para localhost:

location ~ ^/(fpm-status|fpm-ping)$ {
    allow 127.0.0.1;
    deny all;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
}

Consulte o status:

curl http://127.0.0.1/fpm-status?full
Output esperado:
pool:                 www
process manager:      dynamic
active processes:     8
total processes:      12
max active processes: 18
max children reached: 0
slow requests:        2
listen queue:         0

O campo listen queue maior que zero indica que requisições estão aguardando worker livre — sinal claro de que pm.max_children precisa aumentar ou a aplicação tem consultas lentas. Se max children reached cresce, é hora de escalar vertical ou horizontalmente.

Problemas comuns e como resolver

Sintoma: erro 502 Bad Gateway intermitente sob carga

Causa: fila do PHP-FPM saturada ou socket com permissões incorretas após reinicialização.
Solução: aumente pm.max_children gradualmente (em incrementos de 20%), confirme que listen.owner corresponde ao usuário do Nginx e monitore o listen queue em /fpm-status. Verifique também dmesg | grep -i oom para descartar falta de memória.

Sintoma: latência alta em endpoints específicos

Causa: consultas SQL lentas ou chamadas externas bloqueando workers PHP.
Solução: inspecione /var/log/php8.3-fpm-slow.log, identifique os scripts ofensores e otimize queries ou adicione cache. Reduza request_terminate_timeout para liberar workers travados. Considere o uso de Redis para cache de sessão e dados frequentes.

Sintoma: muitos arquivos temporários sendo criados em /var/lib/nginx

Causa: buffers fastcgi menores que as respostas típicas do PHP, forçando escrita em disco.
Solução: aumente fastcgi_buffers e fastcgi_buffer_size para valores compatíveis com o tamanho médio de resposta. Meça com curl -w "%{size_download}\n" -o /dev/null -s https://seusite.com.br/pagina algumas URLs reais.

Sintoma: permission denied ao conectar no socket

Causa: divergência entre o usuário que executa o Nginx (nginx em Rocky/AlmaLinux, www-data em Debian/Ubuntu) e o dono do socket.
Solução: alinhe listen.owner, listen.group e listen.mode no pool. Em ambientes multi-site, considere pools PHP-FPM separados por usuário, reforçando isolamento — técnica útil também ao combinar com redirecionamento HTTPS forçado.

Perguntas frequentes sobre Nginx + PHP-FPM

Qual a diferença entre usar socket Unix e TCP entre Nginx e PHP-FPM?

Socket Unix é mais rápido e seguro pois evita a pilha TCP/IP, sendo ideal quando Nginx e PHP-FPM estão no mesmo servidor. Já TCP (127.0.0.1:9000) é necessário quando os serviços rodam em servidores separados ou em containers distintos. Para ambientes em um único host, o socket Unix reduz latência em cerca de 5 a 15 por cento segundo testes de bancada.

Quantos workers do PHP-FPM devo configurar em um VPS com 2 GB de RAM?

Divida a RAM disponível pelo consumo médio de cada processo PHP-FPM, que gira entre 30 e 80 MB dependendo da aplicação. Em um VPS de 2 GB com 1,5 GB livre para PHP, configure pm.max_children entre 20 e 40. Sempre monitore com pm_status antes de ajustar para cima.

Por que recebo erro 502 Bad Gateway ao integrar Nginx com PHP-FPM?

O erro 502 normalmente indica que o Nginx não conseguiu se comunicar com o PHP-FPM, por socket inexistente, permissões incorretas ou todos os workers ocupados. Verifique se o caminho fastcgi_pass no Nginx corresponde exatamente ao listen do pool PHP-FPM e se o usuário do Nginx tem permissão de leitura no socket.

Devo usar pm = dynamic ou pm = static no PHP-FPM?

Use pm = static em servidores dedicados com carga previsível, pois elimina o overhead de criação de processos. Use pm = dynamic em VPS compartilhados ou aplicações com picos irregulares, pois libera memória durante períodos ociosos. Para WordPress em produção estável, static costuma oferecer melhor latência p95.

Como saber se o gargalo está no Nginx ou no PHP-FPM?

Habilite o ping.path e pm.status_path no pool PHP-FPM e consulte o endpoint para verificar fila de requisições e workers ativos. Se listen queue estiver crescendo, o gargalo é PHP-FPM. Se o Nginx reporta muitos worker_connections em uso mas PHP-FPM está ocioso, o gargalo é na camada Nginx ou rede.

Conclusão

  • Prefira socket Unix em single-host e alinhe listen.owner com o usuário do Nginx para eliminar 502 por permissão
  • Dimensione pm.max_children a partir da medição real de RSS dos processos PHP-FPM, nunca por chute
  • Ative pm.status_path e slowlog desde o dia zero para ter métricas acionáveis antes que o problema vire incidente

Leia também

Precisa de ajuda com otimização de Nginx e PHP-FPM?

A infraestrutura VPS da AviraHost oferece recursos dedicados, SSD NVMe e liberdade total para ajustar stack LEMP conforme sua carga real. Nossa equipe técnica apoia na configuração inicial e no tuning contínuo.

Conheça os planos de VPS Linux da AviraHost

  • 0 Os usuários acharam isso útil
  • nginx, php-fpm, debian-12, otimizacao, performance, vps-linux, AviraHost
Esta resposta foi útil?

Artigos Relacionados

Instalando painel de gerenciamento de hospedagem VirtualMin.

O virtualmin é um painel de gerenciamento de hospedagem de sites gratuito, que é suportado por...

Como usar a ferramenta oficial de acesso remoto do Windows no PC e celular

1. Pelo menu Iniciar, acesse os “Acessórios do Windows” e abra o “Conexão de Área de Trabalho...

Como acessar o painel de gerenciamento dos meus Serviços.

Para acessar o painel de gerenciamento do seu serviço basta seguir o passo á passo abaixo.   1....

Compreendendo o Servidor VPS: O que é e Como Funciona!

Um servidor VPS (Virtual Private Server) é uma solução de hospedagem na qual um servidor físico é...

Como trocar a senha do usuário root do servidor VPS ou Dedicado.

Para trocar a senha do usuário root em um servidor VPS da AviraHost, você pode seguir os...