Nginx
Nginx和fcgiwrap,增量輸出問題
當我在 Apache 下執行 cgi 腳本時,任何輸出都會快速發送到客戶端。但是,當我使用 fcgiwrap 在 nginx 下執行它時,在腳本完成或產生大量輸出之前,似乎什麼都沒有發送到客戶端。特別是在使用 git-http-backend 時,這會導致複製大型儲存庫時網關超時(並且缺少複製較小儲存庫的進度資訊)。
可以使用以下腳本看到此行為。
#!/bin/bash echo "Content-type: text/html" echo while : do echo this is a test. sleep 5 done
在 apache 下,客戶端將每 5 秒獲取一些數據。
在帶有 fcgiwrap 的 nginx 下,我沒有得到任何數據並且網關超時。
nginx 和 fcgiwrap 是來自 Debian Jessie 的軟體包。版本 1.1.0-5 和 1.6.2-5+deb8u4
所以問題
- 有誰知道這是造成這種行為的原因?nginx本身?fcgiwrap?兩個都?
- 是否可以通過配置修復?
- 如果是 fcgiwrap 問題,是否有其他可用的 cgi 包裝器不會出現問題?
好的,想通了。似乎 nginx 和 fcgiwrap 都有不受歡迎的緩衝。對於 nginx,它似乎可以通過配置禁用,而 fcgiwrap 需要更新檔。
我在http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863478發布了 fcgiwrap 的 debdiff,這增加了一個新選項 NO_BUFFERING
(更新:Debian 現在已經應用了上述更新檔,因此如果您正在執行 Debian Buster 或更高版本,則不需要自己應用它)。
然後 nginx 配置需要更改以將 NO_BUFFERING 選項傳遞給 fcgiwrap 並禁用 nginx 內部的緩衝。
為此,我在“include fastcgi_params;”之前和之後添加了一些設置。線。
#note: NO_BUFFERING relies on a patched fcgiwrap. fastcgi_param NO_BUFFERING 1; include fastcgi_params; gzip off; fastcgi_buffering off;