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

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

一旦池达到 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

答案1

由于这个问题仍然出现在未回答的问题中,我将尝试使用过时的答案。根据PHP 手册

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

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

但是,每个请求都应该得到快速处理,这样进程就可以腾出时间来处理下一个请求。否则,nginx一旦无法处理更多请求,可能会报告“502 Bad Gateway”。

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

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

但该值受到底层系统的限制。请参阅:

sysctl net.core.somaxconn

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

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

相关内容