【问题标题】:Perl web serving with nginx and FastCGI - not able to read parameters使用 nginx 和 FastCGI 提供 Perl Web 服务 - 无法读取参数
【发布时间】:2011-11-04 14:24:15
【问题描述】:

有很多关于如何使用 FastCGI 到 CGI 包装器来使用 nginx 提供 Perl 代码的教程。但是我自己使用 Perl 模块很舒服,所以我不需要包装器。我正在尝试找出正确的设置方法。这是我到目前为止的代码:

#!perl

use CGI;
use FCGI;

my $s = FCGI::OpenSocket(':9000',20);
my $r = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR,
    \%ENV, $s);
while ($r->Accept >= 0) {
    my $cgi = CGI->new;
    print "Content-type: text/html\n\n";
    print "<html><body>The foo input is ", $cgi->param('foo'), "</body></html>";
    $r->Finish;
}

并像这样在 nginx 中启用它:

location /foo {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.pl;
}

问题是,无论我调用脚本多少次,param 返回的值与启动程序后第一次调用时传递的值相同。有没有更好的方法来做到这一点?我也对CGI.pm 的替代方案持开放态度。

【问题讨论】:

  • 如果您已指示 CGI.pm 在实例化 CGI.pm 之前清除它的全局缓存,那么您发布的代码将会正常工作。 CGI::initialize_globals();
  • 有趣。不知道那个。我会记住的。

标签: perl nginx cgi fastcgi


【解决方案1】:

CGI::Fast 将为您处理大部分工作,包括设置守护进程。

use CGI::Fast;

local $ENV{FCGI_SOCKET_PATH} = ":9000";
local $ENV{FCGI_LISTEN_QUEUE} = 20;

while ($q = CGI::Fast->new) {
    print $q->header;
    print "<html><body>The foo input is ", $cgi->param('foo'), "</body></html>";
}

另一种选择是Nginx::Simple,它可以让您更好地控制 cgi-script-as-daemon 的行为。

【讨论】:

  • 遇到CGI::Fast 的问题。我尝试在命令行上运行它,它只运行一次就退出了。所以它似乎没有监听端口,或绑定stdio流等。
  • 最后搞定了,但CGI::Fast 中似乎有一个关于环境变量的文档错误,我可以报告。
猜你喜欢
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2017-09-21
相关资源
最近更新 更多