Posso fazer o nginx para reenviar o pedido para o FastCGI após alguns segundos?

2

Meu aplicativo FastCGI (PHP-FPM) pode encontrar uma situação em que precise de algum tempo para se recuperar. Gostaria de dizer ao nginx que ele deve aguardar alguns segundos e depois reenviar o pedido para o backend FastCGI.

Eu já experimentei uma configuração hacky em que o nginx está configurado com fastcgi_next_upstream http_503 ( consulte os documentos ) com um desenvolvedor mesma configuração fastcgi duas vezes:

upstream php {
    server 127.0.0.1:9000;
    server 127.0.0.1:9000;
}

location ~ \.php(/|$) {
    fastcgi_pass php;
    fastcgi_next_upstream http_503
}

O aplicativo PHP responderá com 503 quando precisar de algum tempo e espaço, fazendo com que o nginx "avance" para o próximo upstream que aparentemente é o mesmo servidor. Infelizmente, o nginx faz a segunda chamada em milissegundos.

Eu gostaria de atrasar a segunda chamada do nginx em alguns segundos para ter certeza de que o backend do PHP está totalmente instalado e funcionando após a situação errada. Então, como adicionar um atraso adequado antes da segunda tentativa?

Nos bastidores, eu preciso reciclar todo o processo do PHP-FPM devido ao modo como o driver do MongoDB lida com o failover do conjunto de réplicas. É por isso que não consigo lidar com o caso totalmente no nível do PHP, mas preciso liberar o processo do PHP por um curto período.

    
por Ville Mattila 15.07.2013 / 01:36

2 respostas

1

Você pode tentar usar o HttpEchoModule para realizar o que precisa. Então você poderia fazer algo assim:

location ~ \.php(/|$) {
    fastcgi_pass php;
    echo_sleep 3;
    fastcgi_next_upstream http_503;
}
    
por 15.07.2013 / 01:50
0

Não é uma resposta nginx, mas você pode colocar o Varnish como front-end para lidar com esse caso específico. Confira o modo Saint como uma possibilidade.

link

    
por 16.07.2013 / 05:31