FastCGI的认识与使用[通俗易懂]

FastCGI的认识与使用[通俗易懂]01.CGI1.1什么是CGI通用网关接口(CommonGatewayInterface、CGI)描述了客户端和服务器程序之间传输数据的一种标准,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI独立于任何语言的,CGI程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行。Unixshellscript、Python、Ruby、…

大家好,又见面了,我是你们的朋友全栈君。

01. CGI

1.1 什么是CGI

通用网关接口(Common Gateway Interface、CGI)描述了客户端和服务器程序之间传输数据的一种标准,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI独立于任何语言的,CGI 程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行。Unix shell script、Python、Ruby、PHP、 perl、Tcl、 C/C++和 Visual Basic 都可以用来编写 CGI 程序。

1.2 CGI处理流程

  1. web服务器收到客户端(浏览器)的请求Http Request,启动CGI程序,并通过环境变量、标准输入传递数据

  2. CGI进程启动解析器、加载配置(如业务相关配置)、连接其它服务器(如数据库服务器)、逻辑处理等

  3. CGI进程将处理结果通过标准输出、标准错误,传递给web服务器

  4. web服务器收到CGI返回的结果,构建Http Response返回给客户端,并杀死CGI进程
    在这里插入图片描述
    web服务器与CGI通过环境变量、标准输入、标准输出、标准错误互相传递数据。在遇到用户连接请求:

  • 先要创建CGI子进程,然后CGI子进程处理请求,处理完事退出这个子进程:fork-and-execute
  • CGI方式是客户端有多少个请求,就开辟多少个子进程,每个子进程都需要启动自己的解释器、加载配置,连接其他服务器等初始化工作,这是CGI进程性能低下的主要原因。当用户请求非常多的时候,会占用大量的内存、cpu等资源,造成性能低下。

CGI使外部程序与Web服务器之间交互成为可能。CGI程序运行在独立的进程中,并对每个Web请求建立一个进程,这种方法非常容易实现,但效率很差,难以扩展。面对大量请求,进程的大量建立和消亡使操作系统性能大大下降。此外,由于地址空间无法共享,也限制了资源重用。

1.3 CGI程序结构

在这里插入图片描述

02. FastCGI

2.1 什么是FastCGI

快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关接口(CGI)的改进,描述了客户端和服务器程序之间传输数据的一种标准。

FastCGI致力于减少Web服务器与CGI程式之间互动的开销,从而使服务器可以同时处理更多的Web请求。与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理,而不是web服务器

2.2 FastCGI处理流程

  1. Web 服务器启动时载入初始化FastCGI执行环境。 例如IIS、ISAPI、apache mod_fastcgi、nginx ngx_http_fastcgi_module、lighttpd mod_fastcgi。

  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web服务器的连接。启动FastCGI进程时,可以配置以ip和UNIX 域socket两种方式启动。

  3. 当客户端请求到达Web 服务器时, Web 服务器将请求采用socket方式转发FastCGI主进程,FastCGI主进程选择并连接到一个CGI解释器。Web 服务器将CGI环境变量和标准输入发送到FastCGI子进程。

  4. FastCGI子进程完成处理后将标准输出和错误信息从同一socket连接返回Web 服务器。当FastCGI子进程关闭连接时,请求便处理完成。

  5. FastCGI子进程接着等待并处理来自Web 服务器的下一个连接。
    在这里插入图片描述
    由于FastCGI程序并不需要不断的产生新进程,可以大大降低服务器的压力并且产生较高的应用效率。它的速度效率最少要比CGI 技术提高 5 倍以上。它还支持分布式的部署,即FastCGI 程序可以在web 服务器以外的主机上执行。

CGI 是所谓的短生存期应用程序,FastCGI 是所谓的长生存期应用程序。FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)

2.3 FastCGI程序结构

在这里插入图片描述

2.4 FastCGI配置

配置Nginx

        location /fastcgi { 
   
            include fastcgi.conf; #包含fastCGI的参数
            fastcgi_pass 192.168.199.151:8080; #配置Windows服务端的应用
        }   

03. spawn-fcgi

3.1 什么是spawn-fcgi

Nginx不能像Apache那样直接执行外部可执行程序,但Nginx可以作为代理服务器,将请求转发给后端服务器,这也是Nginx的主要作用之一。其中Nginx就支持FastCGI代理,接收客户端的请求,然后将请求转发给后端FastCGI进程。

由于FastCGI进程由FastCGI进程管理器管理,而不是Nginx。这样就需要一个FastCGI进程管理器,管理我们编写FastCGI程序。

