Estou executando um servidor CentOS 6 de 64 bits com CPU de 1,2 GHz e 2,4 GB de RAM. O servidor roda o nginx e o php-fpm com a extensão APC e também o mysql.
Há algumas semanas, o servidor começou a lançar continuamente 500 erros em solicitações HTTP; O Google WMT estava relatando cerca de 450 erros de servidor em erros de rastreamento. Se você estava navegando no site, um erro foi lançado a cada 3-4 páginas.
Foi assim que o php-fpm foi configurado:
pm = dynamic
pm.max_children = 45
pm.start_servers = 15
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 1000
Depois de verificar os logs, achei no log de erros do php-fpm que esses eram os dois erros mais frequentes:
ERROR: fork() failed: Cannot allocate memory (12)
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 30 total children
WARNING: [pool www] child 27455 exited on signal 11 (SIGSEGV) after 8393.397161 seconds from start
Eu segui a recomendação do log e aumentei os valores acima para isso:
pm = dynamic
pm.max_children = 70
pm.start_servers = 25
pm.min_spare_servers = 15
pm.max_spare_servers = 25
pm.max_requests = 1000
Diminuiu a frequência de erros, mas não de forma significativa.
Depois de fazer mais pesquisas descobri que uma das razões para o erro "Não é possível alocar memória" poderia ser uma incompatibilidade entre o PHP 5.4 instalado e o APC 3.1.9, então fui em frente e atualizei o APC para a versão 3.1.13, que relatou compatibilidade com o PHP 5.4. Isso fez com que o erro "Não é possível alocar memória" desaparecesse completamente, mas ainda estava lançando falhas de segmentação do código 11.
Descobri que o valor de pm.max_requests poderia ser muito alto, então diminuí para:
pm.max_requests = 600
Mais uma vez, diminuiu a frequência de erros lançados, mas não significativamente.
Depois de ler um pouco mais de recomendações, instalei o Varnish como front-end para o servidor da web. Isto marcou uma diminuição significativa nos erros, mas os logs mostram que o erro de segfault do código 11 ainda é lançado uma vez a cada 2-3 horas ou mais. Isso significa que ainda há usuários que recebem erros do servidor quando tentam visualizar meu website. Gostaria de saber se há outras otimizações que posso fazer no meu servidor da Web.
Outras informações que podem ser úteis:
Estou recebendo cerca de 2000 visitantes únicos diários, mas também recebo um alto nível de ataques de spam no meu site. Eu configurei o Cloudflare como proxy na frente do meu servidor e desde que o nível de spam diminuiu significativamente. Eu também uso o MaxCDN para arquivos estáticos, como scripts ou imagens, de modo que geralmente não são solicitados ao servidor web.