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 中获得 Connection keep-alive。

我怎样才能让 nginx 立即给出来自 apache 的响应?

希望问题很清楚。

谢谢。

4

3 回答 3

7

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

于 2011-01-23T16:55:05.537 回答
0

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

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

于 2011-01-23T16:59:52.393 回答
0

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

客户端在 nginx 中发送到客户端时过早关闭连接

于 2011-02-17T12:47:48.420 回答