无法在nginx + fcgiwrap

时间:2019-07-16 15:26:22

标签: perl nginx cgi spawn-fcgi

我有一个用CGI.pm编写的传统Perl CGI脚本,该脚本通过CGI界面打印一些文本行来回复其进度。然后,其旧客户端将逐行读取响应并执行任何操作。

由于缓冲问题,我无法设置nginx使其正常工作。

我的设置:

  1. CentOS 7 + EPEL
  2. yum install fcgi fcgi-devel spawn-fcgi
  3. fcgiwrap最近需要一个补丁程序来支持NO_BUFFERING环境变量,以关闭缓冲。在ServerFault的this answer中对此进行了描述。但是,这令人困惑:

    1. debian错误报告linked中,该答案声称补丁已由fcgiwrap应用于上游,但上游github信息库中与之无关,除了开放从未得到答复的问题。无论如何,该补丁已应用于debian软件包,但EPEL软件包不包含该补丁,因此:
    2. git clone存储库
    3. 从上述debian错误报告中应用了debian_patches_add-environment-variable-NO_BUFFERING-to-disable-out.patch
    4. autoreconf -i && ./configure && make && make install
  4. 已配置span-fcgi,这是\etc\sysconfig\spawn-fcgi

OPTIONS="-u nginx -g nginx -a 127.0.0.1 -p 9001 -P /var/run/spawn-fcgi.pid -- /usr/local/sbin/fcgiwrap -f"
  1. 为fastcgi配置nginx
location ~ .cgi$ {
  fastcgi_pass 127.0.0.1:9001;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_request_buffering off;
  fastcgi_read_timeout 900s;
  fastcgi_param NO_BUFFERING 1;
  gzip off;

  include /etc/nginx/fastcgi_params;
}

其他信息:

  1. perl脚本执行$| = 1;,因此 afaik 脚本本身不应缓冲其自身的输出。
  2. perl脚本还发送X-Accel-Buffering: no HTTP标头,通常被称为禁用nginx缓冲所必需的,尽管afaik在配置文件中不需要fastcgi_buffering off
  3. li>
  4. 通过使用netcatnc -l 9001 > request.txt)监听9001端口,我检查了nginx正确地将请求中的NO_BUFFERING变量与所有其他变量一起传递了参数。
  5. 通过执行cat request.txt | nc localhost 9001,我看到fcgiwrap是缓冲输出的内容:如果我在中途终止了生成的cgi进程,则直到那时我都会生成所有输出。
  6. CGI脚本已启动并且可以正常工作,只是客户端没有逐行接收数据(但是我需要上面的fastcgi_read_timeout 900s行以避免超时)。
  7. 我不确定我是否完全理解fcgiwrap源代码,但是该补丁很简单:如果设置了FCGI_fflush环境变量,它只会在每次写入后调用NO_BUFFERING。但是,可以肯定的是,我用unbuffered = !!getenv("NO_BUFFERING");取代了unbuffered = 1;,但没有成功。

那么有人可以发现我的缺失吗?

0 个答案:

没有答案