Nginx 认为 php-fcgi 进程已死,但脚本仍然运行

Nginx 认为 php-fcgi 进程已死,但脚本仍然运行

好吧,这个标题有点奇怪,但问题也很奇怪。

我们有两台服务器设置(www01 和 www02),均以 php-fcgi 形式运行 nginx 和 php。

Nginx 配置为如果当前主机上的 php-fcgi 进程在 60 秒内没有响应,则将请求重定向到另一台主机。

根据我们的日志,发生了什么:用户在 www01 上并向 www01 提交表单。php-fcgi 进程没有响应,请求由 nginx 转发到 www02。php-fcgi 再次没有响应,请求被发送回 www01。php-fcgi 再次没有响应,请求最终再次到达 www02。事情就这样结束了。

但奇怪的是:根据我们的数据库,表单确实已提交,并且 php 应用程序运行正常,因为表单提交的数据在数据库中插入了 4 次(!),每条记录都在一分钟内创建。

我们在日志中找不到任何内容,除了 nginx 错误日志,nginx 记录了它从 www01/www02 收到上游错误,因为 php-fcgi 没有响应并将请求转发到其他主机。但没有 PHP 错误,没有异常消息,甚至没有警告。

怎么会这样?为什么 nginx 认为 php-fcgi 没有响应,但应用程序仍然运行?

我们怎样才能防止这种情况再次发生?

答案1

您的 PHP 脚本正在执行多少处理?如果处理该表单数据需要 61 秒,nginx 当然会看到 60 秒过去,假设发生了一些不好的事情,然后将请求发送到您的其他服务器。

PHP 如何响应请求?如果它什么都没发送,nginx 可能会将其解释为“尚无响应”,然后在等待 60 秒后再次将请求发送到另一台服务器。

尝试关闭 nginx 中的重定向,看看当 nginx 只是简单地将您的表单提交反向代理到其背后的单个 php-fcgi 实例时会发生什么。当神秘的事情发生时,像这样简化您的设置通常是一种很好的方法,可以找出意外结果的来源和来源。如果在这个简化的场景中一切正常,那么我建议仔细检查您的重定向设置。

如果您仍然无法弄清楚,我建议您发布您的 nginx 配置,以便我们更好地帮助您;有关 PHP 脚本本身的更多详细信息也会帮助我们帮助您。

相关内容