我有一个用CGI.pm
编写的传统Perl CGI脚本,该脚本通过CGI界面打印一些文本行来回复其进度。然后,其旧客户端将逐行读取响应并执行任何操作。
由于缓冲问题,我无法设置nginx使其正常工作。
我的设置:
yum install fcgi fcgi-devel spawn-fcgi
fcgiwrap
最近需要一个补丁程序来支持NO_BUFFERING
环境变量,以关闭缓冲。在ServerFault的this answer中对此进行了描述。但是,这令人困惑:
已配置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"
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;
,因此 afaik 脚本本身不应缓冲其自身的输出。X-Accel-Buffering: no
HTTP标头,通常被称为禁用nginx缓冲所必需的,尽管afaik在配置文件中不需要fastcgi_buffering off
。netcat
(nc -l 9001 > request.txt
)监听9001端口,我检查了nginx
正确地将请求中的NO_BUFFERING
变量与所有其他变量一起传递了参数。cat request.txt | nc localhost 9001
,我看到fcgiwrap
是缓冲输出的内容:如果我在中途终止了生成的cgi进程,则直到那时我都会生成所有输出。fastcgi_read_timeout 900s
行以避免超时)。fcgiwrap
源代码,但是该补丁很简单:如果设置了FCGI_fflush
环境变量,它只会在每次写入后调用NO_BUFFERING
。但是,可以肯定的是,我用unbuffered = !!getenv("NO_BUFFERING");
取代了unbuffered = 1;
,但没有成功。那么有人可以发现我的缺失吗?