Apache 過早關閉連接
我正在嘗試調試一些嵌入式設備在無線下載韌體並過早關閉連接時遇到的問題,無法獲取所有數據。
我嘗試使用 curl 和 wget 下載文件,但下載時沒有問題並且校驗和匹配。
我能找到的唯一“提示”是當我使用詳細選項 (-v) 執行 curl 時。我創建了一個包含虛擬內容的文件,多次只包含單詞 dummy。
當我執行時,
curl -v http://myserver/dummy.txt
我得到以下響應:
dummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummClosing connection #0 ydummydummydummydummydummydummydummydummydummydummydummydummydummy
為什麼數據結束前有“正在關閉連接#0”?
apache 版本是 2.2,我們前面也有 HAProxy,但是如果我在機器上本地捲曲,我會遇到同樣的“問題”。
TLDR:您看到的只是終端上的顯示偽影,沒有任何跡象表明您的網路伺服器或 HAproxy 過早關閉連接有任何問題。
我認為這與輸出緩衝的反直覺效果相去甚遠。
Linux glibc 的預設行為是在標準輸出發送到 TTY 時進行**行緩衝。**這將緩衝輸出並僅在以下任一情況下在終端上顯示數據塊:
- 觀察到行尾
- 輸出緩衝區已滿
- 程序終止。
如果“關閉連接”消息發送到**標準錯誤並立即顯示,**但您的 URL 中的最後一點內容僅在 curl 終止時才從緩衝區中出來,我不會感到驚訝。
當您更改緩衝
stdbuff
並使錯誤和輸出模式無緩衝時,您可能會看到更直覺和順序的結果:stdbuf -o0 -e0 curl -v http://myserver/dummy.txt
但是,當您更改數據以包含更多換行符時:
dummy dummy dummy ...