一旦池达到 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
过程这么长时间。