【问题标题】:deploying cgi to psgi converted application in apache在 apache 中将 cgi 部署到 psgi 转换的应用程序
【发布时间】:2015-04-03 22:43:43
【问题描述】:
#!C:/perl/bin/perl.exe
use CGI;

my $q = CGI->new;
print $q->header('text/plain'),
    "Hello ", $q->param('name');

#CONVERTED PSGI PAGE

#!C:/perl/bin/perl.exe
use CGI::PSGI;

my $app = sub {
    my $env = shift;
    my $q = CGI::PSGI->new($env);


    return [ 
        $q->psgi_header('text/plain'),
        [ "Hello ", $q->param('name') ],
    ];
};

我在 apache 服务器中运行这个 cgi.pl http://localhost/cgi-bin/cgi.pl

但我无法在 apache 服务器中运行转换后的 psgi.pl 它的显示 请帮忙 内部服务器错误 服务器遇到内部错误或配置错误,无法完成您的请求。 请通过 admin@example.com 联系服务器管理员,告知他们此错误发生的时间,以及您在此错误之前执行的操作。服务器错误日志中可能会提供有关此错误的更多信息。

【问题讨论】:

  • CGI - 是一种使用 Apache 和/或其他网络服务器的规范。 PSGI另一个规范。您可以在 PSGI 服务器下运行CGI 应用程序(通过使用CGI::PSGI),但您不能将 PSGI 应用程序作为纯 CGI 脚本运行。对于 PSGI 应用程序,您 不需要 apache。 (如果想使用 apache,您可以:1.)在反向代理后面运行您的 PSGI 应用程序,或 2.)使用 Plack::Handler::Apache2 或类似...
  • “有关此错误的更多信息可能在服务器错误日志中可用” - 这听起来可能是一个线索。服务器错误日志说明了什么?
  • 我现在可以使用 plack::runner 模块运行它

标签: perl web cgi psgi


【解决方案1】:

CGI 和 PSGI 是 Web 服务器和外部程序通信方式的两种不同规范。

在 CGI 下,Web 服务器期望从程序接收文本输出,包括 HTTP 响应标头、空行和程序呈现的 HTML。

CGI 模块为 apache 服务器实现这个逻辑,如果程序的输出不符合,apache 会报 500 错误。

在 PSGI 下,Web 服务器期望程序返回一个由 HTTP 响应代码、HTTP 响应标头和程序呈现的 HTML 组成的三元素列表。

所以你可以看到符合 PSGI 规范的程序会混淆 mod_cgi。

因此,您需要安装一个实现 PSGI 的 apache 模块,或者使用一个 Perl 模块(CGI::PSGI 文档建议 CGI::Emulate::PSGI),它将接受您的 PSGI 列表并为您转换为 CGI。

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 2023-03-06
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2017-11-22
    相关资源
    最近更新 更多