Nginx对Perl的支持
一、Perl的安装
1.获取wrapper程序
网上很多文档、教程给的下载连接都已经失效,这里我上传一份最新的,也可留邮箱。“下载地址:”,解压出来将其命名为nginx-fcgi.pl并放到/usr/local/nginx目录下。nginx-fcgi.pl是一个用Perl脚本写的wrapper实例,所以,操作系统必须要安装Perl程序以及相关模块。
2.安装相关的系统支持模块
(1)安装FCGI模块
获取地址:
# tar zxvf FCGI-0.74.tar.gz
# cd FCGI-0.74
# perl Makefile.PL
# make
# make install
(2)安装IO模块
获取地址:
# tar -xvzf IO-1.25.tar.gz
# cd IO-1.25
# perl Makefile.PL
# make
# make install
(3)安装IO::ALL模块
获取地址:
# tar -xvzf IO-All-0.50.tar.gz
# cd IO-All-0.50
# perl Makefile.PL
#make
#make install
3.编写nginx-fcgi启动脚本
仅有wrapper文件是不够的,还需要一个脚本来创建socket、启动wrapper以及将wrapper和socket绑定,下面通过一个shell脚本来完成这一系列工作。
#!/bin/bash
nginxroot=/usr/local/nginx
start ()
{
chownnobody.root $nginxroot/logs
echo"$nginxroot/nginx-fcgi.pl -l $nginxroot/logs/nginx-fcgi.log -pid$nginxroot/logs/nginx-fcgi.pid -S $nginxroot/logs/nginx-fcgi.sock">>$nginxroot/nginx_fcgi.sh
chownnobody.nobody$nginxroot/nginx_fcgi.sh
chmod755$nginxroot/nginx_fcgi.sh
sudo-u nobody$nginxroot/nginx_fcgi.sh
echo"start nginx-fcgi done"
}
stop ()
{
kill$(cat$nginxroot/logs/nginx-fcgi.pid)
rm$nginxroot/logs/nginx-fcgi.pid 2>/dev/null
rm$nginxroot/logs/nginx-fcgi.sock 2>/dev/null
rm$nginxroot/nginx_fcgi.sh 2>/dev/null
echo"stopnginx-fcgi done"
}
case$1 in
stop)
stop
;;
start)
start
;;
restart)
stop
start
;;
*)
echo$"Usage: perl-cgi {start|stop|restart}"
exit1
esac
在nginx-fcgi中,变量nginxroot指定Nginx的安装目录,nginx-fcgi.sock是生成的文件sock, nobody为运行nginx_fcgi进程的用户,这个用户要和运行Nginx的用户一致。
配置完脚本后,将此文件放到/usr/local/nginx目录下,接着通过如下方式管理nginx-fcgi进程。
#chmod 755 /usr/local/nginx/nginx-fcgi.pl
#chmod 755 /usr/local/nginx/nginx-fcgi
#/usr/local/nginx/nginx-fcgi start|stop|restart
二、为Nginx添加FCGI支持
修改Nginx配置文件,在server虚拟主机中添加如下配置:
location ~ \.cgi${
root html;
fastcgi_pass unix:/usr/local/nginx/logs/nginx-fcgi.sock;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
在这个location配置中,Nginx与FastCGI的通信方式为Unix Socket。根据经验,IP Socket在高并发访问下比Unix Socket稳定,但Unix Socket速度要比IP Socket快。 “$document_root”是虚拟主机的根目录,在这里是/usr/local/nginx/html目录。
三、测试Nginx +Perl(FastCGI)
以上配置工作完成后,即可启动服务了。首选启动nginx-fcgi进程:
/usr/local/nginx/nginx-fcgistart
再启动nginx:
/usr/local/nginx/sbin/nginx
在/usr/local/nginx/html目录下创建一个123.cgi的文件。
# disable filename globbing
set-f
echo"Content-type: text/plain;charset=iso-8859-1"
echo
echoCGI/1.0 testscript report:
echo
echoargc is $#. argv is "$*".
echo
echoSERVER_SOFTWARE = $SERVER_SOFTWARE
echoSERVER_NAME = $SERVER_NAME
echoGATEWAY_INTERFACE = $GATEWAY_INTERFACE
echoSERVER_PROTOCOL = $SERVER_PROTOCOL
echoSERVER_PORT = $SERVER_PORT
echoREQUEST_METHOD = $REQUEST_METHOD
echoREMOTE_ADDR = $REMOTE_ADDR
接着通过浏览器访问“”,如果显示与下面类似的信息,表明Nginx+Perl环境搭建成功:
问题:
1、编译FCGI的时候报错.
Can't locateExtUtils/MakeMaker.pm in @INC
……
BEGIN failed--compilation aborted at Makefile.PL line 3.
解决办法:
yum install perl-ExtUtils-CBuilderperl-ExtUtils-MakeMaker
2、编译IO-All的时候报错:
make: Warning: File`Makefile.PL' has modification time 3.9e+06 s in the future
安装IO-All的时候make报以上错,说明是系统时间的问题,
解决办法:/usr/sbin/ntpdatentp.api.bz
3、启动nginx-fcgi的时候报PID文件问题
ERROR PID file /usr/local/nginx/logs/nginx-fcgi.pid already exists
是权限不够
解决办法:chown nobody.root /usr/local/nginx –R
总结:各个语言各有利弊,也都有所需要的市场,现实环境会有更多的支持扩展和变换性,上面是轻量级的一个架构,还可以利用Nginx做负载,然后做单独的Java和Perl环境服务器,利用Nginx实现将不同语言的处理请求直接交给后端的环境服务器。