Linux下如何用Nginx作Perl程序服务器及其中Perl模块

perl + fastcgi + nginx搭建

nginx + fastcgi是php下最流行的一套环境了,那perl会不会也有fastcgi呢,当然有,今天来搭建下nginx下perl的fastcgi.性能方面也不亚于php,但是现在web程序php的流行程度perl无法比拟了,性能再好也枉然,但是部分小功能可以考虑使用perl的fastcgi来搞定.进入正题.
1. 准备软件环境:

nginx
perl:系统自带
fastcgi

1.2 perl安装
一般linux都有自带perl,可以不用安装,如果确实没有,请执行:

# yum install perl

1.3 perl-fastcgi安装

# cd /usr/local/src # wget http://www.cpan.org/modules/by-module/fcgi/fcgi-0.74.tar.gz # tar -xzvf fcgi-0.74.tar.gz # cd fcgi-0.74 # perl makefile.pl  # make # make install

2. nginx虚拟主机配置

server {     listen  80;   server_name test.jb51.net;   #access_log /data/logs/nginx/test.jb51.net.access.log main;     index index.html index.php index.html;   root /data/site/test.jb51.net;     location /    {     }     location ~ .pl$    {    include fastcgi_params;    fastcgi_pass 127.0.0.1:8999;    #fastcgi_pass unix:/var/run/jb51.net.perl.sock;    fastcgi_index index.pl;   } }

如果想把tcp/ip方式改为socket方式,可以修改fastcgi-wrapper.pl.

$socket = fcgi::opensocket( "127.0.0.1:8999", 10 ); #use ip sockets

改为

$socket = fcgi::opensocket( "/var/run/jb51.net.perl.sock", 10 ); #use ip sockets

3. 配置脚本

3.1 fastcgi监听脚本
文件路径:/usr/bin/fastcgi-wrapper.pl

#!/usr/bin/perl   use fcgi; use socket; use posix qw(setsid);   require 'syscall.ph';   &daemonize;   #this keeps the program alive or something after exec'ing perl scripts end() { } begin() { } *core::global::exit = sub { die "fakeexitnrc=".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( "127.0.0.1:8999", 10 ); #use ip sockets   $request = fcgi::request( *stdin, *stdout, *stderr, %req_params, $socket );   if ($request) { request_loop()};    fcgi::closesocket( $socket ); }   sub request_loop {   while( $request->accept() >= 0 ) {      #processing any stdin input from webserver (for cgi-post actions)    $stdin_passthrough ='';    $req_len = 0 + $req_params{'content_length'};    if (($req_params{'request_method'} eq 'post') && ($req_len != 0) ){     my $bytes_read = 0;     while ($bytes_read  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};      }      # cd to the script's local directory      if ($req_params{script_filename} =~ /^(.*)/[^/]+$/) {        chdir $1;      }      close(parent_wr);    close(stdin);    #fcntl(child_rd, f_dupfd, 0);    syscall(&sys_dup2, fileno(child_rd), 0);    #open(stdin, "

3.2 fastcgi自启动服务脚本:

文件路径:/etc/rc.d/init.d/perl-fastcgi

文件路径:/etc/rc.d/init.d/perl-fastcgi
 

#!/bin/sh # # nginx – this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: nginx is an http(s) server, http(s) reverse  # proxy and imap/pop3 proxy server # processname: nginx # config: /opt/nginx/conf/nginx.conf # pidfile: /opt/nginx/logs/nginx.pid   # source function library. . /etc/rc.d/init.d/functions   # source networking configuration. . /etc/sysconfig/network   # check that networking is up. [ "$networking" = "no" ] && exit 0   perlfastcgi="/usr/bin/fastcgi-wrapper.pl" prog=$(basename perl)   lockfile=/var/lock/subsys/perl-fastcgi   start() {  [ -x $perlfastcgi ] || exit 5  echo -n $"starting $prog: "  daemon $perlfastcgi  retval=$?  echo  [ $retval -eq 0 ] && touch $lockfile  return $retval }   stop() {  echo -n $"stopping $prog: "  killproc $prog -quit  retval=$?  echo  [ $retval -eq 0 ] && rm -f $lockfile  return $retval }   restart() {  stop  start }   reload() {  echo -n $”reloading $prog: ”  killproc $nginx -hup  retval=$?  echo }   force_reload() {  restart } rh_status() {  status $prog }   rh_status_q() {  rh_status >/dev/null 2>&1 }   case "$1" in  start)   rh_status_q && exit 0   $1   ;;  stop)   rh_status_q || exit 0   $1   ;;  restart)   $1   ;;  reload)   rh_status_q || exit 7   $1   ;;  force-reload)   force_reload   ;;  status)   rh_status   ;;  condrestart|try-restart)   rh_status_q || exit 0   ;;  *)   echo $"usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"   exit 2  esac

3.3 设置脚本权限

# chmod a+x /usr/bin/fastcgi-wrapper.pl # chmod a+x /etc/rc.d/init.d/perl-fastcgi


4. fastcgi测试
4.1 启动nginx与fastcgi

# /usr/local/nginx-1.4.2/sbin/nginx # /etc/init.d/perl-fastcgi start

4.2 perl测试文件:
文件路径/data/site/test.jb51.net/test.pl

#!/usr/bin/perl   print "content-type:text/htmlnn"; print <title>perl environment variables</title><h1>perl environment variables</h1> endofhtml   foreach $key (sort(keys %env)) {  print "$key = $env{$key}<br>n"; }   print "

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享