WEB服务器之——Nginx支持CGI

安装NGINX步骤省略。

以下操作均在su下完成

======================================================================

安装perl略。(yum -y install perl*)

开启perl-FCGI支持

perl -MCPAN -e ‘install FCGI‘

perl -MCPAN -e ‘install FCGI::ProcManager

配置perl-fcgi守护进程perl-fcgi.pl存放于nginx/sbin目录下。chmod 755 perl-fcgi.pl

#!/usr/bin/perl
use FCGI;
use Socket;
use POSIX qw(setsid);
require ‘syscall.ph‘;
&daemonize;
END() { } BEGIN() { }
*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; };
eval q{exit};
if ([email protected]) {
        exit unless [email protected] =~ /^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:9001", 10 ); #use IP sockets
        $socket = FCGI::OpenSocket( "/usr/local/services/nginx/logs/perl-fcgi.sock", 51200 ); #use UNIX sockets - user running this script must have w access to the ‘nginx‘ folder!!
        $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 - 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 exist or is not executable by this process.\n";
            }
        }
}ce
时间: 2024-10-22 14:45:36

WEB服务器之——Nginx支持CGI的相关文章

搭建高性能web服务器之Nginx入门介绍(1.1)

<第1章研究Nginx前的准备工作,本章介绍了Nginx的特点以及在什么场景下需要使用Nginx,同时介绍了如何获取Nginx以及如何配置.编译.安装运行Nginx.本章还深入介绍了最为复杂的configure过程,这部分内容是学习本书第二部分和第三部分的基础.本节为大家介绍Nginx是什么>. 1.Nginx是什么,Nginx能帮我们做什么 2012年,Nginx荣获年度云计算开发奖(2012 Cloud Award for Developer of the Year),并成长为世界第二大W

搭建高性能web服务器之Nginx入门介绍(1.2)

前面为讲到Nginx的起源,那么这么优秀的web server有哪些特点呢,众多web server中Nginx有什么特点呢,下面我们来讲到Nginx的特点. 1.2Nginx有哪些特点? (1)更快 这表现在两个方面:一方面,在正常情况下,单次请求会得到更快的响应:另一方面,在高峰期(如有数以万计的并发请求),Nginx可以比其他Web服务器更快地响应请求. (2)高扩展性 Nginx的设计极具扩展性,它完全是由多个不同功能.不同层次.不同类型且耦合度极低的模块组成.因此,当对某一个模块修复B

【转】Web服务器之Nginx详解(理论部分)

大纲 一.前言 二.Web服务器提供服务的方式 三.多进程.多线程.异步模式的对比 四.Web 服务请求过程 五.Linux I/O 模型 六.Linux I/O 模型具体说明 七.Linux I/O模型的具体实现 八.Apache 的工作模式 九.支持高并发的Web服务器 十.Nginx 详解 一.前言 注,在说Web服务器之前,先说说线程.进程.以及并发连接数. 1.进程与线程 进程是具有一定独立功能的程序,关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.从逻辑

web服务器之nginx和apache的区别

① apache属于重量级的服务器,nginx属于轻量级的服务器; 区别在于对一些功能的支持,比如:  pathinfo,php模块方面 ② nginx抗高并发能力强. 由于nginx采用的是异步非阻塞模式,而apache是阻塞模式; ③ nginx采用的是异步固定进程,而apache是同步多进程,一个连接对应一个进程; ④ nginx适合处理静态资源和反向代理,apache适合处理动态资源; ⑤ apache的重写模块比nginx要强大; ⑥ nginx支持平滑操作,在线升级; 扩展:常见的w

搭建高性能web服务器之Nginx安装与配置(2.3)

<上一章节介绍了如何获取Nginx以及如何配置.编译.安装运行Nginx.但是很多情况下我们是根据需要来编译Nginx,这里不得不说道nginx的./configure相关参数> 一 Nginx的./configure编译参数说明介绍 可以看出,configure命令至关重要,比如根据自己需要选择性的安装nginx是很有必要的,下文将详细介绍如何使用configure命令使用方法. 我们在解压了nginx的源码后,进入到nginx的源码目录使用"./configure --help&

搭建高性能web服务器之Nginx安装与配置(2.7)

本章将介绍了Nginx的工作原理 在正式运营环境下,部署Nginx时都是使用一个master进程来管理多个worker进程,一般情况下,worker进程的数量与服务器上的CPU核心数相等.每一个worker进程都是繁忙的,它们在真正地提供互联网服务,master进程则很"清闲",只负责监控管理worker进程.worker进程之间通过共享内存.原子操作等一些进程间通信机制来实现负载均衡等功能 Nginx是支持单进程(master进程)提供服务的,那么为什么运营环境下要按照master-

搭建高性能web服务器之Nginx安装与配置(2.8)

优雅关闭上一小节,我们讲到了关于nginx是如何工作的,本小节我们将讲到关于nginx主配置文件(nginx.conf)相关的配置语法进行相关说明 1.用于调试进程和定位问题的配置项 1.1关于nginx的守护进程 语法:daemon on | off; 是否以守护进程运行nginx   默认值:daemon on; 守护进程(daemon)是脱离终端并且在后台运行的进程.它脱离终端是为了避免进程执行过程中的信息在任何终端上显示,这样一来,进程也不会被任何终端所产生的信息所打断.Nginx毫无疑

Web服务器之Nginx

Nginx   Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务. 其特点是占有内存少,并发能力强. 如果我们在项目中用到了Nginx,那么可以用如下的示意图表示: 在这样的一个架构当中,Nginx就被叫做负载均衡服务器或者是反向代理服务器,所有的请求首先会被Nginx给拦截到,然后再由Nginx根据之前配置好的转发规则来将客户端的请求转发到某一个tomcat上去. 那么什么是负载均衡呢,什么又是反向代理呢,那么有没有正向代理呢?下面我来一一解释

搭建高性能web服务器之Nginx安装与配置说明(2.2)

<本章节介绍了如何获取Nginx以及如何配置.编译.安装运行Nginx.深入介绍了最为复杂的configure过程,以及编译Nginx相关参数的介绍> 上一章节,我们简单的了解Nginx安装前需要准备的依赖包以及先关系统内核优化参数,本章节我们就着实讲到nginx的安装过程,比如nginx安装的一些参数说明,安装过程中遇到的一些问题 一.源码安装nginx 1.1下载nginx源码包  我们可以在Nginx官方网站(http://nginx.org/en/download.html)获取Ngi