【发布时间】:2016-04-12 05:10:30
【问题描述】:
运行 nginx 1.9.* / PHP 7.0.*(但在 5.6.* 中的行为也完全相同)
尝试在维护期间优雅地停止 PHP-FPM / nginx 组合以关闭节点。为此,我将 SIGQUIT 发送到 php-fpm,它应该 提供正常关闭。
为了测试这个,我做了一个愚蠢的脚本
<?php sleep(5); echo 'done';
使用以下 curl 在本地测试
curl -I x.x.x.x:8080
通常会产生输出:
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 12 Apr 2016 04:48:00 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Desired:在任何正在进行的请求的中间,当请求正常关闭时,当前请求应该完成,但任何其他请求都应该失败。
不幸的是,当我尝试通过向 PHP-FPM 主进程发送 SIGQUIT (http://manpages.ubuntu.com/manpages/precise/man8/php5-fpm.8.html) 来触发此行为时:
kill -s SIGQUIT $FPMPID
连接立即断开,导致 ngnix 502
HTTP/1.1 502 Bad Gateway
Server: nginx
Date: Tue, 12 Apr 2016 04:48:07 GMT
Content-Type: text/html
Content-Length: 166
Connection: close
有什么建议吗?我希望使系统的这一部分尽可能无缝。谢谢!
【问题讨论】:
-
附加链接已失效 (503),此处总结的进程信号:forum.nginx.org/read.php?3,3485,template=head%3F%3F。
-
是的。 bugs.php.net/bug.php?id=41593,对我来说更重要的是,bugs.php.net/bug.php?id=60961。我不知道它们之间的关系到底如何(以及是否相关),但不幸的是 PHP-FPM 有它的小烦恼。
-
我可以向您建议一些解决方法。它不是修复 php-fpm,而是帮助回答 200 :) 您只需要在具有 2-3 个后端的 nginx 配置中设置
upstream(它可以是相同的 php-fpm 池几次)。因此,如果其中一个请求失败,nginx 将尝试再次请求后端。