使用Nginx作为反向代理进行长轮询

6

我有一个后端服务器使用Apache运行PHP脚本,还有一个反向代理服务器使用Nginx处理静态内容。有一个PHP脚本给我某个进程的ID,并执行该进程(相当长)。我只需要将该进程的ID传递给浏览器。

  // ...
  ob_start();

  echo json_encode($arResult); // only this data should be passed to browser

  $contentLength = ob_get_length();
  header('Connection: close');
  header('Content-Length: ' . $contentLength);

  ob_end_flush();
  ob_flush();
  flush();
  // then performed a long process

我使用另一个ajax脚本来检查进程的状态。

在单独使用apache时,这个方法运行良好。但是当apache位于nginx后面时,我遇到了问题。在这种情况下,只有当进程完全完成时,我才会得到响应。

nginx设置:

server {
  #...
  proxy_set_header Connection close;

  proxy_pass_header Content-Length;
  #...
}

但是在FireBug中仍然显示连接保持活动状态。

我该如何让nginx立即从apache中获得响应呢?

希望问题清晰明了。

谢谢。


1
你尝试过在nginx中关闭proxy_buffering吗?不确定它是否会关闭连接,但至少响应将按原样传输给客户端。 - regilero
@regilero 这个方法可行!我想结合一些 location 指令,我将为其余内容获得工作代理缓冲和我的脚本的工作解决方案。你应该把这个作为一个答案发布。 - foreline
3个回答

7

您尝试过在nginx中关闭代理缓存吗?不确定它是否会关闭连接,但至少响应将按原样传输给客户端。 :-)


0

0

当在快速CGI或反向代理模式下使用时,Nginx不支持PHP中的任何flush()方法。

我在nginx/0.8.49中尝试了许多proxy_buffering_*,buffer_size_*配置,但没有成功。它总是等到PHP进程退出才完成。


当使用php作为fastcgi时,Nginx不支持输出缓冲控制吗? - foreline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接