当前位置: 首页 > 后端技术 > PHP

Nginx+PHP-FPM运行原理

时间:2023-03-30 01:53:09 PHP

Nginx和PHP运行原理术语说明CGI通用网关接口(publicgatewayinterface)请求方式:WebBrower(浏览器)----(通过http协议传输)---->HttpServer(servernginx/apache)----->CGIProgram----->DbServer和CGI通过STDIN/STDOUT(标准输入/输出)进行数据传输nginx(动态加载模块)apache(指定加载模块)CGI工作原理每当客户端请求CGI时,WEB服务器请求操作系统生成一个新的CGI解释器进程(如php-cgi.exe),一个CGI进程处理完一个请求就退出,下一个请求来了再创建一个新的过程。当然,在访问量少,没有并发的情况下,这也是可以的。但是当访问量增加,存在并发时,这种方式就不适用了。于是就有了fastcgi。FastCGI就像一个常驻(long-live)的CGI,可以一直执行,只要激活,每次fork都不会花时间(这是CGI最被诟病的fork-and-execute模式).总的来说,FastCGI的整个工作流程如下:1.WebServer启动时加载FastCGI进程管理器(IISISAPI或ApacheModule)。2.FastCGI进程管理器初始化自身并启动多个CGI解释器进程(参见多个php-cgi)并等待来自WebServer的连接。3.当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接到CGI解释器。Web服务器将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。4.FastCGI子进程完成处理后,标准输出和错误信息会从同一个连接返回给WebServer。当FastCGI子进程关闭连接时,请求被处理。FastCGI子进程然后等待并处理来自FastCGI进程管理器(在Web服务器中运行)的下一个连接。在CGI模式下,php-cgi在这里退出。php-fpm(PHP内置的fast-cgi)php-fpm是php-Fastcgi进程管理器。php-fpm是FastCGI的实现,提供进程管理的功能。进程包括master进程和worker进程。master进程只有一个,负责监听端口和接收来自WebServer的请求,而worker进程一般有多个(具体数量根据实际需要配置)。每个进程都嵌入了一个PHP解释器,也就是PHP代码的实际执行。这个地方。请求步骤WebBrower(浏览器访问)www.example.com||通过http协议传输||http服务器(服务器nginx/apache)||配置并解析到www.example.com/index.php|的路由|加载nginxfast-cgi模块||fast-cgi监听127.0.0.1:9000地址,通过fast-cgi协议将请求转发给php-fpm||请求到达127.0.0.1:9000||php-fpm监听127.0.0.1:9000通过php-fpm.conf修改(php-fpm是一个多进程的fast-cgi管理程序)||php-fpm接收请求并开启worker进程处理请求(worker进程会抢先获取cgi请求进行处理)||php-fpm处理请求||处理详情||处理过程:等待php脚本解析,等待业务处理结果返回,|完成后回收子进程,整个进程阻塞等待。|处理缺点:也就是php-fpm中有多少进程就可以处理多少请求。假设php-fpm有200个worker进程,一个请求需要1秒,那么简单来说,整个服务器理论上最多可以处理200个请求,QPS为200/s。|在高并发场景下,这样的性能往往是不够的,虽然nginx可以作为负载均衡器为多个php-fpm服务器提供服务。|但是由于php-fpm阻塞等待的工作模型,一个请求至少会占用一个MySQL连接,|多节点高并发下会产生大量的MySQL连接,最大MySQL连接数默认为100,可以修改。|但是很明显这种模式无法应对高并发场景||PHP生命周期(宏都在在walu.c)|预初始化(Apache或Nginx相关操作)|模块初始化对应扩展的php.dll|请求初始化$_SERVER等参数[|完成请求]|关闭模块关闭||其他内容||nginx通过http返回结果给浏览器