【问题标题】:When executing Perl with FastCGI wrapper in nginx, do I actually get a speed benefit?在 nginx 中使用 FastCGI 包装器执行 Perl 时,我真的能获得速度优势吗?
【发布时间】:2010-08-13 04:18:28
【问题描述】:

我使用带有this script 的 nginx 作为 FastCGI 包装器,我开始使用:

spawn-fcgi -F 3 -u www-data -s /var/run/perl-fcgi.sock -P /var/run/perl-fcgi.pid -- ./perl-fcgi.pl

现在,假设我有一个简单的脚本:

#!/usr/bin/perl

print "Content-type: text/plain\r\n\r\n";
print "hello\n";

脚本运行良好,当我请求 /text.pl 时,我看到了“hello”。 但是正如您在 FastCGI 包装器的第 106 行中看到的那样,该脚本是使用 exec() 执行的,因此它基本上是在其自己的 Perl 环境中运行的。当我没有已经初始化的脚本,而是独立调用它时,它不会破坏 FastCGI 的整个概念吗?

在 nginx 上通过 FastCGI 进行交互的首选方式是什么?

干杯, --polemon

PS:spawn-fcgi 是来自 lighttpd 的程序,它启动 FCGI 包装器并将它们绑定到套接字。

【问题讨论】:

    标签: perl nginx fastcgi spawn-fcgi


    【解决方案1】:

    是的,它破坏了 FCGI 的整个概念,但这是设计使然。

    您使用的脚本是 FCGI 到 CGI 适配器,旨在解决 ngnix 故意无法提供 CGI 脚本的问题。

    要“正确”使用 FCGI,只需将 ngnix 指向您的 FCGI 感知脚本。从好的方面来说,如果 ngnix 可以与这个 FCGI-CGI 适配器通信,你就知道它可以与另一个 FCGI 脚本通信。具体的服务器配置可能是serverfault的问题。

    【讨论】:

    • 问题是,我想使用 Perl 作为任何其他脚本语言与 nginx。我有 Lua 和 PHP 的工作钩子,它们都使用 FastCGI 运行。如果我在运行包装器时运行所有其他 Perl 脚本,我将无法调用任何我喜欢的 Perl 应用程序,我必须将每个 Perl 脚本与它自己的套接字挂钩到 nginx,这是不可取的。没有其他选择吗?
    • @polemon,对。您需要一个 FCGI 代理或进程管理器,它可以将您的单个脚本作为长期运行 (FCGI) 守护进程启动,或者它本身就是 FCGI 解释器,并且可以动态地将独立的 perl 脚本编译成子程序,然后回答请求。
    • @polemon 问题之一是许多 Perl CGI 程序并非设计为每个进程运行多次。他们对全局数据进行快速而松散的处理,因为它通常在最后被丢弃。将它们放入 FCGI 循环可能会导致奇怪的错误。在 fork 和 exec'ing CGI 应用程序之前,您可以通过编写一个 FCGI 包装器来为自己购买一些性能而不会感到头疼,该包装器预加载常见和昂贵的模块,如 Moose。这将节省启动时间,这是使用普通 CGI 的大部分成本。
    • 你研究过 PSGI/Plack 吗?
    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多