使用 Nginx 和 PHP-FPM 后,请求永远不会在 pm.max_children 之后排队

pem*_*o13 8 php nginx php-fpm max-requests pool

一旦池达到 pm.max_children,Nginx 就会在尝试向 PHP-FPM 发送新请求时开始超时。“最大侦听队列”在 php-status 页面中始终为 0。

  • PHP-FPM 5.5.16
  • nginx 1.6.1

以下是 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
Run Code Online (Sandbox Code Playgroud)

Bur*_*Leo 3

由于这个问题仍然出现在未回答的问题中,我将尝试使用过时的答案。根据PHP 手册,显示错误是设置“pm.max_children”的预期行为:

pm 设置为动态时要创建的子进程数...。

此选项设置将同时处理的请求数量的限制。

但是,每个请求都应该很快得到处理,这样该进程就可以空闲下来处理下一个请求。如果没有,nginx一旦无法处理更多请求,可能会报告“502 Bad Gateway”。

php-fpm仔细检查配置中设置的值listen.backlog。这定义了队列长度(参考):

backlog 参数定义待处理连接队列的最大长度

但是,该值受到底层系统的限制。看:

sysctl net.core.somaxconn
Run Code Online (Sandbox Code Playgroud)

php-fpm据我所知,如果抛出错误,则无法将请求排队到上游( )。然而,如果发生错误,您可以告诉 nginx 切换到另一个进程。例如,这可能会触发客户端重新加载。

然而,如果不是listen-backlog/net.core.somaxconn设置,那么实际的问题是为什么请求会阻塞进程php-fpm这么长时间。