Nginx和fcgiwrap,增量输出问题

Pet*_*een 5 nginx fastcgi cgi

当我在 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

所以问题

  1. 有谁知道谁对这种行为负责?nginx本身?fcgiwrap?两个都?
  2. 是否可以通过配置修复?
  3. 如果是 fcgiwrap 问题,是否有其他可用的 cgi 包装器不会遇到此问题?

Pet*_*een 4

好吧,想通了。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)