FastCGI不会并行执行脚本

时间:2013-12-04 07:40:33

标签: perl fastcgi

我还是FastCGI的新手。我无法理解如何并行执行Perl脚本。

问题在于,当我在浏览器中多次打开相同的URL时,例如:

http://example.com/myscript.pl

只包含一个繁忙的循环:

#! /usr/bin/perl

for (my $i = 0; $i <= 700000000; $i++) { }

然后只有一个FCGI进程正在运行,使用100%CPU,即使我的网络服务器正在使用其中的8个(我正在使用lighttpd。)

但是,如果我将脚本复制到另一个文件,然后打开它们:

http://example.com/myscript.pl
http://example.com/myscript_copy.pl

然后运行两个进程,每个进程50%CPU。我只是不明白。

我的Perl FastCGI调度脚本(意味着网络服务器产生8次的脚本)是这样的:

#! /usr/bin/perl

use CGI::Fast;

{
    while (new CGI::Fast) {
        do $ENV{SCRIPT_FILENAME};
    }
}

一种解决方案是为客户端请求的每个脚本生成一个新的Perl进程。但那会破坏FastCGI的目的;我不希望每个命令请求每秒产生几十个Perl进程。这太过分了。

Perl应该如何使用FastCGI?我必须在这里做一些根本错误的事情......

如果我的lighttpd配置很重要(也许那里有一些错误),就是这样:

server.modules = (
    "mod_access",
    "mod_alias",
    "mod_compress",
    "mod_redirect",
    "mod_fastcgi",
)

server.document-root = "/var/www"
server.upload-dirs   = ( "/var/cache/lighttpd/uploads" )
server.errorlog      = "/var/log/lighttpd/error.log"
server.pid-file      = "/var/run/lighttpd.pid"
server.username      = "www-data"
server.groupname     = "www-data"

index-file.names     = ( "index.php", "index.html",
                         "index.htm", "default.htm",
                         " index.lighttpd.html" )

url.access-deny      = ( "~", ".inc" )

static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

include_shell "/usr/share/lighttpd/use-ipv6.pl"

dir-listing.encoding = "utf-8"
server.dir-listing   = "enable"

compress.cache-dir = "/var/cache/lighttpd/compress/"
compress.filetype  = ( "application/x-javascript", "text/css",
                       "text/html", "text/plain" )

include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

fastcgi.server = (
    ".pl" => ((
        "socket" => "/var/run/lighttpd/perl-fcgi.socket",
        "bin-path" => "/usr/local/lib/cgi-bin/perl-dispatcher.fcgi",
        "check-local" => "disable",
        "max-procs" => 8,
    ))
)

1 个答案:

答案 0 :(得分:1)

  

一种解决方案是为每个脚本生成一个新的Perl进程   这是客户要求的。但是这会打败   FastCGI的目的;我不想每个产生几十个Perl进程   对于每个进入请求都是第二个。

您似乎误解了FastCGI。每个进程一次只处理一个请求,因此您无法同时处理数十个请求而无需创建数十个进程来处理它们。

FastCGI实际上给你的是它可以保持进程可以重用以后的请求,或者它可以被配置为在需要它们的实际请求进入之前提前生成进程。这两个功能有助于最大限度地减少客户端等待请求处理时按需生成进程的需要,但它们不会改变使用一个服务器进程来处理每个传入请求的需要。