我想对长轮询请求做一些澄清。我为长轮询编写了一个脚本,我在nginx(使用标准配置)上尝试了它并且它可以工作。我注意到了一些事情。如果服务器没有响应60秒后nginx在日志浏览器中返回503错误,可能(或应该)不会永远不会使请求过期,但仅在服务器响应时?如果有可能,我该怎么办?如果不可能,你建议我延长请求,直到服务器停止(60秒)或之前(表明多长时间)?如果之前,您如何建议我终止申请?
答案 0 :(得分:5)
client_body_timeout和client_header_timeout可能就是你要找的东西
client_body_timeout 1m; # or 60s
client_header_timeout 1m;
将这些值更改为您想要的时间,但更常用的方法是例如60秒,然后服务器发送空响应(终止连接),然后客户端重新启动新请求,这也将持续另一个60秒等等,因为我相信如果用户没有结束请求但实际上关闭浏览器,例如,你会有很多无用的打开连接等待超时。
修改强>:
不要让请求到期为nginx,让应用程序发送响应,否则你将得到504错误而不是200成功。如果你想进行60秒的长轮询然后将nginx设置为90或120秒,那么当应用程序超过60秒时它应该发送一个空输出,或者可能是一条消息说没有消息像'结束'或'停止',然后javascript应在收到停止消息后发起新请求。还有一些javascript你可以使服务器发送多个消息而不通过使用分隔符或其他东西终止连接,
另外我想告诉你,一种方法适用于所有工作,但并不总是好的,像chrome和firefox这样的浏览器可以使用像Server Sent Events或Web Sockets这样的更高级的方法,有很多解析器库可以检查当前浏览器支持哪些功能并使用最好的功能,如果您要使用服务器发送的事件,例如IE中不支持,您可以使用this example等方式轻松处理只在IE中回归长期民意调查。