perl+fastcgi+nginx搭建
nginx+fastcgi是php下最流行的一套环境了,那perl会不会也有fastcgi呢,当然有,今天来搭建下nginx下perl的fastcgi.性能方面也不亚于php,但是现在web程序php的流行程度perl无法比拟了,性能再好也枉然,但是部分小功能可以考虑使用perl的fastcgi来搞定.进入正题.1.准备软件环境:
nginxperl:系统自带fastcgi1.2perl安装一般linux都有自带perl,可以不用安装,如果确实没有,请执行:
#yuminstallperl
1.3perl-fastcgi安装
#wgethttp://www.cpan.org/modules/by-module/fcgi/fcgi-0.74.tar.gz
#tar-xzvffcgi-0.74.tar.gz
#makeinstall
2.nginx虚拟主机配置
server_nametest.jb51.net;
#access_log/data/logs/nginx/test.jb51.net.access.logmain;
indexindex.htmlindex.phpindex.html;
root/data/site/test.jb51.net;
fastcgi_pass127.0.0.1:8999;
#fastcgi_passunix:/var/run/jb51.net.perl.sock;
}
如果想把tcp/ip方式改为socket方式,可以修改fastcgi-wrapper.pl.
$socket=fcgi::opensocket("127.0.0.1:8999",10);useipsockets
3.配置脚本
3.1fastcgi监听脚本文件路径:/usr/bin/fastcgi-wrapper.pl
#thiskeepstheprogramaliveorsomethingafterexec'ingperlscripts
*core::global::exit=sub{die"fakeexit
exitunless$@=~/^fakeexit/;
chdir'/'ordie"can'tchdirto/:$!";
defined(my$pid=fork)ordie"can'tfork:$!";
setsidordie"can'tstartanewsession:$!";
$socket=fcgi::opensocket("127.0.0.1:8999",10);#useipsockets
$request=fcgi::request(\*stdin,\*stdout,\*stderr,\%req_params,$socket);
if($request){request_loop()};
fcgi::closesocket($socket);
while($request->accept()>=0){
#processinganystdininputfromwebserver(forcgi-postactions)
$req_len=0+$req_params{'content_length'};
if(($req_params{'request_method'}eq'post')&&($req_len!=0)){
while($bytes_read<$req_len){
my$bytes=read(stdin,$data,($req_len-$bytes_read));
lastif($bytes==0||!defined($bytes));
$stdin_passthrough.=$data;
if((-x$req_params{script_filename})&caniexecutethis?
(-s$req_params{script_filename})&isthisfileempty?
(-r$req_params{script_filename})#canireadthisfile?
pipe(child_rd,parent_wr);
my$pid=open(kid_to_read,"-|");
print("content-type:text/plain\r
print"error:cgiappreturnednooutput-";
print"executing$req_params{script_filename}failed!
printparent_wr$stdin_passthrough;
while(my$s=<kid_to_read>){print$s;}
foreach$key(keys%req_params){
$env{$key}=$req_params{$key};
#cdtothescript'slocaldirectory

#fcntl(child_rd,f_dupfd,0);
syscall(&sys_dup2,fileno(child_rd),0);
#open(stdin,"<&child_rd");
exec($req_params{script_filename});
print("content-type:text/plain\r
print"error:nosuchcgiapp-$req_params{script_filename}maynot";
print"existorisnotexecutablebythisprocess.
}
3.2fastcgi自启动服务脚本:
文件路径:/etc/rc.d/init.d/perl-fastcgi
文件路径:/etc/rc.d/init.d/perl-fastcgi
#nginx–thisscriptstartsandstopsthenginxdaemon
#description:nginxisanhttp(s)server,http(s)reverse\
#proxyandimap/pop3proxyserver
#config:/opt/nginx/conf/nginx.conf
#pidfile:/opt/nginx/logs/nginx.pid
./etc/rc.d/init.d/functions
#sourcenetworkingconfiguration.
#checkthatnetworkingisup.
["$networking"="no"]&&exit0
perlfastcgi="/usr/bin/fastcgi-wrapper.pl"
lockfile=/var/lock/subsys/perl-fastcgi
[$retval-eq0]&&touch$lockfile
[$retval-eq0]&&rm-f$lockfile
echo-n$”reloading$prog:”
rh_status>/dev/null2>&1
echo$"usage:$0{start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
esac
3.3设置脚本权限
#chmoda+x/usr/bin/fastcgi-wrapper.pl
/usr/local/nginx-1.4.2/sbin/nginx
#/etc/init.d/perl-fastcgistart
4.2perl测试文件:文件路径/data/site/test.jb51.net/test.pl
print"content-type:text/html
<html><head><title>perlenvironmentvariables</title></head>
<h1>perlenvironmentvariables</h1>
foreach$key(sort(keys%env)){
print"$key=$env{$key}<br>
print"</body></html>";
perl模块的使用如果对于一个绝大部分内容是静态的网站,只有极少数的地方需要动态显示,碰巧你又了解一点perl知识,那么nginx+perl的结合就能很好解决问题。要想nginx支持perl脚本,在编译nginx时候需要如下参数:
can'tlocateextutils/embed.pmin@inc(@inccontains:/usr/lib/perl5/5.10.0/i386-linux-thread-multi/usr/lib/perl5/5.10.0/usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/usr/local/lib/perl5/site_perl/5.10.0/usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi/usr/lib/perl5/vendor_perl/5.10.0/usr/lib/perl5/vendor_perl/usr/local/lib/perl5/site_perl.)
你的机器上可能需要安装perl-develperl-extutils-embed,对于centos系统,直接使用yum搞定,例如:
yum-yinstallperl-develperl-extutils-embed
nginx中使用perl有两种方法,一种是直接在配置文件写,还有一种是把perl脚本写在外部文件中,下面主要介绍一下第二种用法。假设nginx的根目录为/usr/local/nginx,perl脚本存放的目录为nginx的根目录下的perl/lib下,脚本名字为test.pm,nginx配置为:
}
packagepkg_name;
$r->send_http_header('text/html;charset=utf-8');
my@arr=split('/',$r->uri);
if(!$username||($usernameeq"")){
$r->print('hello,younameis:<strong>'.$username.'</strong>');
__end__
$r->uri–得到请求的url.
$r->variable(name[,value])–设置变量的值
以上就是Linux下如何用Nginx作Perl程序服务器及其中Perl模块的详细内容,更多请关注主机测评网其它相关文章!
本文来源:国外服务器--linux用nginx搭建web服务器
本文地址:https://www.idcbaba.com/guowai/5156.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 1919100645@qq.com 举报,一经查实,本站将立刻删除。



