说明:
操作系统:CentOS 6.x
web环境:php+nginx+mysql
nginx安装目录:/usr/local/nginx
nginx配置文件:/usr/local/nginx/conf/nginx.conf
nginx默认站点目录:/usr/local/nginx/html/
需求:让nginx能够解析.cgi后缀的文件
具体操作:
一、安装perl-fcgi依赖包,通过安装perl-fcgi来支持nginx运行.cgi
yum install perl-CPAN perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
二、安装perl
cd /usr/local/src
wget http://www.cpan.org/src/5.0/perl-5.20.0.tar.gz #下载安装包,需要提前安装wget工具
tar -xzf perl-5.20.0.tar.gz #解压
cd perl-5.20.0 #进入目录
./Configure -des -Dprefix=/usr/local/perl #配置
make #编译
make install #安装
mv /usr/bin/perl /usr/bin/perl.bak #备份系统默认的perl
ln -s /usr/local/perl/bin/perl /usr/bin/perl #把刚刚安装好的新perl软连接到perl在系统中的默认位置
perl -v #查看perl版本
系统运维 www.osyunwei.com 温馨提醒:qihang01原创内容©版权所有,转载请注明出处及原文链
三、安装perl支持模块
1、安装perl fcgi模块
cd /usr/local/src
wget http://www.cpan.org/authors/id/F/FL/FLORA/FCGI-0.74.tar.gz
tar zxvf FCGI-0.74.tar.gz
cd FCGI-0.74
perl Makefile.PL #配置
make
make install
2、安装FCGI-ProcManager模块
cd /usr/local/src
wget http://www.cpan.org/authors/id/B/BO/BOBTFISH/FCGI-ProcManager-0.24.tar.gz
tar zxvf FCGI-ProcManager-0.24.tar.gz
cd FCGI-ProcManager-0.24
perl Makefile.PL
make
make install
3、安装IO模块
cd /usr/local/src
wget http://www.cpan.org/authors/id/G/GB/GBARR/IO-1.25.tar.gz
tar zxvf IO-1.25.tar.gz
cd IO-1.25
perl Makefile.PL
make
make install
4、安装IO::ALL模块
cd /usr/local/src
wget http://www.cpan.org/authors/id/I/IN/INGY/IO-All-0.79.tar.gz
tar zxvf IO-All-0.79.tar.gz
cd IO-All-0.79
perl Makefile.PL
make
make install
四、配置nginx支持.cgi
1、vi /usr/local/nginx/perl-fcgi.pl #编辑,添加以下代码
#!/usr/bin/perl
#
# author Daniel Dominik Rudnicki
# thanks to: Piotr Romanczuk
# email daniel@sardzent.org
# version 0.4.3
# webpage http://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 "\n Nginx FastCGI\tERROR\n"
. "\t $message\n\n";
exit 1;
}
sub usage {
print "\n Nginx 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.");
}
}
}
################################################
:wq! #保存退出
chmod 755 /usr/local/nginx/perl-fcgi.pl #添加脚本执行权限
备注:以上代码在拷贝的时候注意格式,否则出错。
2、vi /usr/local/nginx/start_perl_cgi.sh #编辑,添加以下代码,注意,这里nginx运行账户为www组的www用户
################################################
#!/bin/bash
#set -x
dir=/usr/local/nginx
stop ()
{
#pkill -f $dir/perl-fcgi.pl
kill $(cat $dir/logs/perl-fcgi.pid)
rm $dir/logs/perl-fcgi.pid 2>/dev/null
rm $dir/logs/perl-fcgi.sock 2>/dev/null
echo "stop perl-fcgi done"
}
start ()
{
rm $dir/now_start_perl_fcgi.sh 2>/dev/null
chown www.www $dir/logs
echo "$dir/perl-fcgi.pl -l $dir/logs/perl-fcgi.log -pid $dir/logs/perl-fcgi.pid -S $dir/logs/perl-fcgi.sock" >>$dir/now_start_perl_fcgi.sh
chown www.www $dir/now_start_perl_fcgi.sh
chmod u+x $dir/now_start_perl_fcgi.sh
sudo -u www $dir/now_start_perl_fcgi.sh
echo "start perl-fcgi done"
}
case $1 in
stop)
stop
;;
start)
start
;;
restart)
stop
start
;;
esac
################################################
:wq! #保存退出
chmod 755 /usr/local/nginx/start_perl_cgi.sh #添加脚本执行权限
/usr/local/nginx/start_perl_cgi.sh start #启动perl_cgi
cd /usr/local/nginx/logs #查看此目录下是否已生成perl-fcgi.sock文件
系统运维 www.osyunwei.com 温馨提醒:qihang01原创内容©版权所有,转载请注明出处及原文链
#如果没有生成此文件,请检查以上步骤,直到有这个文件,才能继续下面的操作。
3、添加perl_fcgi.conf文件
cd /usr/local/nginx/conf
vi perl_fcgi.conf #编辑,添加以下代码
location ~ .*\.(pl|cgi)?$
{
gzip off;
fastcgi_pass unix:/usr/local/nginx/logs/perl-fcgi.sock;
fastcgi_index index.cgi;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_read_timeout 60;
}
:wq! #保存退出
4、修改nginx配置文件/usr/local/nginx/conf/nginx.conf
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf-bak #备份原文件
vi /usr/local/nginx/conf/nginx.conf #编辑修改,在server段添加include perlfcgi.conf;
server
{
listen 80;
#server_name localhost;
index index.php default.php index.html index.htm default.html default.htm ;
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
include perl_fcgi.conf;
:wq! #保存退出
五、测试nginx支持.cgi
1、vi /usr/local/nginx/html/perlinfo.cgi #编辑,添加以下代码
########################################
#!/usr/bin/perl
print "Content-type: text/html\n\n";
#Location of Perl
$output = `whereis perl`;
@locations = split(" ",$output);
foreach $line (@locations)
{
$whereperl .= "$line<br>";
}
#Location of Sendmail
$output = `whereis sendmail`;
@locations = split(" ",$output);
foreach $line (@locations)
{
$wheresendmail .= "$line<br>";
}
#Location of Current Directory
$currentdirectory = `pwd`;
#Perl Variables
$perlversion = $];
#Perl Os
$perlos = $^O;
#Module Paths
foreach $line (@INC)
{
$modulepaths .= "$line<br>";
}
#Environment Variables
$environment = qq~
<table width="100%" border="1" cellspacing="0" cellpadding="2" bordercolor="#000000">
<tr>
<td colspan="2" bgcolor="#0033CC">
<div align="center" class="tabletitle">Environment Variables</div>
</td>
</tr>
~;
@allkeys = keys(%ENV);
foreach $key (@allkeys)
{
$value = $ENV{$key};
if ($value eq "") {$value = "-";}
$environment .= qq~
<tr>
<td width="150" class="tableitems">$key</td>
<td class="tablevalue">$value</td>
</tr>
~;
}
$environment .= qq~
</table>
~;
$documentroot = $ENV{'DOCUMENT_ROOT'};
if ($documentroot ne "")
{
@lines = `du -c -k $documentroot`;
$lastline = @lines-1;
($diskusage) = split/[\t| ]/,$lines[$lastline];
}
#Server Software
$serverip = $ENV{'SERVER_ADDR'};
$servername = $ENV{'SERVER_NAME'};
$serverport = $ENV{'SERVER_PORT'};
$serversoftware = $ENV{'SERVER_SOFTWARE'};
$serveruptime =`uptime`;
#Localtime
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
@months = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
$date = sprintf("%02d-%s-%04d",$mday,$months[$mon],$year+1900);
$time = sprintf("%02d:%02d:%02d",$hour,$min,$sec);
$localtime = "$date, $time";
#GMTtime
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
@months = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
$date = sprintf("%02d-%s-%04d",$mday,$months[$mon],$year+1900);
$time = sprintf("%02d:%02d:%02d",$hour,$min,$sec);
$gmttime = "$date, $time";
print qq~
<html>
<head>
<title>Perlonline.com - Perlinfo.cgi</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
.tabletitle { font-family: Arial, Helvetica, sans-serif; font-size: 14px; font-weight: bold; background-position: center; color: #FFFFFF}
.tableitems { font-family: Arial, Helvetica, sans-serif; font-size: 12px}
.tablevalue { font-family: Arial, Helvetica, sans-serif; font-size: 12px; font-weight: bolder}
-->
</style>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<table width="100%" border="1" cellpadding="2" cellspacing="0" bordercolor="#000000">
<tr bgcolor="#0033CC">
<td colspan="2" class="tabletitle">
<div align="center">Server Information</div>
</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">Name</td>
<td class="tablevalue">$servername</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">IP</td>
<td class="tablevalue">$serverip</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">Listing Port</td>
<td class="tablevalue">$serverport</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">Document Root</td>
<td class="tablevalue">$documentroot</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">Disk Usage by Root</td>
<td class="tablevalue">$diskusage Kb</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">Software's Installed</td>
<td class="tablevalue">$serversoftware</td>
</tr>
</table>
<br>
<table width="100%" border="1" cellspacing="0" cellpadding="2" bordercolor="#000000">
<tr bgcolor="#0033CC">
<td colspan="2" class="tabletitle">
<div align="center">Perl Information</div>
</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">Perl version</td>
<td class="tablevalue">$perlversion</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">Compiled For</td>
<td class="tablevalue">$perlos</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">Module Paths</td>
<td class="tablevalue">$modulepaths</td>
</tr>
</table>
<br>
<table width="100%" border="1" bordercolor="#000000" cellpadding="2" cellspacing="0">
<tr bgcolor="#0033CC">
<td colspan="2" class="tabletitle">
<div align="center">Location of Important Unix Programs</div>
</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">Perl</td>
<td class="tablevalue">$whereperl</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">Sendmail</td>
<td class="tablevalue">$wheresendmail</td>
</tr>
</table>
<br>
<table width="100%" border="1" cellspacing="0" cellpadding="2" bordercolor="#000000">
<tr bgcolor="#0033CC">
<td colspan="2" class="tabletitle">
<div align="center">Time</div>
</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">Server Time (Local)</td>
<td class="tablevalue">$localtime</td>
</tr>
<tr>
<td class="tableitems" width="150" valign="top">Server Time (GMT)</td>
<td class="tablevalue">$gmttime</td>
</tr>
</table>
<br>
$environment
<p align="center" class="tablevalue"> </p>
<p align="center" class="tablevalue">All rights Reserved 2001. <a href="http://www.perlonline.biz">Perlonline.biz</a></p>
</body>
</html>
~;
########################################
:wq! #保存退出
2、vi /usr/local/nginx/html/test.cgi #编辑,添加以下代码
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body>Hello, world.</body></html>";
:wq! #保存退出
chown www.www -R /usr/local/nginx/html/
chmod 744 -R /usr/local/nginx/html/perlinfo.cgi
chmod 744 -R /usr/local/nginx/html/test.cgi
在浏览器中打开以上2个测试页面,如下图所示:
至此,Linux下配置nginx支持.cgi教程完成。
扩展阅读:
Linux下安装Bugzilla
一、下载Bugzilla
http://ftp.mozilla.org/pub/mozilla.org/webtools/archived/bugzilla-3.4.6.tar.gz
http://ftp.mozilla.org/pub/mozilla.org/webtools/bugzilla-4.4.5.tar.gz
解压Bugzilla到nginx站点根目录
二、创建数据库
mysql -u root -p
create database bugs; #创建数据库
insert into mysql.user(Host,User,Password) values('localhost','bugs',password('bugs')); #新建账户bugs,密码bugs
flush privileges; #刷新系统授权表
grant all on bugs.* to 'bugs'@'localhost' identified by 'bugs' with grant option;
flush privileges; #刷新系统授权表
三、安装Bugzilla
perl -MCPAN -e shell #设置参数,设置cpan镜像,cpan会让你设置参数 一直按回车 到最后输入一个cpan的镜像就好了,选择中科大的源,
进入到Bugzilla文件根目录
./checksetup.pl --check-modules #检查模块
/usr/bin/perl install-module.pl DateTime #安装模块
/usr/bin/perl install-module.pl List::MoreUtils
/usr/bin/perl install-module.pl DateTime::Locale
yum install mysql-devel #安装mysql数据库驱动,根据提示安装相应的模块,直到检查全部通过。
./checksetup.pl #根据提示安装输入管理员邮箱、账号密码等信息
提示:bugzilla-3.4.6需要再CentOS5.x下安装,CentOS6.x安装会出错。