PerlFastCGI的安装
1.获取wrapper程序
读者可以从http://www.nginx.eu/nginx-fcgi/ 上下载nginx-fcgi.txt文件然后将其命名为nginx-fcgi.pl并放到/usr/local/nginx目录下。nginx-fcgi.pl是一个用Perl脚本写的wrapper实例所以操作系统必须要安装Perl程序以及相关模块。
2.安装相关的系统支持模块
可以从http://search.cpan.org下载所需的相应模块然后进行安装。
1安装FCGI模块
[root@localhost opt]# tar zxvf FCGI-0.71.tar.gz  
[root@localhost opt]# cd FCGI-0.71  
[root@localhost FCGI-0.71]# perl Makefile.PL  
[root@localhost FCGI-0.71]# make  
[root@localhost FCGI-0.71]# make install
2安装IO模块
root@localhost opt]# tar -xvzf IO-1.25.tar.gz  
[root@localhost opt]# cd IO-1.25  
[root@localhost IO-1.25]# perl Makefile.PL  
[root@localhost IO-1.25]# make  
[root@localhost IO-1.25]# make install
3安装IO-ALL模块
[root@localhost opt]# tar -xvzf IO-All-0.39.tar.gz  
[root@localhost opt]# cd IO-ALL-0.39  
[root@localhost IO-ALL-0.39]# perl Makefile.PL  
[root@localhost IO-ALL-0.39]#make  
[root@localhost IO-ALL-0.39]#make install
3.编写nginx-fcgi启动脚本
仅仅有wrapper文件是不够的还需要一个脚本来创建socket、启动wrapper以及将wrapper和socket绑定。下面通过一个shell脚本来完成这一系列工作。
[root@localhost root]# more nginx-fcgi
#!/bin/bash  
nginxroot=/usr/local/nginx  
start ()  
{  
chown www.www $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  
chown www.www  $nginxroot/nginx_fcgi.sh  
chmod 755 $nginxroot/nginx_fcgi.sh  
sudo -u www $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 "stop nginx-fcgi done"  
}  
case $1 in  
stop)  
stop  
;;  
start)  
start  
;;  
restart)  
stop  
start  
;;  
*)  
echo $"Usage: perl-cgi {start|stop|restart}"  
      exit 1  
