Nginx

通過 nginx 獲取分塊請求

  • June 14, 2018

首先是一些背景知識:我們有一個嵌入式設備,可以將許多小事件上傳到 Web 伺服器。分塊編碼用於發布此資訊。每個事件都作為單獨的塊發送,因此網路伺服器(node.js)可以立即對事件做出反應。這一切都像一個魅力。

禁用伺服器並在伺服器上執行 netcat 會顯示設備發送的內容:

sudo nc -l 8080
POST /embedded_endpoint/ HTTP/1.1
Host: url.com
User-Agent: spot/33-dirty
Transfer-Encoding: chunked
Accept: text/x-events
Content-Type: text/x-events
Cache-Control: no-cache

120
{"some","json message"}
232
{"other","json event"}
232
{"and a lot more","up to 150 messages per second!"}
0

現在我在我的網路伺服器(版本 1.6.0)上安裝了 nginx。最後,我希望它處理 SSL,並且我想處理加速正常的網路流量。

如果我現在使用此伺服器配置啟用 nginx:

server {
 listen 8080;

 location / {
   proxy_http_version 1.1;
   expires off;
   proxy_buffering off;
   chunked_transfer_encoding on;
   proxy_pass http://localhost:5000;
 }
}

然後我收到這個:

sudo nc -l 8080
POST /embedded_endpoint/ HTTP/1.1
Host: localhost:5000
Connection: close
Content-Length: 2415
User-Agent: spot/33-dirty
Accept: text/x-events
Content-Type: text/x-events
Cache-Control: no-cache

{"some","json message"}
{"other","json event"}
{"and a lot more","up to 150 messages per second!"}

問題是這是緩衝的,請求現在每 2 秒發送一次。所有消息都包含在內並且可以處理。但是現在有延遲…

我可以指示 nginx 直接轉發我的塊嗎?這只需要發生在這個嵌入式端點上。我知道當您為所有端點禁用它時,nginx 沒有太多用處。

如果您可以升級到 Nginx 1.8.x 或 Nginx 1.9.x,您現在可以使用此指令來禁用請求緩衝:

proxy_request_buffering off

認為這應該可以解決您的問題。

使用proxy_buffering off,nginx 不應該緩衝來自後端的分塊響應。您不需要chunked_transfer_encoding on明確設置,這是預設設置。我要進行診斷的下一步是觀察 nginx 和後端之間的流(快速一點tcpdump -i lo -n port 5000應該可以解決問題),看看 nginx 實際上是否在緩衝,或者後端的行為是否已經改變一些理由。

引用自:https://serverfault.com/questions/624897