fastCGI和spawn-fcgi 安装部署
FastCGI文章目录FastCGICGI介绍什么是CGICGI处理流程环境变量标准输入CGI程序结构FastCGI什么是FastCGIFastCGI处理流程FastCGI程序结构FastCGI测试spawn-fcgi什么是spawn-fcgispawn-fcgi安装spawn-fcgi命令FastCGI安装部署FastCGI程序总结:CGI介绍什么是CGI通用网关接口(Common Gateway Interface、CGI)描述了客户端和服务器程序之间传输数据的一种标准可以让一个客户端从网页浏览器向执行在网络服务器上的程序请求数据。CGI独立于任何语言的CGI 程序可以用任何脚本语言或者是完全独立编程语言实现只要这个语言可以在这个系统上运行。Unix shell script、Python、Ruby、PHP、 perl、Tcl、 C/C和 Visual Basic 都可以用来编写 CGI 程序。CGI处理流程web服务器收到客户端(浏览器)的请求Http Request启动CGI程序并通过环境变量、标准输入传递数据CGI进程启动解析器、加载配置(如业务相关配置)、连接其它服务器(如数据库服务器)、逻辑处理等CGI进程将处理结果通过标准输出、标准错误传递给web服务器web服务器收到CGI返回的结果构建Http Response返回给客户端并杀死CGI进程web服务器与CGI通过环境变量、标准输入、标准输出、标准错误互相传递数据。在遇到用户连接请求先要创建CGI子进程然后CGI子进程处理请求处理完事退出这个子进程fork-and-executeCGI方式是客户端有多少个请求就开辟多少个子进程每个子进程都需要启动自己的解释器、加载配置连接其他服务器等初始化工作这是CGI进程性能低下的主要原因。当用户请求非常多的时候会占用大量的内存、cpu等资源造成性能低下。CGI使外部程序与Web服务器之间交互成为可能。CGI程序运行在独立的进程中并对每个Web请求建立一个进程这种方法非常容易实现但效率很差难以扩展。面对大量请求进程的大量建立和消亡使操作系统性能大大下降。此外由于地址空间无法共享也限制了资源重用。环境变量GET请求它将数据打包放置在环境变量QUERY_STRING中CGI从环境变量QUERY_STRING中获取数据。常见的环境变量如下表所示环境变数含义AUTH_TYPE存取认证类型CONTENT_LENGTH由标准输入传递给CGI程序的数据长度以bytes或字元数来计算CONTENT_TYPE请求的MIME类型GATEWAY_INTERFACE服务器的CGI版本编号HTTP_ACCEPT浏览器能直接接收的Content-types, 可以有HTTP Accept header定义HTTP_USER_AGENT递交表单的浏览器的名称、版本和其他平台性的附加信息HTTP_REFERER递交表单的文本的URL不是所有的浏览器都发出这个信息不要依赖它PATH_INFO传递给CGI程序的路径信息QUERY_STRING传递给CGI程序的请求参数也就是用?隔开添加在URL 后面的字串REMOTE_ADDRclient端的host名称REMOTE_HOSTclient端的IP位址REMOTE_USERclient端送出来的使用者名称REMOTE_METHODclient端发出请求的方法(如get、post)SCRIPT_NAMECGI程序所在的虚拟路径如/cgi-bin/echoSERVER_NAMEserver的host名称或IP地址SERVER_PORT收到request的server端口SERVER_PROTOCOL所使用的通讯协定和版本编号SERVER_SOFTWAREserver程序的名称和版本标准输入环境变量的大小是有一定的限制的当需要传送的数据量大时储存环境变量的空间可能会不足造成数据接收不完全甚至无法执行CGI程序。因此后来又发展出另外一种方法POST也就是利用I/O重新导向的技巧让CGI程序可以由stdin和stdout直接跟浏览器沟通。当我们指定用这种方法传递请求的数据时web服务器收到数据后会先放在一块输入缓冲区中并且将数据的大小记录在CONTENT_LENGTH这个环境变量然后调用CGI程序并将CGI程序的stdin指向这块缓冲区于是我们就可以很顺利的通过stdin和环境变数CONTENT_LENGTH得到所有的信息再没有信息大小的限制了。CGI程序结构FastCGI什么是FastCGI快速通用网关接口(Fast Common Gateway InterfaceFastCGI)是通用网关接口(CGI)的改进描述了客户端和服务器程序之间传输数据的一种标准。FastCGI致力于减少Web服务器与CGI程式之间互动的开销从而使服务器可以同时处理更多的Web请求。与为每个请求创建一个新的进程不同FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理而不是web服务器FastCGI处理流程Web 服务器启动时载入初始化FastCGI执行环境。 例如IIS、ISAPI、apache mod_fastcgi、nginx ngx_http_fastcgi_module、lighttpd mod_fastcgi。FastCGI进程管理器自身初始化启动多个CGI解释器进程并等待来自Web服务器的连接。启动FastCGI进程时可以配置以ip和UNIX 域socket两种方式启动。当客户端请求到达Web 服务器时 Web 服务器将请求采用socket方式转发FastCGI主进程FastCGI主进程选择并连接到一个CGI解释器。Web 服务器将CGI环境变量和标准输入发送到FastCGI子进程。FastCGI子进程完成处理后将标准输出和错误信息从同一socket连接返回Web 服务器。当FastCGI子进程关闭连接时请求便处理完成。FastCGI子进程接着等待并处理来自Web 服务器的下一个连接。由于FastCGI程序并不需要不断的产生新进程可以大大降低服务器的压力并且产生较高的应用效率。它的速度效率最少要比CGI 技术提高 5 倍以上。它还支持分布式的部署即FastCGI 程序可以在web 服务器以外的主机上执行。CGI 是所谓的短生存期应用程序FastCGI 是所谓的长生存期应用程序。FastCGI像是一个常驻(long-live)型的CGI它可以一直执行着不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。FastCGI程序结构FastCGI测试第一步配置Nginxlocation /fastcgi { include fastcgi.conf; #包含fastCGI的参数 fastcgi_pass 192.168.136.139:8080; #配置Windows服务端的应用 }第二步启动Tcp服务端第三步测试 在本地浏览器输入192.168.136.139/fastcgispawn-fcgi什么是spawn-fcgiNginx不能像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的连接请求spawn-fcgi安装安装包下载地址https://github.com/lighttpd/spawn-fcgi第一步解压#解压unzipspawn-fcgi-master.zip第二步: 生成configure文件./autogen.sh第三步: 生成Makefile./configure第四步: 编译make第五步: 安装sudomakeinstall第六步: 测试$ spawn-fcgi Usage: spawn-fcgi[options][--fcgiapp[fcgi app arguments]] spawn-fcgi v1.6.5 - spawns FastCGI processes Options:-fpathfilename of the fcgi-application(deprecated;ignorediffcgiappis given;needs /bin/sh)-ddirectorychdir to directory before spawningspawn-fcgi命令spawn-fcgi的帮助信息可以通过man spawn-fcgi或spawn-fcgi -h获得下面是部分常用spawn-fcgi参数信息参数含义-f指定调用FastCGI的进程的执行程序位置-a绑定到地址addr-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等FastCGI安装使用C/C编写FastCGI应用程序可以使用FastCGI软件开发套件或者其它开发框架如fcgi。官方网站https://fastcgi-archives.github.io/gitHub下载: https://github.com/FastCGI-Archives/fcgi2第一步解压unzipFastCGI_master.zip第二步生成configure./autogen.sh第三步生成makefile./configure第四步编译make第五步安装sudomakeinstall部署FastCGI程序进入 fastCGI框架源代码目录 example/echo 是一个简单的fastCGI程序 可以 ./echo 来运行将这些fastCGI部署起来做成一个服务给nginx使用就要使用fastCGI进程管理器spawn-fcgi -f 程序文件 指定要执行什么fastcgi程序 -d 目录 在部署前切换到某个目录修改运行目录 -a ip 绑定什么ip地址 默认是0.0.0.0 -p port 绑定什么端口号 -s path 使用本地套接字的方式来绑定示例# 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$ spawn-fcgi -f ./echo -a 127.0.0.1 -p 8080 spawn-fcgi: child spawned successfully: PID: 15693第三步重新启动Nginx然后使用浏览器测试192.168.136.139/echo总结:使用fcgi库时的三要素 • while (FCGI_Accept() 0)循环内写业务 • 用getenv和fread(buf, sizeof(buf), 1, stdin)获取用户的请求 • 用printf向用户展示数据数据格式是 • 若干行回复数据头最简形式Content-Type:text\r\n • 一个空行 • 回复数据体spawn-cgi启动fastcgi程序时要和nginx的fastcgi_pass配置项对应好 3) 良好的设计是不同目的的请求用不同的FastCGI程序处理。