热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CentOS系统配置Nginx支持cgi程序

[root@mailsrc]#wgethttp://www.cpan.org/modules/by-module/FCGI/FCGI-0.73.tar.gz[root@mailsrc]#wget[root@mailsrc]#wgethttp://search.cpan.org/CPAN/authors/id/G/GB/
[root@mail src]# wget http://www.cpan.org/modules/by-module/FCGI/FCGI-0.73.tar.gz  
[root@mail src]# wget  [root@mail src]# wget http://search.cpan.org/CPAN/authors/id/G/GB/GBJK/FCGI-ProcManager-0.19.tar.gz  
[root@mail src]# tar ?zxvf FCGI-0.73.tar.gz  
[root@mail src]# cd FCGI-0.73  
[root@mail FCGI-0.73]# perl Makefile.PL  
[root@mail FCGI-0.73]# make && make install  
[root@mail FCGI-0.73]# cd ..  
[root@mail src]# tar ?zxvf FCGI-ProcManager-0.19.tar.gz  
[root@mail FCGI-ProcManager-0.19]# perl Makefile.PL  
[root@mail FCGI-ProcManager-0.19]# make && make install  


接下来需要添加一个脚本,我也是从网上开来的,下面给大家转载来一篇

下面的转载来的,大家看一下

用 perl 写一个 daemon 程序来处理 cgi 文件:
vi /usr/local/bin/cgiwrap-fcgi.pl
#!/usr/bin/perl -w  
use FCGI;  
use Socket;  
use FCGI::ProcManager;  
sub shutdown { FCGI::CloseSocket($socket); exit; }  
sub restart { FCGI::CloseSocket($socket); &main; }  
use sigtrap 'handler', \&shutdown, 'normal-signals';  
use sigtrap 'handler', \&restart,  'HUP';  
require 'syscall.ph';  
use POSIX qw(setsid);  
#&daemonize; we don't daemonize when running under runsv  
#this keeps the program alive or something after exec'ing perl scripts  
END() { }  
BEGIN() { }  
{  
no warnings;  
*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  
#$socket = FCGI::OpenSocket( "/var/run/nginx/perl_cgi-dispatch.sock", 10 ); #use UNIX sockets - user running this script must have w access to the 'nginx' folder!!  
#foreach $item (keys %ENV) { delete $ENV{$item}; }  
$proc_manager = FCGI::ProcManager->new( {n_processes => 5} );  
$socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 )  
        ; #use UNIX sockets - user running this script must have w access to the 'nginx' folder!!  
