Lighttpd
如何擺脫 CGI 輸出上的 TCP 或 lighttpd 4KB 緩衝?
我在 EC2 上執行的 Amazon Linux AMI 上安裝了一個 stock lighttpd。我所做的唯一配置更改是啟用 CGI 支持。
然後有一個自定義 CGI 工具(用 C 編寫)放在 /cgi-bin/ 中,從外部世界呼叫它並輸出 gzip’ed JSON。這個工具有規律地輸出數據,比如每 10-20 秒,但每次只有幾百個字節。
問題在於,在 CGI 標準輸出和 lighttpd 返回給客戶端的內容之間的某處,事物被緩衝並一次到達大約 4KB。不幸的是,這個系統落後於 Amazon Elastic Load Balancer,它不允許超過 60 秒的空閒連接。由於緩衝,就好像伺服器在前 60 秒內沒有返回任何內容,因此連接被終止,客戶端什麼也得不到。
那麼如何追踪這個緩衝設置並顯著減少呢?我嘗試更改一些 lighttpd 配置參數,甚至更改核心中的“net.ipv4.tcp_wmem”,但似乎沒有任何效果。
strace 啟用跟隨的 lighttpd 程序:
strace -f -tt -p PDOFLIGHTTPD
您將獲得顯示由 lighttpd 和 CGI 進行的每個系統呼叫的輸出。微秒時間戳應指示 CGI 何時返回數據以及 lighttpd 何時將其寫回客戶端。如果問題是上游的(如果您看到 lighttpd 幾乎立即發回數據等),這也會回答。
當我過去在 Perl 中編寫 cgi 時,這是我必須包含在 perl 腳本中的設置。在 perl 中是
$|=1
. 你可能需要在 C 中做同樣的事情。你可能想在Stack Overflow上提問。