文章目录

  • 前言
  • 一、CGI
    • CGI介绍
    • CGI工作流程
    • CGI的弊端
  • 二、fastCGI
    • 介绍
    • fastCGI与CGI的区别
    • fastCGI工作流程
  • 三、fastCGI的使用
    • nginx下的请求
    • 流程介绍
    • nginx.conf文件的配置
    • 启动spawn-fcgi
    • fastCGI程序编写

前言

因为服务器的项目使用到了fastCGI,所以来学习。


一、CGI

在说fastCGI之前,我们要先了解下CGI。毕竟fastCGI是对CGI的优化

CGI介绍

通用网关接口(Common Gateway Interface/CGI)描述了客户端和服务器程序之间传输数据的一种标准,可以
让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI 独立于任何语言的,CGI 程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行。(其实就是对web服务器解析的http请求数据进行处理的)

CGI工作流程

在了解CGI是如何工作之前,我们应该首先知道,整个客户端和服务器请求与响应的处理过程,明白CGI在其中担任什么角色。
整个过程如下图所示:

具体流程如下:
(1)用户通过浏览器访问服务器, 发送了一个请求, 请求的url如下
http://localhost/login?user=zhang3&passwd=123456&age=12&sex=man
(2)服务器接收数据, 对接收的数据进行解析
(3) nginx对于一些登录数据不知道如何处理, nginx将数据发送给了cgi程序,服务器端会创建一个cgi进程
(4)CGI进程执行
(5)服务器将cgi处理结果发送给客户端

了解整体的工作过程,我们知道了其实CGI就是web服务器解析的http请求数据进行处理的。接下来我们把CGI工作的具体流程展开来看。
CGI内部具体结构如下:

CGI进程执行具体过程:
(1)加载配置, 如果有需求加载配置文件获取数据
(2)连接其他服务器: 比如数据库
(3)逻辑处理
(4)得到结果, 将结果发送给服务器
(5)退出

CGI的弊端

从上面整个流程我们知道,nginx将数据发送给cgi程序时,服务器端会创建一个cgi进程。
可见,每当需要处理数据时,都需要频繁的创建和销毁进程,服务器开销太多,效率太低。
因此,我们接下来可以看看fastCGI

二、fastCGI

介绍

快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关接口(CGI)的改进,描述了客户端和服务器程序之间传输数据的一种标准。 FastCGI致力于减少Web服务器与 CGI 程式 之间互动的开销,从而使
服务器 可以同时处理更多的Web请求 。与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理
一连串的请求。这些进程由FastCGI进程管理器管理,而不是web服务器。(nginx下fastcgi与服务器是分离的)

fastCGI与CGI的区别

CGI 就是所谓的短生存期应用程序,FastCGI 就是所谓的长生存期应用程序。FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,不会每次都要花费时间去fork一次
普通CGI就是每发布一个请求,就创建一个进程。
FastCGI是常驻进程,常驻服务,从下面一行代码便看看出

while (FCGI_Accept() >= 0)

fastCGI工作流程

工作流程如下:(注意看fastCGI中的流程与CGI的区别)

具体流程如下:
(1)用户通过浏览器访问服务器, 发送了一个请求, 请求的url如下
http://localhost/login?user=zhang3&passwd=123456&age=12&sex=man
(2)服务器接收数据, 对接收的数据进行解析
(3)nginx对于一些登录数据不知道如何处理, nginx将数据发送给了fastcgi程序
通过本地套接字,网络通信的方式 (通过socket接口进行连通)
(4)启动fastCGI (不是由web服务器直接启动,而是通过一个fastCGI进程管理器启动)
加载配置 - 可选;连接服务器 - 数据库;循环(服务器有请求 -> 处理,将处理结果发送给服务器,没有请求 -> 阻塞)
(5)服务器将fastCGI的处理结果发送给客户端

了解了fastCGI后,接下来我们就开始要学习针对它的使用了

三、fastCGI的使用

nginx下的请求

