Nginx
通過 nginx 獲取分塊請求
首先是一些背景知識:我們有一個嵌入式設備,可以將許多小事件上傳到 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 實際上是否在緩衝,或者後端的行為是否已經改變一些理由。