作者:diege

时间:2012-04-24


一、      安装软件

1、        安装sudo nginxperl

# cd /usr/ports/security/sudo && make install clean

# cd  /usr/ports/www/nginx && make install clean

# cd /usr/ports/lang/perl5.12 && make install clean

2、安装perl的支持模块

# perl -MCPAN -e "install FCGI" #可以安装

# perl -MCPAN -e "install IO" #无法安装

# perl -MCPAN -e "install MakeMaker" #未使用

# perl -MCPAN -e "install IO-All"

#fetch http://mirrors.ustc.edu.cn/CPAN/authors/id/G/GB/GBARR/IO-1.25.tar.gz

#fetch http://mirrors.devlib.org/cpan/authors/id/I/IN/INGY/IO-All-0.44.tar.gz

# fetch http://mirrors.devlib.org/cpan/authors/id/M/MS/MSCHWERN/ExtUtils-MakeMaker-6.62.tar.gz

1) IO

#tar -zxvf IO-1.25.tar.gz

# cd IO-1.25

# perl Makefile.PL

# make && make install

2)

# tar -zxvf ExtUtils-MakeMaker-6.62.tar.gz

# cd ExtUtils-MakeMaker-6.62

# perl Makefile.PL

# make && make install

3) IO-All

perl -MCPAN -e "install IO::String"

# tar -zxvf IO-All-0.44.tar.gz

# cd IO-All-0.44

# perl Makefile.PL

#make && make install

二、      启动脚本设置

http://wiki.codemongers.com/NginxSimpleCGI

脚本介绍

perl-fcgi.pl是一个perl写的wrapper实例

start_perl_cgi.sh是一个创建socket,启动wrapper以及将wrappersocket绑定的shell脚本

# mkdir -p /usr/local/nginx/logs

# cp perl-fcgi.pl  /usr/local/nginx/

# cp start_perl_cgi.sh /usr/local/nginx/

#chmod 755 /usr/local/nginx/perl-fcgi.pl

#chmod 755 /usr/local/nginx/start_perl_cgi.sh

 

#cat /usr/local/nginx/start_perl_cgi.sh

#!/bin/sh

#set -x

rundir=/usr/local/nginx

start () {

        rm $rundir/now_start_perl_fcgi.sh 2>/dev/null

        chown www:wheel $rundir/logs

        echo "$rundir/perl-fcgi.pl -l $rundir/logs/perl-fcgi.log -pid $rundir/logs/perl-fcgi.pid -S $rundir/logs/perl-fcgi.sock" >>$rundir/now_start_perl_fcgi.sh

        chown www: www $rundir/now_start_perl_fcgi.sh

        chmod u+x $rundir/now_start_perl_fcgi.sh

        sudo -u www $rundir/now_start_perl_fcgi.sh

        echo "start perl-fcgi done"

}

 

stop () {

        #pkill  -f  $rundir/perl-fcgi.pl

        kill $(cat $rundir/logs/perl-fcgi.pid)

        rm $rundir/logs/perl-fcgi.pid 2>/dev/null

        rm $rundir/logs/perl-fcgi.sock 2>/dev/null

        echo "stop perl-fcgi done"

}

 

case $1 in

        start)

                start

        ;;

        stop)

                stop

        ;;

        restart)

                stop

                start

        ;;

        *)

        echo "USAGE:$0 start|stop|restart"

        exit 1

esac

 

三、      配置nginx支持perl

NginxFastCGI的通信方式为Unix Socket。根据经验,IP Socket在高并发访问下比

Unix Socket稳定,但Unix Socket速度要比IP Socket快。

# vim /usr/local/etc/nginx/vhosts/www.example.com.conf

        location ~ \.(cgi|pl|perl)$ {  

                #root        html;  

                fastcgi_pass    unix:/usr/local/nginx/logs/perl-fcgi.sock;  

                fastcgi_index   index.cgi;  

                fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;  

                include         fastcgi_params;  

        }

四、      测试

1、        测试文件

首页文件

# ee /data/vhosts/www.example.com/index.pl 

#!/usr/bin/perl

print "Content-Type: text/html\n\n";

print "<html><body>";

print "Hello,World!CGI is working!<br>";

print "</body></html>";

# ee /data/vhosts/www.example.com/getinfo.cgi

#!/usr/bin/perl

# disable filename globbing

set -f

 

echo "Content-type: text/plain; charset=iso-8859-1"

echo

 

echo CGI/1.0 test script report:

echo

 

echo argc is $#. argv is "$*".

echo

 

echo SERVER_SOFTWARE = $SERVER_SOFTWARE

echo SERVER_NAME = $SERVER_NAME

echo GATEWAY_INTERFACE = $GATEWAY_INTERFACE

echo SERVER_PROTOCOL = $SERVER_PROTOCOL

echo SERVER_PORT = $SERVER_PORT

echo REQUEST_METHOD = $REQUEST_METHOD

echo HTTP_ACCEPT = "$HTTP_ACCEPT"

echo PATH_INFO = "$PATH_INFO"

echo PATH_TRANSLATED = "$PATH_TRANSLATED"

echo SCRIPT_NAME = "$SCRIPT_NAME"

echo QUERY_STRING = "$QUERY_STRING"

echo REMOTE_HOST = $REMOTE_HOST

echo REMOTE_ADDR = $REMOTE_ADDR

echo REMOTE_USER = $REMOTE_USER

echo AUTH_TYPE = $AUTH_TYPE

echo CONTENT_TYPE = $CONTENT_TYPE

echo CONTENT_LENGTH = $CONTENT_LENGTH

#chown www:www /data/vhosts/www.example.com/getinfo.cgi

#chown www:www

/data/vhosts/www.example.com/index.pl 

#chmod 750 /data/vhosts/www.example.com/ index.pl 

#chmod 750 /data/vhosts/www.example.com/ getinfo.cgi

2、启动

#/usr/local/rc.d/nginx reload

#/usr/local/nginx/start_perl_cgi.sh

3、浏览器访问测试

www.example.com/index.pl 

www.example.com/getinfo.cgi 

无法访问.

原因:

Freebsd nginx www运行.

没有权限读取perl-fcgi.sock文件

#ll /usr/local/nginx/logs/perl-fcgi.sock

srwxr-xr-x  1 nobody  wheel  0 Apr 25 09:27 /usr/local/nginx/logs/perl-fcgi.sock

root@PubWeb1[/root/download]#chown www /usr/local/nginx/logs/perl-fcgi.sock

 

参考:http://blog.haohtml.com/archives/10909

http://www.tuanidc.com/bbs/thread-93976-1-1.html

http://wiki.codemongers.com/NginxSimpleCGI