esac
在nginx-fcgi中变量nginxroot用于指定Nginx的安装目录nginx-fcgi.sock是生成的文件sockwww为运行nginx_fcgi进程的用户这个用户要和运行Nginx的用户一致
注意如果在安装nginx的时候指定运行的用户为www上面的脚本里面的进程用户也应该是www否则访问提示权限不足。
配置完脚本后将此文件放到/usr/local/nginx目录下接着通过如下方式管理nginx-fcgi进程
[root@localhost root]#chmod 755 /usr/local/nginx/nginx-fcgi.pl
[root@localhost root]#cat nginx-fcgi.pl
#!/usr/bin/perl
#
#authorDaniel Dominik Rudnicki
#thanks to:Piotr Romanczuk
#emaildaniel@sardzent.org
#version0.4.3
#webpagehttp://www.nginx.eu/
#
#BASED @ http://wiki.codemongers.com/NginxSimpleCGI
#
#
# use strict;
use FCGI;
use Getopt::Long;
use IO::All;
use Socket;
sub init {
GetOptions("h"=> \$help,
"verbose!"=>\$verbose,
"pid=s"=> \$filepid,
"l=s" => \$logfile,
"S:s"   => \$unixsocket,
"P:i"   => \$unixport) or usage();
usage() if $help;
print "Starting Nginx-fcgi\n" if $verbose;
print "Running with $> UID" if $verbose;
print "Perl $]" if $verbose;
#if ( $> == "0" ) {
#print "\n\tERROR\tRunning as a root!\n";
#print "\tSuggested not to do so !!!\n\n";
#exit 1;
#}
       if ( ! $logfile ) {
print "\n\tERROR\t log file must declared\n"
. "\tuse $0 with option -l filename\n\n";
exit 1;
}
print "Using log file $logfile\n" if $verbose;
"\n\n" >> io($logfile);
addlog($logfile, "Starting Nginx-cfgi");
addlog($logfile, "Running with $> UID");
addlog($logfile, "Perl $]");
addlog($logfile, "Testing socket options");
if ( ($unixsocket && $unixport) || (!($unixsocket) && !($unixport)) ) {
print "\n\tERROR\tOnly one option can be used!\n";
print "\tSuggested (beacuse of speed) is usage UNIX socket -S \n\n";
exit 1;
}
if ($unixsocket) {
print "Daemon listening at UNIX socket $unixsocket\n" if $versbose;
addlog($logfile, "Deamon listening at UNIX socket $unixsocket");
} else {
print "Daemon listening at TCP/IP socket *:$unixport\n" if $verbose;
#
addlog($logfile, "Daemon listening at TCP/IP socket *:$unixport");
}
if ( -e $filepid ) {
print "\n\tERROR\t PID file $filepid already exists\n\n";
addlog($logfile, "Can not use PID file $filepid, already exists.");
exit 1;
}
if ( $unixsocket ) {
print "Creating UNIX socket\n" if $verbose;
$socket = FCGI::OpenSocket( $unixsocket, 10 );
if ( !$socket) {
print "Couldn't create socket\n";
addlog($logfile, "Couldn't create socket");
exit 1;
}
print "Using UNIX socket $unixsocket\n" if $verbose;
} else {
print "Creating TCP/IP socket\n" if $verbose;
$portnumber = ":".$unixport;
$socket = FCGI::OpenSocket( $unixport, 10 );
if ( !$socket ) {
print "Couldn't create socket\n";
addlog($logfile, "Couldn't create socket");
exit 1;
}
print " Using port $unixport\n" if $verbose;
}
addlog($logfile, "Socket created");
if ( ! $filepid ) {
print "\n\tERROR\t PID file must declared\n"
. "\tuse $0 with option -pid filename\n\n";
exit 1;
}
print "Using PID file $filepid\n" if $verbose;
addlog($logfile, "Using PID file $filepid");
my $pidnumber = $$;
$pidnumber > io($filepid);
print " PID number $$\n" if $verbose;
addlog($logfile, "PID number $pidnumber");
}
sub addzero {
my ($date) = shift;
if ($date < 10) {
return "0$date";
}
      return $date;
}
sub logformat {
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$iddst) = localtime(time);
my $datestring;
$year += 1900;
$mon++;
$mon  = addzero($mon);
$mday = addzero($mday);
$min  = addzero($min);
$datestring = "$year-$mon-$mday $hour:$min";
return($datestring);
}
sub addlog {
my ($log_file, $log_message) = @_;
my $curr_time = logformat();
my $write_message = "[$curr_time]   $log_message";
$write_message >> io($log_file);
"\n" >> io($log_file);
}
sub printerror {
my $message = @_;
print "\nNginx FastCGI\tERROR\n"
. "\t $message\n\n";
exit 1;
}
sub usage {
print "\nNginx FastCGI \n"
. "\n\tusage: $0 [-h] -S string -P int\n"
. "\n\t-h\t\t: this (help) message"
. "\n\t-S path\t\t: path for UNIX socket"
. "\n\t-P port\t\t: port number"
. "\n\t-p file\t\t: path for pid file"
. "\n\t-l file\t\t: path for logfile"
. "\n\n\texample: $0 -S /var/run/nginx-perl_cgi.sock -l /var/log/nginx/nginx-cfgi.log -pid /var/run/nginx-fcgi.pid\n\n";
exit 1;
}
init;
#
END() { } BEGIN() { }
*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; }; eval q{exit};
if ($@) {
exit unless $@ =~ /^fakeexit/;
} ;
# fork part
my $pid = fork();
if( $pid == 0 ) {
&main;
exit 0;
}
print " Forking worker process with PID $pid\n" if $verbose;
addlog($logfile, "Forking worker process with PID $pid");
print " Update PID file $filepid\n" if $verbose;
addlog($logfile, "Update PID file $filepid");
$pid > io($filepid);
print "Worker process running.\n" if $verbose;
addlog ($logfile, "Parent process $$ is exiting");
exit 0;
sub main {
$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) ){
while ($req_len) {
$stdin_passthrough .= getc(STDIN);
$req_len--;
}
}
# running the cgi app
if ( (-x $req_params{SCRIPT_FILENAME}) &&
(-s $req_params{SCRIPT_FILENAME}) &&
(-r $req_params{SCRIPT_FILENAME})
){
foreach $key ( keys %req_params){
$ENV{$key} = $req_params{$key};
}
if ( $verbose ) {
addlog($logfile, "running $req_params{SCRIPT_FILENAME}");
}
# http://perldoc.perl.org/perlipc.html#Safe-Pipe-Opens
#
open $cgi_app, '-|', $req_params{SCRIPT_FILENAME}, $stdin_passthrough or print("Content-type: text/plain\r\n\r\n"); print "Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n"; # addlog($logfile, "Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !");
if ($cgi_app) {
print <$cgi_app>;
close $cgi_app;
}
} else {
print("Content-type: text/plain\r\n\r\n");
print "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n";
addlog($logfile, "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.");
}
}
}
上面的文件可以从goole上下载。
[root@localhost root]#chmod 755 /usr/local/nginx/nginx-fcgi
[root@localhost root]#/usr/local/nginx/nginx-fcgi start|stop|restart
1.8.2 为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目录。
1.8.3 测试Nginx +Perl(FastCGI)
所有配置工作完成后即可启动服务了。首先启动nginx-fcgi进程操作如下
/usr/local/nginx/nginx-fcgi start
然后启动nginx服务。
/usr/local/nginx/sbin/nginx
下面在/usr/local/nginx/html目录下创建一个test.cgi的文件。
# 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 REMOTE_ADDR = $REMOTE_ADDR
接着通过浏览器访问test.cgi文件如果显示与下面类似的信息表明Nginx+Perl环境搭建成功。

