As solicitações nunca são enfileiradas após pm.max_children com Nginx e PHP-FPM

5

Assim que um pool atinge pm.max_children, o Nginx começa a exceder o tempo limite ao tentar enviar novos pedidos para o PHP-FPM. "max listen queue" é sempre 0 na página php-status.

  • PHP-FPM 5.5.16
  • Nginx 1.6.1

Aqui está o exemplo de um pool php-fpm:

[example]

catch_workers_output = no

; Configure listener
listen = /var/run/php-fpm/example.sock
listen.backlog = 65535
listen.owner = nginx
listen.group = nginx

; Unix user/group of processes
user = nginx
group = nginx

; Choose how the process manager will control the number of child processes.
pm = ondemand
pm.max_children = 10
pm.max_requests = 200
pm.process_idle_timeout = 30s
pm.status_path = /status

; Pass environment variables
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

; Host specific php ini settings here
php_admin_flag[log_errors] = on
php_admin_value[open_basedir] = /tmp:/var/www/apc:/var/www/wordpress/example
php_admin_value[error_log] = /var/log/php-fpm/example.log
    
por pembo13 24.08.2014 / 12:26

1 resposta

1

Como esta questão ainda aparece nas perguntas não respondidas, tentarei uma resposta desatualizada. Mostrar um erro é o comportamento pretendido da configuração "pm.max_children", de acordo com o manual do PHP :

The number of child processes ... to be created when pm is set to dynamic.

This option sets the limit on the number of simultaneous requests that will be served.

No entanto, cada solicitação deve ser tratada rapidamente, para que o processo fique livre para a próxima solicitação. Caso contrário, nginx provavelmente reportará um "502 Bad Gateway" assim que não conseguir mais solicitações.

Verifique novamente o valor definido na configuração php-fpm de listen.backlog . Isso define o tamanho da fila ( referência ):

The backlog argument defines the maximum length to which the queue of pending connections

No entanto, esse valor é limitado pelo sistema subjacente. Veja:

sysctl net.core.somaxconn

Até onde eu sei, não há como enfileirar um pedido para o upstream ( php-fpm ), se isso gerar um erro. No entanto, você pode dizer ao nginx para mudar para outro processo, se o erro ocorrer. Isso pode acionar um recarregamento do lado do cliente, por exemplo.

Se não for a configuração listen-backlog / net.core.somaxconn , a pergunta real, no entanto, é por que as solicitações bloqueiam o processo php-fpm por tanto tempo.

    
por 20.01.2018 / 20:57