PHP-FPM + NGINX: Processos PHP-CGI morrem após um tempo em inativo, em seguida, 502 gateway inválido e reinicialização manual são necessários

1

Atualmente, estou configurando um VPS (com VPS.NET), que usarei para hospedar um blog e outras coisas. Eu instalei o nginx e fiz o patch php (5.2.8) com o php-fpm.

Tudo funciona muito bem (e extremamente rápido!), além de um problema chato: porque o site não tem outro tráfego além do meu por enquanto, depois de um tempo ele ficou ocioso todos os processos php-cgi morrem. Assim que eu tento visitar o site, o nginx retorna um "502 bad gateway" legal, e para consertar eu tenho que manualmente reiniciar o php-fpm para fazer o site funcionar novamente. Por que é que? Eu vi que isso é de alguma forma um problema comum, mas depois de alguns dias procurando uma solução no meu tempo livre, não encontrei nenhuma que funcione para mim.

Alguma sugestão? Agradecemos antecipadamente

    
por Vito Botta 24.07.2009 / 00:27

2 respostas

1

Estou executando uma configuração muito semelhante (nginx 0.7.61, php + fpm 5.2.10) e meus processos PHP nunca morrem, mesmo depois de ficar ocioso.

Os bits de controle de processo do meu php-fpm.conf são os seguintes:

<value name="pm">
    <value name="style">static</value>
    <value name="max_children">3</value>
    <value name="apache_like">
        <value name="StartServers">20</value>
        <value name="MinSpareServers">5</value>
        <value name="MaxSpareServers">35</value>
    </value>
</value>
<value name="request_terminate_timeout">0s</value>
<value name="request_slowlog_timeout">0s</value>
<value name="slowlog">logs/slow.log</value>
<value name="rlimit_files">1024</value>
<value name="rlimit_core">0</value>
<value name="chroot"></value>
<value name="chdir"></value>
<value name="catch_workers_output">yes</value>
<value name="max_requests">500</value>

Observe que, embora eu tenha os bits semelhantes ao apache definidos (eles faziam parte da configuração padrão), eles não são usados porque tenho um conjunto estático de estilo PM.

Você pode ativar os registros para o nível de depuração usando isso na seção de opções globais:

<value name="log_level">debug</value>

para ver se há um motivo relatado de que está desligando funcionários.

Uma correção trancada, se isso não funcionar, seria ter um serviço como o pingdom acessando um php em seu site a cada x minutos, mas minha experiência com esse software não sugere que isso seja necessário.

    
por 24.07.2009 / 11:40
0

Não tenho certeza de como o PHP-FPM difere do PHP padrão no modo fastcgi, mas normalmente, cada processo PHP servirá apenas um número limitado de solicitações antes de terminar. Isso evita que vazamentos de memória se acumulem com o tempo. Isso funciona muito bem, a menos que você tenha apenas um processo PHP. Nesse caso, ele é executado até que seja completado sua cota de solicitações e depois é encerrado. Você deve procurar para ver se você tem um único processo em execução ou se você tem vários. Se você tiver vários, ignore isso. Se você tem apenas um, você precisa ter certeza de que a variável de ambiente PHP_FCGI_CHILDREN é exportada antes de iniciar o PHP. PHP_FCGI_MAX_REQUESTS controla o número de solicitações que cada processo individual executará.

    
por 24.07.2009 / 10:08