NginxPHPFPM运行原理

36次阅读

共计 1906 个字符,预计需要花费 5 分钟才能阅读完成。

Nginx 与 PHP 运行原理

名词说明

CGI
common gateway interface (公共网关接口)

请求模式:
    Web Brower(浏览器) ----(通过 http 协议传输)----> Http Server(服务器 nginx/apache) -----> CGI Program -----> Db

Server 与 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.Web Server 启动时载入 FastCGI 进程管理器(IIS ISAPI 或 Apache Module)
    2.FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程 (可见多个 php-cgi) 并等待来自 Web Server 的连接。3. 当客户端请求到达 Web Server 时,FastCGI 进程管理器选择并连接到一个 CGI 解释器。Web server 将 CGI 环境变量和标准输入发送到 FastCGI 子进程 php-cgi。4.FastCGI 子进程完成处理后将标准输出和错误信息从同一连接返回 Web Server。当 FastCGI 子进程关闭连接时,请求便告处理完成。FastCGI 子进程接着等待并处理来自 FastCGI 进程管理器 (运行在 Web Server 中) 的下一个连接。在 CGI 模式中,php-cgi 在此便退出了。
php-fpm(PHP 内置的一种 fast-cgi)
php-fpm 即 php-Fastcgi Process Manager.
php-fpm 是 FastCGI 的实现,并提供了进程管理的功能。进程包含 master 进程和 worker 进程两种进程。master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。
请求步骤
Web Brower(浏览器访问) www.example.com
|
        |
   通过 http 协议传输  
|
        |
    http server
 (服务器 nginx/apache)            
|
        |
     配置解析    
路由到 www.example.com/index.php
|
        |
加载 nginx 的 fast-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 等参数    [|      frame   执行 php 脚本      code                可以重复执行(一般为框架内容)
|              请求处理完成      request          ]
|              关闭模块         close
|
       |
    其它内容   
|
       |         
nginx 将结果通过 http 返回给浏览器

正文完
 0