设为首页收藏本站language 语言切换
查看: 1650|回复: 0
收起左侧

在Nginx环境下用Perl FastCGI支持Awstats

[复制链接]
发表于 2010-9-16 09:34:29 | 显示全部楼层 |阅读模式
日志统计分析软件Awstats需要Perl支持,但是Nginx内建的Perl模块目前还并不稳定,经常会出问题,所以还是用FastCGI模式运行Perl比较可靠。下面就谈谈如何在Nginx下配置Perl的FastCGI模式:
首先,安装Perl的FastCGI模块:
wgethttp://www.cpan.org/modules/by-module/FCGI/FCGI-0.67.tar.gztarzxvf FCGI-0.67.tar.gzcd FCGI-0.67perl Makefile.PLmake && make install其实也可以用这种方法:#perl -MCPAN -e ‘install FCGI’

然后,配置Perl的FastCGI脚本(从网上找到的,未找到原始出处):
#!/usr/bin/perluse FCGI;use Socket;use POSIX qw(setsid);require 'syscall.ph';&daemonize;END() { } BEGIN() { }*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; };eval q{exit};if ($@) {        exit unless $@ =~ /^fakeexit/;};&main;sub daemonize() {    chdir '/' or die "Can't chdir to /: $!";    defined(my $pid = fork) or die "Can't fork: $!";    exit if $pid;    setsid or die "Can't start a new session: $!";    umask 0;}sub main {        $socket = FCGI::OpenSocket( "/tmp/perl_fastcgi.sock", 10 );        $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket );        if ($request) { request_loop()};            FCGI::CloseSocket( $socket );}sub request_loop {        while( $request->Accept() >= 0 ) {           $stdin_passthrough ='';           $req_len = 0 + $req_params{'CONTENT_LENGTH'};           if (($req_params{'REQUEST_METHOD'} eq &#39OST') && ($req_len != 0) ){                my $bytes_read = 0;                while ($bytes_read < $req_len) {                        my $data = '';                        my $bytes = read(STDIN, $data, ($req_len - $bytes_read));                        last if ($bytes == 0 || !defined($bytes));                        $stdin_passthrough .= $data;                        $bytes_read += $bytes;                }            }            if ( (-x $req_params{SCRIPT_FILENAME}) &&                 (-s $req_params{SCRIPT_FILENAME}) &&                 (-r $req_params{SCRIPT_FILENAME})            ){                pipe(CHILD_RD, PARENT_WR);                my $pid = open(KID_TO_READ, "-|");                unless(defined($pid)) {                        print("Content-type: text/plain\r\n\r\n");                        print "Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n";                        next;                }                if ($pid > 0) {                        close(CHILD_RD);                        print PARENT_WR $stdin_passthrough;                        close(PARENT_WR);                        while(my $s = ) { print $s; }                        close KID_TO_READ;                        waitpid($pid, 0);                } else {                        foreach $key ( keys %req_params){                           $ENV{$key} = $req_params{$key};                        }                        if ($req_params{SCRIPT_FILENAME} =~ /^(.*)\/[^\/]+$/) {                                chdir $1;                        }                        close(PARENT_WR);                        close(STDIN);                        syscall(&SYS_dup2, fileno(CHILD_RD), 0);                        exec($req_params{SCRIPT_FILENAME});                        die("exec failed");                }            }            else {                print("Content-type: text/plain\r\n\r\n");                print "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n";            }        }}将权限改为可执行,并执行之。
配置nginx.conf,使之支持perl脚本:
location ~* .*\.pl${       include awstats.conf;}编辑awstats.conf
fastcgi_pass  unix:/tmp/perl_fastcgi.sock;fastcgi_index awstats.pl;fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;fastcgi_param QUERY_STRING     $query_string;fastcgi_param REQUEST_METHOD   $request_method;fastcgi_param CONTENT_TYPE     $content_type;fastcgi_param CONTENT_LENGTH   $content_length;fastcgi_param GATEWAY_INTERFACE  CGI/1.1;fastcgi_param SERVER_SOFTWARE    nginx;fastcgi_param SCRIPT_NAME        $fastcgi_script_name;fastcgi_param REQUEST_URI        $request_uri;fastcgi_param DOCUMENT_URI       $document_uri;fastcgi_param DOCUMENT_ROOT      $document_root;fastcgi_param SERVER_PROTOCOL    $server_protocol;fastcgi_param REMOTE_ADDR        $remote_addr;fastcgi_param REMOTE_PORT        $remote_port;fastcgi_param SERVER_ADDR        $server_addr;fastcgi_param SERVER_PORT        $server_port;fastcgi_param SERVER_NAME        $server_name;fastcgi_read_timeout 60;然后重启nginx:
#service nginx restart
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-2-2 21:24 , Processed in 0.051160 second(s), 11 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表