我有一个 PHP 脚本,用于处理一些数据。脚本完成所有工作所需的时间取决于用户输入。处理时间通常为 5-15 分钟。
在 Apache 上一切正常,但在 Nginx 上连接就关闭了。当处理时间较短时,一切都很好。问题出在长请求上……
所有日志都没有错误。我怀疑浏览器关闭了连接。
我嗅探了标头,看来 Nginx 在处理完成之前不会发送任何响应。没有一个标头。
我尝试从脚本发送标头,但似乎 nginx 将它们全部缓存了。
之后,我禁用了 PHP 输出缓冲并启用了隐式刷新。我禁用了 gzip 压缩和 zlib。我将 FAST_CGI_BUFFERS 最小化到允许的最小值,即:fastcgi_buffers 2 1k; fastcgi_buffer_size 1k; fastcgi_busy_buffers_size 1k; fastcgi_max_temp_file_size 0;
但它仍然拒绝发送标题......
所以只是为了证明我的观点,在代码中的一个循环中,我对其中一个对象执行了 var_export ...
轰!!!-成功了……
谁能想到更优雅的解决方案?
谢谢。
8 月 19 日更新
发生了一些疯狂的事情。我花了整整两天时间调试它却没有任何结果,之后我尝试了一些我之前就应该做的事情。
我在 Linode 上尝试了这个配置,它有效!
所以问题可能出在 Ubuntu 配置的某个地方...不知道该去哪儿找。
答案1
您必须考虑服务器的超时问题。Nginx 正在关闭连接,因为它认为连接已完成并默默关闭连接。我想到有四个指令可以帮您解决这个问题。
client_body_timeout (default is 65)
client_header_timeout (default is 65)
keepalive_timeout (default is 65)
send_timeout (default is 65)
所有值均以秒为单位。如果其中任何一个起作用,请报告(我个人认为应该是保持活动状态,但请测试)。
答案2
我认为 @Fleshgrinder 的说法是正确的,但是你应该检查特定的 fastcgi 超时参数,如 nginx 的fastcgi_module 文档。具体来说,我会考虑将fastcgi_read_timeout
其默认值从 60 秒增加到 1000 秒,看看是否可以解决问题。