nginx 不能像apache那样直接执行外部可执行程序,但nginx可以作为代理服务器,将请求转发给后端服务器,
这也是nginx的主要作用之一。其中nginx就支持FastCGI代理,接收客户端的请求,然后将请求转发给后端fastcgi进程。下面介绍如何使用C/C++编写cgi/fastcgi,并部署到nginx中。通过前面的介绍知道,fastcgi进程由FastCGI进程管理器管理,而不是nginx。这样就需要一个FastCGI管理,管理我们编写fastcgi程序。我们使用spawn-fcgi作为FastCGI进程管理器。spawn-fcgi是一个通用的FastCGI进程管理器,简单小巧,原先是属于lighttpd的一部分,后来由于使用比较广泛,所以就迁移出来作为独立项目了。spawn-fcgi使用pre-fork 模型, 功能主要是打开监听端口,绑定地址,然后fork-and-exec创建我们编写的fastcgi应用程序进程,退出完成工作 。fastcgi应用程序初始化,然后进入死循环侦听socket的连接请求。

流程介绍

依旧,先上流程图,让我们有直观的认识

具体步骤如下:
(1)客户端访问, 发送请求,请求的url如下
http://localhost/login?user=zhang3&passwd=123456&age=12&sex=man
(2)nginx web服务器, 无法处理用户提交的数据
(3)spawn-fcgi - 通信过程中的服务器角色
被动接收数据,在spawn-fcgi启动的时候给其绑定IP和端口
(4)执行fastCGI程序
程序猿写的 -> login.c -> 可执行程序( login );使用 spawn-fcgi 进程管理器启动 login 程序, 得到一进程

nginx.conf文件的配置

通过请求的url http://localhost/login?user=zhang3&passwd=123456&age=12&sex=man 转换为一个
指令:
去掉协议(http)
去掉域名/IP + 端口
如果尾部有文件名 去掉
去掉 ? + 后边的字符串
剩下的就是服务器要处理的指令: /login
进行相应配置如下:

location /login
{# 转发这个数据, fastCGI进程fastcgi_pass 地址信息:端口;# fastcgi.conf 和nginx.conf在同一级目录: /usr/local/nginx/conf# 这个文件中定义了一些http通信的时候用到环境变量, nginx赋值的include fastcgi.conf;
}
地址信息:- localhost- 127.0.0.1- 192.168.1.100
端口: 找一个空闲的没有被占用的端口即可

启动spawn-fcgi

# 前提条件: 程序猿的fastCGI程序已经编写完毕 -> 可执行文件 login
spawn-fcgi -a IP地址 -p 端口 -f fastcgi可执行程序
- IP地址: 应该和nginx的 fastcgi_pass 配置项对应
- nginx: localhost -> IP: 127.0.0.1
- nginx: 127.0.0.1 -> IP: 127.0.0.1
- nginx: 192.168.1.100 -> IP: 192.168.1.100
- 端口:
应该和nginx的 fastcgi_pass 中的端口一致

fastCGI程序编写

通过对fastCGI的源码安装目录下的例子(fastcgi/example下的echo.c文件)来学习使用fastCGI。
对这个例子代码的分析:

在我们实现自己逻辑代码的时候,依照下面的流程即可:

// http://localhost/login?user=zhang3&passwd=123456&age=12&sex=man
// 要包含的头文件
#include "fcgi_config.h" // 可选
#include "fcgi_stdio.h" // 必须的, 编译的时候找不到这个头文件, find->path , gcc -I
// 编写代码的流程
int main()
{// FCGI_Accept()是一个阻塞函数, nginx给fastcgi程序发送数据的时候解除阻塞while (FCGI_Accept() >= 0){// 1. 接收数据// 1.1 get方式提交数据 - 数据在请求行的第二部分// user=zhang3&passwd=123456&age=12&sex=manchar *text = getenv("QUERY_STRING");// 1.2 post方式提交数据char *contentLength = getenv("CONTENT_LENGTH");// 根据长度大小判断是否需要循环// 2. 按照业务流程进行处理// 3. 将处理结果发送给nginx// 数据回发的时候, 需要告诉nginx处理结果的格式 - 假设是html格式printf("Content-type: text/html\r\n");printf("<html>处理结果</html>");}
}

对于其中,环境变量的选取,业务流程不一样,选取的就不一样:

