当我在 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
Run Code Online (Sandbox Code Playgroud)
在 apache 下,客户端将每 5 秒获取一些数据。
在带有 fcgiwrap 的 nginx 下,我没有得到任何数据和网关超时。
nginx 和 fcgiwrap 是来自 Debian Jessie 的软件包。版本 1.1.0-5 和 1.6.2-5+deb8u4
所以问题
好吧,想通了。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;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1011 次 |
最近记录: |