Nginx作为反向代理,而长轮询

问题描述:

我有一个Apache作为后端服务器,它运行PHP脚本和Nginx作为反向代理服务器,处理静态内容。 一个php脚本,它给了我一些进程的ID,然后执行这个过程(相当长)。我需要传递给浏览器只有该进程的ID。Nginx作为反向代理,而长轮询

// ... 
    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 2011-01-23 13:43:12

+0

@regilero这个工程!我想结合一些`location`指令,我将为我的脚本获得休息内容和工作解决方案的proxy_buffering。你应该发布这个答案。 – SaltLake 2011-01-23 14:24:18

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

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

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

如果你的内容是大,你必须调整代理缓存

client closed prematurely connection while sending to client, in nginx