【问题标题】:Nginx as a reverse-proxy while long-pollingNginx 在长轮询时作为反向代理
【发布时间】:2011-06-13 13:28:47
【问题描述】:

我有 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 给出响应?

希望问题很清楚。

谢谢。

【问题讨论】:

  • 你试过在 nginx 中关闭 proxy_buffering 吗?不确定它会关闭连接,但至少响应会按原样传输给客户端。
  • @regilero 这行得通!我想结合一些location 指令,我将获得用于休息内容的代理缓冲和为我的脚本工作的解决方案。您应该将此作为答案发布。

标签: php apache nginx long-polling


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • Nginx 与 php 作为 fastcgi 使用时不支持输出缓冲控制?
    【解决方案3】:

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

    client closed prematurely connection while sending to client, in nginx

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多