2012-04-07 41 views
4

我的設置看起來有點奇怪,但不應該太過牽強: 我有一個服務於php頁面和靜態文件的apache2實例。我有一個節點js服務器處理文件上傳(POST)使用node-formidable。最重要的是,我使用了nginx 1.0.14。 爲了使用節點服務器以php文件形式提供的表單上傳,我決定放置nginx,以便保持相同的域,端口和協議。 所以基本上我有/上傳,我想(直接)管到我的節點js,最好在代理之外。其餘部分由Apache2的服務器handlede:使用nginx proxy_buffering和節點js管道POST身體強大

location /upload { 
    client_max_body_size  10m; 
    client_body_buffer_size  128k; 
    proxy_connect_timeout  600; 
    proxy_send_timeout   600; 
    proxy_read_timeout   600; 
    proxy_buffer_size   4k; 
    proxy_buffers    4 32k; 
    proxy_busy_buffers_size  64k; 
    proxy_temp_file_write_size 64k; 
    send_timeout    600; 
    proxy_buffering    off; 
    proxy_pass https://node_backend; 
} 
location/{ 
    proxy_set_header Host $http_host; 
    proxy_pass https://apache_backend; 
} 

這是基於https://stackoverflow.com/a/1167559

我的問題是,從nginx的nginx的發送它節點JS之前緩衝整個POST請求。我可以驗證這一點,Chrome瀏覽器中的進度指示器在我的節點js命中之前一直高達100%(即時從0-100%(因爲它從本地主機發送到本地主機))。

我不明白爲什麼proxy_buffering off不按我期望的方式工作(它不應該緩衝,而是在收到後將請求傳遞給後端)。

或者......這是否可能以其他方式?

任何提示/幫助非常感謝。

  • 卡斯帕

  • 注: 我使用nginx_tcp_proxy_module這是不是在使用如此廣泛嘗試。 我考慮過使用Varnish,因爲它能夠做我想做的,piping directly to node-js based on url(作者btw。出色的博客文章,非常值得一讀),但是我運行的是https服務器(實際上是兩個),所以我不是如果一定Varnish能做到這一點(不支持https,所以我不得不把它包起來,但是有兩個域(證書),那簡直是不可能的)

回答

1

current docs講清楚只有proxy_buffering指令影響響應的緩衝不請求。

啓用或禁用來自代理服務器的響應緩衝。

緩衝POST請求所需的指令是正確命名爲proxy_request_buffering。再次,從current docs

啓用或禁用客戶端請求主體的緩衝。

(對於卡斯帕的緣故,這是值得注意的proxy_request_buffering指令在nginx的版本1.7.11添加,發佈several years after這個問題被問。)

+0

謝謝!你的回答爲我節省了很多時間。添加'proxy_request_buffering關閉;'在我的服務器塊使它的工作。 – codeKonami 2017-02-28 15:13:45