spawn-fcgi是一个通用的FastCGI进程管理器,简单小巧,原先是属于lighttpd的一部分,后来由于使用比较广泛,所以就迁移出来作为独立项目。

spawn-fcgi使用pre-fork 模型,功能主要是打开监听端口,绑定地址,然后fork-and-exec创建我们编写的FastCGI应用程序进程,退出完成工作。FastCGI应用程序初始化,然后进入死循环侦听socket的连接请求

3.2 spawn-fcgi安装

安装包下载地址:https://github.com/lighttpd/spawn-fcgi

链接:https://pan.baidu.com/s/13lt89QTYhHwQkOxTUyJ9Yg
提取码:7f99

第一步:解压

:~/nginx$ unzip spawn-fcgi-master.zip 

第二步: 生成configure文件

:~/nginx/spawn-fcgi-master$ ./autogen.sh 
configure.ac:12: installing './compile'
configure.ac:9: installing './install-sh'
configure.ac:9: installing './missing'
src/Makefile.am: installing './depcomp'
Now type './configure ...' and 'make' to compile.

第三步: 生成Makefile

:~/nginx/spawn-fcgi-master$ ./configure 

第四步: 编译

:~/nginx/spawn-fcgi-master$ make

第五步: 安装

:~/nginx/spawn-fcgi-master$ sudo make install

第六步: 测试

:~/nginx/spawn-fcgi-master$ spawn-fcgi 
Usage: spawn-fcgi [options] [-- <fcgiapp> [fcgi app arguments]]

spawn-fcgi v1.6.5 - spawns FastCGI processes

Options:
...

3.3 spawn-fcgi命令

pawn-fcgi的帮助信息可以通过man spawn-fcgi或spawn-fcgi -h获得,下面是部分常用

spawn-fcgi参数信息:

参数 含义
-f 指定调用FastCGI的进程的执行程序位置
-d 在部署前,切换到某个目录,修改运行目录
-a 绑定到地址addr 默认0.0.0.0
-p 绑定到端口port
-s 绑定到unix domain socket
-C 指定产生的FastCGI的进程数,默认为5(仅用于PHP)
-P 指定产生的进程的PID文件路径
-F 指定产生的FastCGI的进程数(C的CGI用这个)
-u和-g FastCGI 使用什么身份(-u用户、-g用户组)运行,CentOS下可以使用apache用户,其他的根据情况配置,如nobody、www-data等

04. FastCGI安装

使用C/C++编写FastCGI应用程序,可以使用FastCGI软件开发套件或者其它开发框架,如fcgi。

官方网站:https://fastcgi-archives.github.io/

gitHub下载: https://github.com/FastCGI-Archives/fcgi2

第一步:解压

:~/nginx$ unzip FastCGI_master.zip 

第二步:生成configure

:~/nginx/fcgi2-master$ ./autogen.sh

第三步:生成makefile

:~/nginx/fcgi2-master$ ./configure

第四步:编译

:~/nginx/fcgi2-master$ make 

第五步:安装

:~/nginx/fcgi2-master$ sudo make install 

05. 部署FastCGI程序

进入 fastCGI框架源代码目录 example/echo 是一个简单的fastCGI程序, 可以 ./echo 来运行
将这些fastCGI部署起来,做成一个服务,给nginx使用,就要使用fastCGI进程管理器

示例:

# spawn-fcgi -f ./echo -a 0.0.0.0 -p 10000
spawn-fcgi: child spawned successfully: PID: 13837
# 启动成功之后 显示了这个fastCGI程序的PID

部署流程

第一步:配置Nginx

#在Server中添加如下内容 
        location /echo { 
   
            include fastcgi.conf; #包含fastCGI的参数
            fastcgi_pass 127.0.0.1:8080; #指定fastCGI的程序
        } 

第二步:启动cgi程序

:~/nginx/fcgi2-master/examples$ pwd
/home/deng/nginx/fcgi2-master/examples
:~/nginx/fcgi2-master/examples$ spawn-fcgi -f ./echo -a 127.0.0.1 -p 8080
spawn-fcgi: child spawned successfully: PID: 15693

第三步:重新启动Nginx,然后使用浏览器测试
在这里插入图片描述

06. FastCGI程序示例

fastcgi程序完成了一个返回客户端IP地址的功能。

