【学习笔记】FastCGI学习笔记

前言

建议先看完后面链接的参考文章再看我这篇,因为我这篇是比较总结性的。
其中加了一些个人理解,有误之处,请大神指教。

cgi是什么

CGI全称"通用网关接口"(Common Gateway Interface),用于HTTP服务器与其它机器上的程序服务通信交流的一种工具。
用来规范web服务器传输到php解释器中的数据类型以及数据格式,包括URL、查询字符串、POST数据、HTTP header等,也就是为了保证web server传递过来的数据是标准格式的

什么是FastCGI

FastCGI(Fast Common Gateway Interface)全称是“快速通用网关接口”,是通用网关接口(CGI)的增强版本,由CGI发展改进而来,主要用来提高CGI程序性能。
简单粗暴理解就是用完不断链接的cgi。

FastCGI的意义

传统CGI接口方式的主要缺点是性能较差,因为每次HTTP服务器遇到动态程序时都需要重启解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问几乎是不可用的。

FastCGI程序的工作原理

当web服务器启动时,php-fpm随之启动,读取php.ini,根据其中关于php-cgi的配置,启动对应多少个php-cgi进程等待,等待nginx的连接。
当nginx接收到客户端请求时,经过FastCGI传给php-fpm选择并连接到一个php-cgi进程。nginx会将相关环境变量和标准输入发送到php-cgi进行处理。
FastCGI子进程完成处理后将数据按照CGI规定的格式返回给nginx,然后等待下一次请求或者自动根据情况关闭该FastCGI子进程(可伸缩性架构)。
在这里插入图片描述

FastCGI程序的安全性

把动态语言解析器和web服务器分离开了,独立于web服务器运行。
(为什么说安全的原因,动态语言服务器容易出问题,被上传了个恶意程序什么的,分开了就不影响静态那边,网站可能还能继续访问)

FastCGI程序的高性能

直接说人话,多进程,长连接,可伸缩架构。

FastCGI可伸缩架构是什么

Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。
当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然提高。
当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,就会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。
说人话,自动根据使用量去调整进程数。

FastCGI的不足

因为是在内存中同时运行多进程,所以会比CGI方式消耗更多的服务器内存,每个PHP-CGI进程消耗7至25兆内存,在进行优化配置php-cgi进程池的数量时要注意系统内存,防止过量。
就是多进程吃内存。但是优化的本质本来就是空间换时间,没什么好说的,鱼和熊掌不可兼得。

什么是php-fpm

可以理解为是php-cgi的进程管理器。

php-fpm的意义

因为php-cgi变更php.ini配置后需重启php-cgi才能让新的配置生效,不可以平滑重启。但是重启过程中php就不能运行了。这对线上环境来说是不友好的,所以就有了php-fpm。
修改php.ini之后,php-fpm使php-cgi创建新的线程使用新配置,旧的线程正在处理任务的继续使用旧的,旧任务处理完毕后,旧线程销毁。保证一直有php-cgi的进程活着,从而实现平滑过渡。
说人话,可以修改php配置又不重启php。

学习过程疑问

FastCGI到底是什么?又说只是一个协议?又说什么多进程?
FastCGI本身是一个协议,规定了传给语言解析器的格式规范。但是有的时候说“FastCGI”这个词的时候指的是实现这个协议的程序,就是“实现FastCGI协议的程序”简称就“FastCGI”了,所以阅读的时候根据上下文理解。

参考

https://www.jianshu.com/p/565217337247 https://www.cnblogs.com/tssc/p/10255590.html