O PHP-FPM com pedido longo de balanceamento de carga nginx bloqueia todos os outros pedidos

1

Eu tenho três servidores, o balanceador de carga executa o nginx e passa as solicitações do PHP para um dos dois servidores que executam o php-fpm.

Na verdade, eu estava tentando testar a simultaneidade, então o script php em cada servidor PHP-FPM mostra um horário de início e término, bem como o nome do host, e após o horário de início ele usa 100% de CPU para 5 segundos antes de ecoar a hora final.

Nenhum servidor atinge 100% da CPU simultaneamente para 4 solicitações simultâneas e os timestamps mostram que são atendidos consecutivamente, o que me faz pensar que o nginx e o fastcgi estão bloqueando todas as conexões simultâneas.

A execução de ab com 100 conexões simultâneas vê todos os processos em um servidor PHP-FPM (de um total de 10 disponíveis) em processamento e o outro servidor está completamente silencioso, sem fazer nada.

O nginx conf é:

upstream  backend  {
     server   192.168.1.60:9000;
    server   192.168.1.61:9000;  
}

server {
    listen   80;
    server_name  localhost;
    access_log  /var/log/nginx/localhost.access.log;

    location / {
        root   /var/www;
        index  index.php;
    }


    location ~ .php$ {
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass   backend;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
        include fastcgi_params;
    }

}
    
por Paul Ridgway 14.08.2011 / 23:00

3 respostas

1

Não passe FCGI pela rede; use HTTP regular por quanto tempo puder. Você está entrando em águas mal testadas do jeito que você está indo.

De qualquer forma, eu realmente não recomendo usar o nginx como balanceador de carga. Realmente não é a melhor (ou até mesmo uma "boa o suficiente") ferramenta para o trabalho. Eu acho que a melhor opção é Linux Virtual Server , pois é transparente para as conexões TCP e extremamente rápido, mas se isso está fora da mesa para alguma razão, pelo menos use haproxy .

    
por 14.08.2011 / 23:20
0

Eu sugiro que você faça o oposto. Deixe este servidor como um balanceador de carga e faça a configuração do FPM apenas nos back-ends. O FastCGI é mais bem servido se o nginx e o fpm estiverem no mesmo servidor falando sobre sockets ou localhost, então é algo parecido com essa configuração:

                          ---- backend 1 with nginx + php fpm
server with two backends |
                          ---- backend 2 with nginx + php fpm

Dessa forma, se houver algo bloqueando um dos back-ends, isso não afetará o segundo, e o balanceador de carga continuará a fornecer material dele. Certifique-se também de ajustar o número de crianças fpm mesmo se você estiver usando as configurações dinâmicas.

    
por 14.08.2011 / 23:17
0

Se você realmente precisa farm out para servidores FastCGI em vez de caixas nginx + php-fpm, você pode tentar o módulo justo para nginx encontrado aqui . O plugin avalia o tempo de reposicionamento de cada um dos backends e gira respectivamente. Observe que isso exigirá que você recompile o nginx.

Se você não quiser isso, certifique-se de que pelo menos não está usando a diretiva ip_hash , pois você não será rotacionado ao solicitar uma referência (já que o IP de origem é sempre o mesmo) e tente least_conn (encontrado em nginx > = 1.2.2). Mais informações aqui . Finalmente, ajuste seus critérios para o nginx selecionando o próximo servidor usando fastcgi_next_upstream

fastcgi_next_upstream timeout http_503 http_500 invalid_header

para reduzir os tempos limite em nós excessivamente carregados. Mais sobre isso, aqui

    
por 25.11.2012 / 19:27