CGI
CGI全称通用网关接口 Commmon Gateway Interface。CGI描述了服务器和请求处理程序之间传输数据的一种标准。
fastcgi
传统CGI接口
传统CGI接口方式性能较差,由于每次HTTP服务器遇到动态程序需要重启解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发时,几乎是不可能的,因此诞生了FastCGI。
fastcgi接口
当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。fastcgi是一个可伸缩地、高速地在HTTP服务器和动态脚本语言间通信的接口
fastCGI接口的特点
- 是HTTP服务器和动态脚本语言间通信的接口或者工具!
- 优点就是把动态语言解析和HTTP服务器分离了开来!
- Nginx、Apache、lighttpd以及多数动态语言都支持FastCGI。
- 接口方式采用C/S结构,分为HTTP服务器(客户端)和动态语言解析服务器(服务端)
- PHP动态语言服务端可以启动多个FastCGI的守护进程例如:php-fpm(fcgi process mangemnt))
- http服务器通过(Nginx fastgi_pass)FastCGI客户端和动态语言FastCGI服务端通信(例如:php-fpm)
Nginx FastCGI的运行原理
Nginx 不支持对外部动态程序的直接调用或者解析 ,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在linux下是socket,(这个socket可以是文件socket,也可以是IP socket)。为了调用CGI程序,还需要wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,warpper接収到请求,然后派出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据,接着,wrapper再将返回的数据通过FastCGI接口,沿着固定socket传递给Nginx;最后,nginx将返回的数据发送给客户端,这就是Nginx+fastcgi的整个运行过程。
nginx fastcgi访问php
1、用户发送http请求报文给nginx服务器
2、nginx会根据文件url和后缀来判断请求
3、如果请求的是静态内容,nginx会将结果直接返回给用户
4、如果请求的是动态内容,nginx会将请求交给fastcgi客户端,通过fastcgi_pass将这个请求发送给php-fpm
5、php-fpm会将请求交给wrapper
6、wrapper收到请求会生成新的线程调用php动态程序解析服务器
7、如果用户请求的是博文、或者内容、PHP会请求MySQL查询结果
8、如果用户请求的是图片、附件、PHP会请求nfs存储查询结果
9、php会将查询到的结果交给Nginx
10、nginx会生成一个响应报文返还给用户
知识补充:
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
scgi
SCGI(Simple Common Gateway Interface)与FastCGI相似,也是CGI的一个替代协议,SCGI源于Python社区,
uwsgi
WIGS(Web Server Gateway Interface)服务器网关接
WIGS是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受, 它已基本达成它的可移植性方面的目标。
参考
http://runningyongboy.blog.51cto.com/8234857/1722299