gpt4 book ai didi

Perl CGI::Fast 关闭连接而不发送数据

转载 作者:行者123 更新时间:2023-12-03 15:00:56 27 4
gpt4 key购买 nike

我正在尝试部署一个使用 CGI::Application 的 Perl 应用程序通过 Nginx,它们之间使用 FastCGI 进行通信。

Nginx 不断返回“502 Bad Gateway”,错误日志充满了这个:

2015/02/03 12:40:03 [error] 11209#0: *2 upstream prematurely closed connection while reading response header from upstream, client: 10.1.1.23, server: www.example.com, request: "GET /test.fcgi HTTP/1.1", upstream: "http://127.0.0.1:5001/test.fcgi", host: "www.example.com"



这是 Nginx 站点配置:
upstream @perl {
# I had been trying to use a socket, but I switched to TCP to try WireShark.
# server unix:/var/run/nginx/my-app.sock;
server 127.0.0.1:5001;
}

server {
listen 80;
listen 443 ssl;

server_name www.example.com;
root /home/example/sites/www.example.com;

location ~* \.fcgi(/|$) {

fastcgi_split_path_info ^(.+?\.cgi)(/.*)$;
# (I know that the `if` is old-style, and that `try_files` is better, but that shouldn't affect whether it works or not.)
if (!-f $document_root$fastcgi_script_name) {
return 404;
}

proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Port 443;
proxy_pass http://@perl;
}
}

为了查看问题是否出在 Perl 应用程序本身,我根据 CGI::Fast documentation 中的测试代码创建了一个新的 fcgi 应用程序。 :
#!/usr/bin/perl -wT

use CGI::Fast;

# Added this to see if there are errors.
# See http://perldoc.perl.org/CGI/Carp.html
BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">>/home/example/sites/www.example.com/err.log") or
die("Unable to open mycgi-log: $!\n");
carpout(LOG);
}

local $count = 0;

$ENV{FCGI_SOCKET_PATH} = "127.0.0.1:5001";
$ENV{FCGI_LISTEN_QUEUE} = 100;

while ( my $q = new CGI::Fast ) {
$count++;
print $q->header( "text/plain" ),
"You are request number $count. Have a good day!\n";
}

当我运行 ./test.fcgi , 我可以在 netstat 中看到它已绑定(bind)到端口 5001。当我在浏览器中访问 URL 时,我仍然会通过这个 super 简单的应用程序获得 502。错误日志中没有任何内容 Carp正在写信给。

我不想使用纯 CGI ( via a wrapper script),因为应用程序的启动时间很长,而且我无法将整个应用程序转换为 Plack/PSGI。

我怎样才能弄清楚为什么 Nginx 不与 Perl 对话 CGI::Fast ,甚至是文档中的简单示例?

最佳答案

你正在运行一个 FastCGI 服务器,但你告诉 Nginx 连接到一个 HTTP 服务器。这些不是相同的协议(protocol)。

要从 Nginx 连接到 FastCGI 服务器,请使用 ngx_http_fastcgi_module ,而不是 ngx_http_proxy_module ,例如:

fastcgi_pass 127.0.0.1:5001;

请注意 proxy_set_header模块在这里不适用,因为 FastCGI 使用 CGI 环境变量,而不是头文件。如果您需要设置额外的标题,您可以使用 fastcgi_param指令,例如
fastcgi_param ENVIRONMENT_VARIABLE $value;

Nginx 附带一些标准 fastcgi_param文件中的指令,您可能只想批量导入:
include fastcgi_params;

关于Perl CGI::Fast 关闭连接而不发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636497/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com