Nginx作为长轮询时的反向代理

时间:2011-01-22 04:15:27

标签: php apache nginx long-polling

我有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中保持Connection keep-alive。

如何让nginx立即给出apache的响应?

希望问题很明确。

感谢。

3 个答案:

答案 0 :(得分:6)

您是否在nginx中尝试过proxy_buffering?不确定它是否会关闭连接,但至少响应将被传输到客户端。 : - )

答案 1 :(得分:0)

在fastcgi或reverse_proxy方案中使用时,Nginx不支持PHP中的任何flush()方法。

我在nginx / 0.8.49下测试了所有许多proxy_buffering_ *,buffer_size_ *配置但没有成功。它将一直等到PHP进程退出。

答案 2 :(得分:0)

如果您的内容很大,则必须调整代理缓冲区

client closed prematurely connection while sending to client, in nginx