
Eu tenho um cenário em que uso algum JQuery (sim, um projeto muito antigo) que faz de 10 a 100 solicitações HTTP GET assíncronas. Eu apenas os disparo e deixo o navegador controlar quantos estão sendo feitos em paralelo. Não me importo com o desempenho, a ligação é rápida.
No entanto, apenas algumas chamadas serão concluídas, o restante receberá um tempo limite do Gateway 504 do Nginx após cerca de um minuto. Depois disso, "nada" funciona (tudo atinge o tempo limite).
Os logs do php-fpm contêm:
2023-09-20T14:42:16.773528255Z [20-Sep-2023 14:42:16] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
Claro, isso é 5 por padrão (desenvolvimento local). Claro, posso mudar isso para 100 ou 1000, mas realmente não quero isso. Quero que as solicitações esperem, terminem ou expirem, mas não "travem" o php-fpm.
Para o php-fpm usamos docker php:php-8.1-fpm-alpine
. Instalamos algumas extensões (amqp, gd, imagick, memcached, opcache, xdebug e alguns outros . If needed I can retry/rewrite things to be able to test this in a "clean" environment. The PHP config is the default one. I do NOT have a
arquivos www.conf` para o pool (então isso também é apenas o padrão).
docker-compose.yaml
phpfpm:
image: our-own-registry
ports:
- 9000
environment:
xx: xx
volumes:
- .:/opt/project
- ./cachegrinds/:/tmp/cachegrinds
nginx:
image: our-own-registry
volumes:
- ./config/docker-nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
- ./css:/opt/project/css
- ./js:/opt/project/js
- ./images:/opt/project/images
- ./font:/opt/project/font
ports:
- 8880:80
- 8443:443
links:
- phpfpm
Ideia geral da configuração do nginx (posso postar tudo se necessário)
server {
listen *:80;
listen [::]:80;
listen *:443 ssl http2;
listen [::]:443 ssl http2;
server_name xx;
root /opt/project;
location /
{
client_max_body_size 10M;
rewrite .* /dispatch.php break;
include fastcgi_params;
fastcgi_pass phpfpm:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
Meu código javascript é muito simples:
$(".remove-checkbox:checkbox:checked").each(function () {
$.get("file.php?action=xx, function () {
console.log("ok");
}).fail(function () {
console.log("fail");
})
});
O primeiro ponto de entrada possível (no nosso caso: dispatch.php
) possui na linha 1 a, die("test")
portanto nenhum código real é executado.
Então: clico no meu botão e disparo 100 solicitações http (100 caixas de seleção neste caso). Vejo no meu navegador que 2 a 4 foram bem-sucedidos (HTTP 200 com "teste" como resposta). Todos os outros ficam pendentes e depois de um minuto recebem um HTTP 504 do nginx. Esperei 10 minutos, mas mesmo depois desse tempo ainda não consigo fazer mais nada. Qualquer carregamento/atualização de página resultará em 504 após um minuto.
Preciso reiniciar meu php-fpm para fazê-lo funcionar novamente.
Para referência (depois que o problema aconteceu):
/var/www/html # ps auxf
PID USER TIME COMMAND
1 root 0:00 php-fpm: master process (/usr/local/etc/php-fpm.conf)
6 www-data 0:00 php-fpm: pool www
7 www-data 0:00 php-fpm: pool www
8 www-data 0:00 php-fpm: pool www
9 www-data 0:00 php-fpm: pool www
10 www-data 0:00 php-fpm: pool www
11 root 0:00 /bin/sh
17 root 0:00 ps auxf
Então, minha pergunta: não é esperado que os resultados sejam "lentos", mas terminem ou terminem/esgotem o tempo limite? Mas então o php-fpm ainda deve funcionar? Ou isso é de alguma forma esperado?