15 min de leitura · Guia técnico
Configurar limites de recursos no PHP-FPM é essencial para otimizar o desempenho de aplicações web em servidores VPS Linux. Definir parâmetros como memória máxima, tempo de execução e número de processos evita sobrecarga do servidor e garante estabilidade. Neste guia completo, você aprenderá a configurar corretamente todos os limites do PHP-FPM para maximizar o desempenho do seu VPS.
Pré-requisitos
- Acesso SSH ao seu servidor VPS Linux com privilégios de root ou sudo
- PHP-FPM instalado (testado com versões 7.4, 8.0, 8.1 e 8.2)
- Servidor web configurado (Nginx ou Apache)
- Conhecimentos básicos de linha de comando Linux
- Editor de texto como nano ou vim
Entendendo os limites de recursos do PHP-FPM
O PHP-FPM (FastCGI Process Manager) gerencia processos PHP em seu servidor VPS, controlando como os recursos são alocados para cada aplicação web. Configurar corretamente estes limites é fundamental para evitar problemas como uso excessivo de memória, tempos de resposta lentos ou até mesmo quedas do servidor.
Os principais parâmetros que você pode ajustar incluem:
- pm.max_children: número máximo de processos PHP-FPM que podem ser executados simultaneamente
- pm.start_servers: quantidade de processos PHP-FPM iniciados automaticamente
- pm.min_spare_servers: número mínimo de processos ociosos mantidos disponíveis
- pm.max_spare_servers: número máximo de processos ociosos permitidos
- pm.max_requests: número máximo de requisições que um processo atenderá antes de ser reiniciado
- memory_limit: quantidade máxima de memória que um script PHP pode consumir
- max_execution_time: tempo máximo (em segundos) que um script pode executar
Vamos aprender a configurar cada um desses parâmetros de forma otimizada para seu ambiente VPS.
Localizando e entendendo os arquivos de configuração do PHP-FPM
A otimização dos limites de recursos do PHP-FPM começa pela localização dos arquivos de configuração corretos. Dependendo da distribuição Linux, esses arquivos podem estar em diferentes locais.
Primeiro, vamos identificar onde estão os arquivos de configuração do PHP-FPM:
find /etc -name "php-fpm.conf" -o -name "www.conf"
Na maioria das distribuições, você encontrará:
- O arquivo principal de configuração em
/etc/php/[versão]/fpm/php-fpm.conf - Configurações de pool em
/etc/php/[versão]/fpm/pool.d/www.conf
Para Ubuntu e Debian, a estrutura típica é:
ls -la /etc/php/8.1/fpm/
Para CentOS e RHEL:
ls -la /etc/php-fpm.d/
Calculando valores ideais para o gerenciamento de processos
A configuração do gerenciamento de processos (PM) do PHP-FPM deve ser baseada nos recursos disponíveis em seu VPS. Vamos calcular valores otimizados para diferentes cenários.
Primeiro, verifique a memória total disponível em seu VPS:
free -m
O resultado será semelhante a:
total used free shared buff/cache available
Mem: 3951 687 867 21 2396 3006
Swap: 2047 0 2047
Agora, determine quanto de memória cada processo PHP-FPM consome em média:
ps -ylC php-fpm --sort:rss
Calcule o valor ideal para pm.max_children usando a fórmula:
pm.max_children = (Total RAM - Memória para o SO e outros serviços) / Memória média por processo PHP-FPM
Por exemplo, para um VPS com 4GB de RAM, reservando 1GB para o sistema e outros serviços, e considerando que cada processo PHP-FPM consome em média 50MB:
pm.max_children = (4096MB - 1024MB) / 50MB = 61.44 ≈ 60
Configurando o pool padrão do PHP-FPM
Vamos editar o arquivo de configuração do pool padrão (geralmente chamado www.conf):
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
Localize a seção de gerenciamento de processos e ajuste os valores conforme calculado:
; Escolha o método de gerenciamento de processos
pm = dynamic
; Número máximo de processos filhos
pm.max_children = 60
; Número de processos filhos criados na inicialização
pm.start_servers = 15
; Número mínimo de processos filhos ociosos
pm.min_spare_servers = 10
; Número máximo de processos filhos ociosos
pm.max_spare_servers = 20
; Número de requisições que cada processo filho atenderá antes de ser reciclado
pm.max_requests = 500
Salve o arquivo e continue com as próximas configurações.
Otimizando limites de memória e tempo de execução
A configuração de limites de memória e tempo de execução é crucial para evitar que scripts problemáticos consumam recursos excessivos do servidor. Vamos ajustar esses parâmetros no arquivo php.ini específico do PHP-FPM:
sudo nano /etc/php/8.1/fpm/php.ini
Localize e ajuste os seguintes parâmetros:
; Limite máximo de memória que um script pode consumir
memory_limit = 256M
; Tempo máximo de execução de um script em segundos
max_execution_time = 60
; Tempo máximo para análise de dados de entrada
max_input_time = 60
; Tamanho máximo de upload de arquivos
upload_max_filesize = 20M
; Tamanho máximo de dados POST
post_max_size = 20M
Atenção: Estes valores são recomendações gerais. Ajuste-os de acordo com as necessidades específicas das suas aplicações. Sites WordPress com muitos plugins podem precisar de limites maiores, enquanto aplicações simples podem funcionar bem com valores menores.
Configurando limites por site com pools personalizados
Uma das grandes vantagens do PHP-FPM é a capacidade de criar pools separados para diferentes sites, cada um com seus próprios limites de recursos. Isso é especialmente útil em VPS que hospedam múltiplos sites com requisitos diferentes.
Vamos criar um pool personalizado para um site específico:
sudo nano /etc/php/8.1/fpm/pool.d/meusite.conf
Adicione a seguinte configuração, ajustando conforme necessário:
[meusite]
user = www-data
group = www-data
listen = /run/php/php8.1-fpm-meusite.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 30
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500
; Limites específicos para este site
php_admin_value[memory_limit] = 512M
php_admin_value[max_execution_time] = 120
php_admin_value[upload_max_filesize] = 50M
php_admin_value[post_max_size] = 50M
; Caminho para logs específicos deste site
php_admin_value[error_log] = /var/log/php/meusite-error.log
php_flag[log_errors] = on
Certifique-se de que o diretório de logs existe:
sudo mkdir -p /var/log/php
sudo chown www-data:www-data /var/log/php
Configurando limites de requisições simultâneas e conexões
O gerenciamento adequado de requisições simultâneas é fundamental para manter seu VPS responsivo mesmo durante picos de tráfego. Vamos configurar parâmetros adicionais para controlar esse aspecto.
Edite o arquivo de configuração principal do PHP-FPM:
sudo nano /etc/php/8.1/fpm/php-fpm.conf
Ajuste os seguintes parâmetros na seção [global]:
; Número máximo de requisições simultâneas
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s
; Limite de arquivos abertos
rlimit_files = 4096
; Limite de processos filhos
rlimit_core = unlimited
Para configurar limites de conexão específicos para cada pool, edite o arquivo do pool:
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
Adicione ou ajuste as seguintes linhas:
; Limite de requisições por segundo
request_terminate_timeout = 300
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slowlog-www.log
; Limite de conexões por IP
; Descomente e ajuste conforme necessário
;pm.max_requests = 500
Monitorando e ajustando os limites de recursos
Configurar os limites de recursos é apenas o primeiro passo. É igualmente importante monitorar o desempenho do PHP-FPM e ajustar as configurações conforme necessário.
Habilite o status do PHP-FPM para monitoramento:
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
Adicione ou descomente as seguintes linhas:
pm.status_path = /status
ping.path = /ping
ping.response = pong
Configure seu servidor web para acessar essas páginas de status. Para Nginx, adicione ao bloco de servidor:
location ~ ^/(status|ping)$ {
access_log off;
allow 127.0.0.1;
deny all;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
Para monitorar o uso de recursos em tempo real, você pode usar ferramentas como:
sudo apt install htop sysstat
htop
Para monitorar especificamente o PHP-FPM:
curl -s http://localhost/status?full
Ajustando limites com base em dados de desempenho
Após monitorar seu servidor por alguns dias, você pode precisar ajustar os limites com base nos dados coletados:
- Se o uso de memória estiver consistentemente alto, considere aumentar o valor de
memory_limitou reduzirpm.max_children - Se muitos processos estiverem sendo criados e destruídos frequentemente, ajuste
pm.min_spare_serversepm.max_spare_servers - Se os scripts estiverem atingindo o tempo limite, aumente
max_execution_time - Se o servidor estiver lento durante picos de tráfego, considere aumentar
pm.max_children(se houver memória disponível)
Problemas comuns e como resolver
Sintoma: Erro "503 Service Temporarily Unavailable"
Causa: Geralmente ocorre quando todos os processos PHP-FPM estão ocupados ou quando o PHP-FPM não está em execução.
Solução: Aumente o valor de pm.max_children e verifique se o serviço PHP-FPM está em execução com sudo systemctl status php8.1-fpm. Se necessário, reinicie o serviço com sudo systemctl restart php8.1-fpm.
Sintoma: Erro "Fatal error: Allowed memory size exhausted"
Causa: O script PHP está tentando usar mais memória do que o permitido pela configuração memory_limit.
Solução: Aumente o valor de memory_limit no php.ini ou no pool específico. Também verifique se há vazamentos de memória no código da aplicação.
Sintoma: Servidor lento ou travando durante picos de tráfego
Causa: Configuração inadequada de pm.max_children ou memory_limit muito alto, permitindo que o PHP-FPM consuma toda a memória disponível.
Solução: Recalcule pm.max_children com base na memória disponível e no consumo médio por processo. Considere adicionar mais RAM ao seu VPS se necessário.
Sintoma: Processos PHP-FPM sendo encerrados pelo sistema (OOM Killer)
Causa: O sistema está ficando sem memória e o kernel Linux está matando processos para liberar recursos.
Solução: Reduza pm.max_children ou aumente a memória do VPS. Verifique os logs do sistema com dmesg | grep -i kill para identificar quais processos estão sendo encerrados.
Sintoma: Tempo de resposta inconsistente
Causa: Número insuficiente de processos PHP-FPM ociosos para lidar com picos de tráfego.
Solução: Aumente pm.start_servers e pm.min_spare_servers para garantir que haja processos suficientes disponíveis para atender novas requisições imediatamente.
Perguntas frequentes sobre limites de recursos no PHP-FPM
Qual é o limite de memória recomendado para PHP-FPM em um VPS com 4GB de RAM?
Para um VPS com 4GB de RAM, recomenda-se configurar o limite de memória do PHP-FPM entre 256MB e 512MB por processo. Esta configuração permite múltiplos processos PHP simultâneos sem esgotar a memória do sistema, mantendo recursos para outros serviços essenciais.
Como identificar se meu site está sofrendo com limites de recursos PHP-FPM inadequados?
Verifique os logs de erro do PHP (/var/log/php-fpm/error.log) buscando mensagens como 'allowed memory size exhausted' ou 'maximum execution time exceeded'. Também observe o uso de memória e CPU no servidor durante picos de tráfego, e monitore se há processos PHP-FPM sendo encerrados abruptamente pelo sistema.
É possível configurar limites diferentes para cada site no mesmo servidor PHP-FPM?
Sim, é possível configurar limites diferentes para cada site criando pools PHP-FPM separados. Cada pool pode ter suas próprias configurações de memória, tempo de execução e número máximo de processos, permitindo alocar mais recursos para sites críticos e limitar sites menos importantes.
Qual é a diferença entre configurar limites no php.ini e no pool do PHP-FPM?
As configurações no php.ini aplicam-se globalmente a todas as instâncias PHP, incluindo CLI, enquanto as configurações no pool do PHP-FPM (www.conf ou arquivos personalizados em pool.d/) aplicam-se apenas aos processos daquele pool específico. Para controle granular em ambiente de produção, priorize as configurações no nível do pool.
Com que frequência devo revisar e ajustar os limites de recursos do PHP-FPM?
Recomenda-se revisar os limites de recursos do PHP-FPM a cada 3-6 meses ou após mudanças significativas como: atualizações de aplicações, aumento de tráfego, migração de conteúdo ou adição de plugins/extensões. Também monitore regularmente o uso de recursos para identificar tendências e ajustar proativamente antes que problemas ocorram.
Conclusão
- A configuração adequada dos limites de recursos do PHP-FPM é essencial para garantir o desempenho e a estabilidade de aplicações web em servidores VPS Linux.
- Ajuste os parâmetros com base nos recursos disponíveis em seu VPS e nas necessidades específicas de suas aplicações, monitorando regularmente o desempenho para fazer ajustes quando necessário.
- Utilize pools separados para diferentes sites quando possível, permitindo uma alocação mais eficiente de recursos e isolamento entre aplicações.
Lembre-se de que não existe uma configuração universal ideal para todos os cenários. A otimização dos limites de recursos do PHP-FPM é um processo contínuo que deve ser ajustado conforme sua aplicação evolui e seus padrões de tráfego mudam.
Precisa de ajuda com a otimização do seu servidor VPS?
Configurar corretamente os limites de recursos do PHP-FPM pode ser desafiador, especialmente para ambientes de produção com requisitos específicos. A AviraHost oferece servidores VPS otimizados e suporte técnico especializado para garantir o melhor desempenho para suas aplicações.