转载于:https://blog.51cto.com/zhangfang2012/1342584

Perl(FastCGI)的安装相关推荐

  1. [转移]安装 BugZilla 时 Perl 模块的安装

    [转移]安装 BugZilla 时 Perl 模块的安装 转移自自己原来在YourBlog上的Blog,写于2004-3-11 13:05:48 看了Jackey的"Windows下BugZ ...

  2. perl模块的安装,查询

    perl模块的安装,查询 linux下cpan安装: # perl -MCPAN -e shell             // 一路回车配置cpan,个别地方需要输入 cpan> instal ...

  3. 各种平台下Perl模块的安装方法

    各种平台下Perl模块的安装方法 来源:http://www.linuxforum.net David lee (2001-04-21 18:11:53) Perl到了第五版增加了模块的概念,用来提供 ...

  4. Linux eclipse+perl开发环境安装

    CentOS release 6.4 中会自带有eclipse,版本为eclipse3.6.1,如果要开发perl程序 需要安装epic插件和PadWalker 我选择PadWalker-1.96.t ...

  5. [Perl工具篇] 安装Strawberry Perl与第一个Perl程序(Padre下)

    原文地址::https://blog.csdn.net/henjay724/article/details/8456936 相关文章 1.Perl 和 StrawberryPerl 与 ActiveP ...

  6. perl中DBD-oracle安装,Linux下安装perl的DBI和DBD

    在Linux虚拟机上安装了Oracle的client端,需要用perl来抓取数据库中的数据,于是需要安装perl的DBI和DBD包,分别是DBI-1.616和DBD-Oracle-1.28.需要使用r ...

  7. isapi mysql_Windows 2008R2以ISAPI和Fastcgi方式安装配置IIS、PHP、Mysql环境

    Windows下PHP有两个版本,非线程安全及线程安全版本,运行方式可选ISAPI.Fastcgi.CGI.1.Non Thread Safe版本php适用于以CGI以和fastCGI运行的web服务 ...

  8. 征服Perl——Linux下安装Perl——里程碑M2

    1 从Internet上download下来perl的安装包,是linux下的. 2 传到我的linux下 3 tar -zxvf perl 4 cd perl 5 sh configure -de ...

  9. Windows中Perl命令的安装

    1.从ActiveState下载perl安装包 Download & Install Perl - ActiveState 2.再创建项目的最下方,有一个安装Perl按钮,点进去选择适合自己电 ...

  10. perl中DBD-oracle安装,perl DBD :: Oracle模块安装

    好的,所以我的工作如下.将细节步骤放在某人的指导下(或者如果我忘记了,我可能会在将来) >安装Perl DBI模块($ yum install perl-DBI) >手动安装低于3 rpm ...

最新文章

  1. str_pad函数php,str_pad
  2. 需要正则化的一个判断
  3. 自定义线程类中实例变量与其他线程共享与不共享
  4. redis php方案,Redis三种部署方案图文详解
  5. 从实践出发,腾讯云深入解读云端数据库技术
  6. github上成员贡献量_Bifrost 长期贡献规则,获得 BNC 的 5 种方式
  7. 教你在 Centos 7 中使用 DenyHosts防止ssh暴力破解(亲测)
  8. careercup-位操作5.1
  9. [渝粤教育] 中国地质大学 电路理论(新) 复习题
  10. repeater 的编辑功能
  11. 关于TI杯全国大学生电子设计竞赛
  12. 莫烦python博客_莫烦Python 4
  13. Word跨文件使用格式刷
  14. Intel处理器原子操作支持
  15. 电路原理 | 二阶动态电路
  16. 一个从业(非正品)奢侈品十年从业者的经验和历程。
  17. Remix本地环境搭建
  18. 数电课程设计——数字频率计
  19. when-otherwise for pyspark用法
  20. 【面试宝典】软件测试工程师2021烫手精华版(第四章web测试篇)

热门文章

  1. UIPro实例讲解之QQ2014 UI模仿系列四
  2. 关于openoffice转换pdf中txt乱码的问题
  3. python 蓝桥杯模拟大赛2022充电器充电问题
  4. Linux命令详解(3)date命令
  5. 7-3 三角形判定并计算面积
  6. 如何与意法半导体STMicro建立EDI连接?
  7. 菜鸟小技巧:如何在网上隐藏自己的IP地址(4)
  8. 对于各项生命周期的理解
  9. 一个小而全的Python项目示例
  10. 一个安卓应用,实现追书追剧追漫画三不勿!