#include <stdlib.h>
#include <fcgi_stdio.h>
int main()
{ 
   
    while (FCGI_Accept() >= 0)
    { 
   
        printf("Content-Type:text\r\n\r\n");
        printf("clint ip is %s\r\n", getenv("REMOTE_ADDR"));
    }
    return 0;
}

编译和测试

:~/tmp$ gcc test.c  -lfcgi
:~/tmp$ REMOTE_ADDR="192.168.13.144" ./a.out  
content-Type:test

client ip is 192.168.13.144

使用Nginx部署测试 启动程序

:~/tmp$ spawn-fcgi -f ./a.out -a 127.0.0.1 -p 10086
spawn-fcgi: child spawned successfully: PID: 17122

配置Nginx

        location /echo { 
   
            include fastcgi.conf; #包含fastCGI的参数
            fastcgi_pass 127.0.0.1:10086; #指定fastCGI的程序
        }

使用浏览器测试

在这里插入图片描述

总结:
1.使用fcgi库时的三要素:

  • while (FCGI_Accept() >= 0)循环内写业务

  • 用getenv和fread(buf, sizeof(buf), 1, stdin)获取用户的请求

  • 用printf向用户展示数据;

数据格式是

  • 若干行回复数据头(最简形式Content-Type:text\r\n)

  • 一个空行

  • 回复数据体

2.spawn-cgi启动fastcgi程序时要和nginx的fastcgi_pass配置项对应好

3.良好的设计是:不同目的的请求用不同的FastCGI程序处理。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157437.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • web渗透测试—-33、HttpOnly[通俗易懂]

    web渗透测试—-33、HttpOnly[通俗易懂]HttpOnly是微软公司的InternetExplorer6SP1引入的一项新特性。这个特性为cookie提供了一个新属性,用以阻止客户端脚本访问Cookie,至今已经称为一个标准,几乎所有的浏览器都会支持HttpOnly。下面示例显示了HTTP响应标头中HttpOnly使用的语法:Set-Cookie:<name>=<value>[;<Max-Age>=<age>]`[;expires=<date>][;domain=&lt

  • eclipse android环境搭建,Eclipse Android开发环境搭建教程

    eclipse android环境搭建,Eclipse Android开发环境搭建教程EclipseAndroid开发环境搭建教程是本文要介绍的内容,主要是来了解并学习EclipseAndroid环境搭建的过程,具体关于EclipseAndroid内容的详解来看本文。EclipseAndroid开发准备:1、javasdk2、eclipsehttp://www.eclipse.org/downloads/3、android-sdk-windows安装好java环境和ecli…

  • k8s支持的存储_k8s安装与配置与优化

    k8s支持的存储_k8s安装与配置与优化k8sPV和PVC概述PVPVC生命周期配置存储ConfigMapSecretPV和PVC概述前面我们已经学习了使用NFS提供存储,此时就要求用户会搭建NFS系统,并且会在yaml配置nfs。由于kubernetes支持的存储系统有很多,要求客户全部掌握,显然不现实。为了能够屏蔽底层存储实现的细节,方便用户使用,kubernetes引入了PV和PVC两种资源对象。PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下PV由kubernetes管理员进行创

  • vlan trunk对应的协议是_清楚怎么解释

    vlan trunk对应的协议是_清楚怎么解释什么是vlanvlan(VirtualLAN),翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域。在此之前让我们先复习一下广播域的概念。广播域,指的是广播帧(目标MAC地址全部为1)所能传递到的范围,亦即能够直接通信的范围。严格地说,并不仅仅是广播帧,多播帧(MulticastFrame)和目标不明的单播帧(UnknownUnicastFrame)也能在同一个广播域中畅行无

  • mycat实现读写分离_mycat分表规则

    mycat实现读写分离_mycat分表规则主从复制,读写分离,Mycat中间件

    2022年10月13日
  • 单片机八路抢答器计设计_基于单片机的三路抢答器设计

    单片机八路抢答器计设计_基于单片机的三路抢答器设计详细代码讨论加我QQ:1271370903一、设计任务与要求一、题目:8路比赛抢答器二、基本要求:利用8051单片机中断系统,制作一个有8个按键的比赛抢答器。在有人按键时进行对应选手显示。三、设计任务:1.设计硬件电路,画出电路原理图;2.画出程序流程图;3.编制程序,写出源程序代码;4.写出5000字的详细说明书,要求字迹工整,原理叙述正确,会计算主要元器件的一些参数,并选择元器件;5.个人总结。四、参考资料:1.教材;2.单片机实验指导书》**二、方案设计**方案:该系

    2022年10月20日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号