fastCGI了解与学习使用相关推荐

  1. JavaScript学习笔记(二十七)——服务器

    服务器是什么? 服务器,也称伺服器,是提供计算服务的设备.由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并保障服务的能力. 服务器的构成包括处理器.硬盘.内存.系统总线等,和 ...

  2. php fcgi children,PHP 进阶之路 - 深入理解 FastCGI 协议以及在 PHP 中的实现

    广告 很多工程师在工作1~3年的时候最容易遇到瓶颈,不知道自己应该学习什么,面试总是吃闭门羹.那么 PHP 后面应该怎么学呢?安利一波我的系列直播 <PHP 进阶之路> 在讨论 FastC ...

  3. linux定时情况root mail,Linux_Linux系统下mail命令使用,我经常用root帐号登录RHEL5,在 - phpStudy...

    Linux系统下mail命令使用 我经常用root帐号登录RHEL5,在终端经常出现: You have new mail in /var/spool/mail/root 这肯定是系统给root超级管 ...

  4. Nginx学习日记第五篇 -- upstream及fastcgi

    一.Nginx upstream Ngx_http_upstream_module模块可实现七层负载均衡,定义的服务器组可被proxy_pass.fastcgi_pass.uwsgi_pass.scg ...

  5. SSRF 攻击PHP-FPM(FastCGI 攻击):学习总结仅供参考

    利用条件: Libcurl版本:高于7.45.0 PHP-FPM:监听端口,版本高于5.3.3 知道目标机器上任意一个php文件绝对路径 一.FastCGI fastcgi其实是一个通信协议,和HTT ...

  6. 从奥运订票系统说起——谈FastCGI 与IT 架构

    2008年,对于首都人民来说,没有什么比奥运会更大的事情了.如何买到一张称心如意的比赛门票,也成了很多人的一个梦想.然而,在奥运官网抢票购买的时候,这个梦想却轻易地被网上购票系统的当机击成碎片,很多充 ...

  7. php安装模式mod_php和Fastcgi的选择与对比

    安装php又面临到了模式的选择,以前都是选择mod_php模式,因为这样安装比较方便哈,今天突然关心起FastCGI这种模式,败毒了一把,找到了一些关于mod_php和Fastcgi的选择与对比这方面 ...

  8. 在Mac上使用Nginx和FastCGI部署Flask应用

    最近在学习Flask,本文介绍一下如何部署Flask开发的应用,同时也学习一下Nginx的使用,这只是在Mac上的一个实验. 应用 这里使用的应用就是官方的文档中给出的Flaskr. 安装Nginx ...

  9. 安装nginx0.7x+php5.2.8(Fastcgi)小结

    本文是在[url]http://blog.s135.com/post/366.htm[/url]基础上安装的,在此记录些有用的东东...我会在这个平台下,做一些个人感觉有意义的 学习,并将其记录下来, ...

最新文章

  1. u盘循环冗余能修复吗_古董修复能修复吗?-恩平 - 商业服务
  2. Android存储方式之SQLite
  3. 贪心  POJ - 3617 ​​​​​​​Best Cow Line
  4. vlfeat 特征检测
  5. Ubuntu下pip3的安装、升级、卸载
  6. Android 通知栏Notification
  7. 用maven运行指定java类main方法
  8. java合并两个有序链表_JS实现的合并两个有序链表算法示例
  9. [css] 移动端的布局用过媒体查询吗?写出例子看看
  10. 有问有答 | 你真的理解微服务架构吗?
  11. oracle怎么设置出蓝色边,Oracle 数据库入门之———————-,多行函数-蓝色留心...
  12. 基于Echarts+HTML5可视化数据大屏展示—设备环境监测平台大数据平台
  13. bmp转换tiff c++代码_如何用Java语言将图像转换为PDF?Spire.PDF for Java轻松搞定
  14. python中组合框_Tkinter Python中的多个组合框
  15. debian解决中文乱码,安装chinese font
  16. 全站仪和手机连接软件_测量员APP全站仪设站的的应用说明
  17. 从逐利到协力 「DAO」阻且长
  18. HashMap知识循序渐进分析
  19. 声网一起 KTV 功能初体验 | 掘金技术征文
  20. 外接显示器屏幕亮度调到最低还是太亮

热门文章

  1. 3G应用开发之Android 传智播客 基础知识总结
  2. 吴超大数据高薪就业班二期和三期(官方培训费11000)
  3. 【身份证识别】身份证号码识别【含GUI Matlab源码 014期】
  4. PWA(渐进式网页应用) + SPA(单页应用)的一个简单的思考
  5. xlwings:操作Excel,通过宏调用Pyhton(VBA调Python)
  6. 车载GPS/北斗定位模块罕见功能
  7. 电子与电路复习题重点大题(附答案)
  8. 如何快速对一张图片进行反色?(python+opencv)
  9. 【第四课】Arcgis软件右键弹出窗口介绍
  10. 第19课 编排节目顺序