$request =  
FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket,  
&FCGI::FAIL_ACCEPT_ON_INTR );  
$proc_manager->pm_manage();  
if ($request) { request_loop() }  
FCGI::CloseSocket($socket);  
}  
sub request_loop {  
while ( $request->Accept() >= 0 ) {  
$proc_manager->pm_pre_dispatch();  
#processing any STDIN input from WebServer (for CGI-POST actions)  
$stdin_passthrough = '';  
{ no warnings; $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 );  
pipe( PARENT_ERR, CHILD_ERR );  
my $pid = open( CHILD_O, "-|" );  
unless ( defined($pid) ) {  
print("Content-type: text/plain\r\n\r\n");  
print  
"Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n";  
next;  
}  
$oldfh = select(PARENT_ERR);  
            $|     = 1;  
select(CHILD_O);  
            $| = 1;  
select($oldfh);  
if ( $pid > 0 ) {  
close(CHILD_RD);  
close(CHILD_ERR);  
print PARENT_WR $stdin_passthrough;  
close(PARENT_WR);  
$rin = $rout = $ein = $eout = '';  
vec( $rin, fileno(CHILD_O),    1 ) = 1;  
vec( $rin, fileno(PARENT_ERR), 1 ) = 1;  
$ein    = $rin;  
$nfound = 0;  
while ( $nfound =  
select( $rout = $rin, undef, $ein = $eout, 10 ) )  
{  
die "$!" unless $nfound != -1;  
$r1 = vec( $rout, fileno(PARENT_ERR), 1 ) == 1;  
$r2 = vec( $rout, fileno(CHILD_O),    1 ) == 1;  
$e1 = vec( $eout, fileno(PARENT_ERR), 1 ) == 1;  
$e2 = vec( $eout, fileno(CHILD_O),    1 ) == 1;  
if ($r1) {  
while ( $bytes = read( PARENT_ERR, $errbytes, 4096 ) ) {  
print STDERR $errbytes;  
}  
if ($!) {  
$err = $!;  
die $!;  
vec( $rin, fileno(PARENT_ERR), 1 ) = 0  
unless ( $err == EINTR or $err == EAGAIN );  
}  
}  
if ($r2) {  
while ( $bytes = read( CHILD_O, $s, 4096 ) ) {  
print $s;  
}  
if ( !defined($bytes) ) {  
$err = $!;  
die $!;  
vec( $rin, fileno(CHILD_O), 1 ) = 0  
unless ( $err == EINTR or $err == EAGAIN );  
}  
}  
last if ( $e1 || $e2 );  
}  
close CHILD_RD;  
close PARENT_ERR;  
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(PARENT_ERR);  
close(STDIN);  
close(STDERR);  
#fcntl(CHILD_RD, F_DUPFD, 0);  
syscall( &SYS_dup2, fileno(CHILD_RD),  0 );  
syscall( &SYS_dup2, fileno(CHILD_ERR), 2 );  
#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 exist or is not executable by this process.\n";  
}  
}  
}   
注意文件中的这两行:
#$socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 );
#$socket = FCGI::OpenSocket( "/var/run/nginx/perl_cgi-dispatch.sock", 10 );
这两行都表示监听来自 perl CGI 的请求。
其中 perl_cgi-dispatch.sock 表示使用 unix socket 响应 CGI 请求。
127.0.0.1:8999 表示使用 TCP/IP 协议响应请求。
需要使用哪种方式就在下面的 FCGI::OpenSocket 中填入相对应的内容。
启动:
chmod +x /usr/local/bin/cgiwrap-fcgi.pl
/usr/local/bin/cgiwrap-fcgi.pl > /dev/null 2>&1 &
配置 Nginx 的 location 处理 cgi 文件:
location ~ .*\.cgi$ {
    fastcgi_pass  127.0.0.1:8999;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    include  fastcgi_params;
}
测试:
在 web 的根目录下创建一个 cgi 文件:
vi test.cgi
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, world.";
文件需要有可执行权限:
chmod +x test.cgi
访问 http://www.domain.com/test.cgi 看看有没有输出。

推荐阅读
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 本文详细介绍了如何在Debian系统中正确配置Locale,以确保多语言支持和避免常见的警告信息。 ... [详细]
  • 本文详细介绍如何通过修改配置文件来隐藏Apache、Nginx和PHP的版本号,从而增强网站的安全性。我们将提供具体的配置步骤,并解释这些设置的重要性。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
  • 本文探讨如何配置 Nginx 以将传入请求反向代理到运行在本地绑定端口上的 Docker 容器,并解决常见的路径重定向问题。 ... [详细]
  • 使用Nginx反向代理实现多域名端口映射
    本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
  • 本文详细介绍了如何使用Docker运行最简单的镜像,并创建第一个容器。通过具体的操作步骤和命令解释,帮助初学者快速上手Docker。完整课程请点击:Docker入门教程。 ... [详细]
  • 本文详细介绍了在 Windows 7 系统中配置 Nginx 1.10.3 和 PHP 7.1.1 NTS 的步骤,包括修改 PHP 配置文件、处理依赖项以及创建批处理脚本启动和停止服务。重点解释了如何解决常见的运行时错误。 ... [详细]
  • 探讨在开发、学习和实验过程中,使用 VMware 和 Docker 的优劣,帮助用户根据具体需求做出最佳选择。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 本文旨在回顾并总结近期学习的.NET Core基础知识,通过具体的操作指南加深理解,并为初学者提供实用建议,避免常见的错误和陷阱。内容涵盖CentOS的安装配置、.NET Core环境搭建及网站部署等。 ... [详细]
author-avatar
mobiledu2502927267
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有