当前位置 主页 > 服务器问题 > nginx问题汇总 >

Linux下用Nginx作Perl程序服务器及其中Perl模块的配置

栏目:nginx问题汇总 时间:2018-12-06 17:24

这篇文章主要介绍了Linux下用Nginx作Perl程序服务器及其中Perl模块的配置,文中使用到了FastCGI中间件进行连接,需要的朋友可以参考下

perl + fastcgi + nginx搭建

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

nginx:http://www.nginx.org
perl:系统自带
fastcgi:http://www.cpan.org/modules/by-module/FCGI/
1.1 nginx安装
这里就不再详细介绍了~
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 scriptsEND() { } 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( "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 < $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;    }   }    #running the cgi app   if ( (-x $req_params{SCRIPT_FILENAME}) && #can I execute this?     (-s $req_params{SCRIPT_FILENAME}) && #Is this file empty?     (-r $req_params{SCRIPT_FILENAME})  #can I read this file?   ){  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 - ";      print "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 = <KID_TO_READ>) { 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, "<&CHILD_RD");   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 ";    print "exist or is not executable by this process.\n";   }   }}



缩小 缩小 缩小 缩小
IIS7整站下载工具 IIS7批量查询排名 IIS7远程桌面连接工具 iis7-iis网站批量管理 iis7批量替换工具 IIS7服务器专用下载工具 IIS7日志分析工具 IIS7批量PING,服务器批量添加网卡IP小工具 IIS7远程同步备份工具
IIS7网站监控 站群批量SEO查询 批量获取排名域名 批量关键词排名查询 模拟各种蜘蛛 批量友情链接监测 批量检测死链 搜索引擎大全 批量查询外链
批量查询网站标题 批量查询KeyWords 批量查询描述 批量查询网站IP 批量百度收录查询 批量查询百度日收录 批量查询百度周收录 批量查询百度月收录 批量查询360总收录 批量查询360日收录 批量查询网站年龄 批量查询360PC权重 批量查询爱站移动权重 批量查询站长移动权重 批量查询360移动权重 批量查询神马权重 批量查询谷歌PR 批量查询搜狗PR 批量查询百度反链 批量查询爱站首页反链 批量查询爱站内页反链 批量查询百度快照 批量查询搜狗快照 批量icp备案查询 批量网站ip地址查询 批量查询导出链接 批量查询百度V认证 批量查询百度安全 批量查询站长PC权重 批量查询爱站PC权重 批量查询搜狗总收录 站长资源大全 IIS7-cms大全 IIS7站群大全 IIS7虚拟空间大全 IIS7服务器大全 IIS7-VPS大全