无法将 HTTP 响应转发回 HTTP 客户端:用户似乎单击了浏览器中的"停止"按钮



我面临的问题是:

我通过ajax从浏览器发出请求并发送处理请求,一旦ajax调用完成,我显示一个带有进度条的弹出窗口,弹出窗口在页面上大约停留2到4分钟,然后突然关闭。当我通过chrome网络标签看到请求时,我看到请求在弹出窗口显示的相同持续时间内停滞不前。我看到逻辑按照预期在后台执行,但弹出窗口没有等待响应并在应该之前关闭。

我已将日志级别设置为7,我看到以下信息

如果有50条记录要处理,我在这50条记录中的每一条开始处理之前看到该信息。E我看下面的行50次)

[pid=29768 thr=70024879087720 file=abstract_request_handler. p][00:472 time=2016-08-30 08:06:43.250]:在主套接字上接受新请求

最后我看到这个

[pid=29571 thr=139782938920704 file=ext/nginx/HelperAgent.cpp:923 time=2016-08-30 08:10:32.682]:无法将HTTP响应转发回HTTP客户端:似乎用户点击了浏览器中的"停止"按钮

我怀疑这是超时问题,但不确定是乘客级别还是linux级别。

我已经尝试将各种unix超时参数设置为更高的值,但它没有帮助。

  proxy_read_timeout 400s;
  client_body_timeout 180s;
  keepalive_timeout 180s;
  client_header_timeout 180s;
**I suspect it might be some issue with passenger config, but not sure.**

谁能告诉我我该怎么做,这样请求才不会突然结束

这是一个文件上传/下载?对于下载,我在相关位置使用

proxy_buffering             off;
proxy_request_buffering     off;
chunked_transfer_encoding   on;
client_body_timeout         3600;
proxy_read_timeout          900;

对于文件上传,我使用

client_max_body_size    10m;
client_body_timeout     600s;

(警告,如果你有一个返回到关联位置的位置,它应该在第一个位置设置)

还是http上的一种事件?用大块?Keepalive吗?对于块I使用:

proxy_buffering         off;
proxy_buffer_size       4k;
proxy_request_buffering off;
proxy_cache             off;
underscores_in_headers  on;

(关于chunk的信息,NGINX纠正了1.11.2中的一个旧错误,如果chunk带有sub_filter指令)

在浏览器的"网络"选项卡中的"调试窗口"中,请求失败后显示的错误或状态是什么?
状态码和/或响应头?
有时在预览中也会有回复/信息

从你的问题,它不是很清楚谁实际上终止请求-浏览器,nginx甚至乘客本身。

确保长时间运行的HTTP连接不会被垃圾收集和过早关闭的最佳实践是确保某种类型的小数据总是以一定的间隔通过连接发送,例如,尝试每90秒发送几个空格或注释(或其他类似的),并查看是否可以解决问题。

最新更新