用了那么多 LNMP, 你真的了解 N 与 P 交互吗?

定义 CGI,FastCGI,PHP-FPM#

  1. 什么是 CGI?

    CGI 是一种通用网关协议。为了解决不同的语言解释器 (如 php、python 解释器) 与 WebServer 的通信而产生的一种协议。只要遵守这种协议就能实现语言与 WebServer 通讯。CGI 是规定了要传什么数据/以什么格式传输给 php 解析器的协议。

  2. 什么是 FastCGI?

    是一种对 CGI 协议升华的一种协议。FastCGI 像是一个常驻 (long-live) 型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次 (这是 CGI 最为人诟病的 fork-and-execute 模式)。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。。

  3. 什么是 PHP-FPM?

    (PHP FastCGI Process Manager),PHP-FPM 是一个实现了 Fastcgi 协议的程序,用来管理 Fastcgi 起的进程的,即能够调度 php-cgi 进程的程序。并提供了进程管理的功能。进程包含 master 进程和 worker 进程两种进程。master 进程只有一个,负责监听端口 (默认 9000),接收来自 WebServer 的请求,而 worker 进程则一般有多个 (具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

  4. FastCGI 好在哪里?

    Fastcgi 则会先 fork 一个 master,解析配置文件,初始化执行环境,然后再 fork 多个 worker。当请求过来时,master 会传递给一个 worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当 worker 不够用时,master 可以根据配置预先启动几个 worker 等着;当然空闲 worker 太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是 Fastcgi 的对进程的管理。大多数 Fastcgi 实现都会维护一个进程池。注:swoole 作为 httpserver,实际上也是类似这样的工作方式。

Nginx 与 PHP 交互过程#

file
(图片来源于慕课网教程)


我们以用户访问 index.php 为,服务器环境为 LNMP:

  1. 用户请求 index.php 时,首先到 Nginx
  2. Nginx 流程步骤:
    • 根据配置查找路由
    • 加载 nginx 的 fast-cgi 模块 (FastCGI 的 Client), 将根据 fastcgi.conf 文件中 fastcgi_* 配置参数值也一并加入转发任务中
    • 根据 nginx.conf 文件 fastcgi_pass 配置将请求转发到 127.0.0.1:9000
  3. PHP-FPM 操作:
    • PHP-FPMmaster 进程监听 9000 端口。
    • 收到请求后调用子进程来处理逻辑,PHP 解释器解释 PHP 语法并返回给 Nginx
  4. Nginx 操作:
    • 将响应返回给用户

相关原文链接#

若有什么不正确指教出来 :bowtie:

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 6年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6
LOST

面试的时候,这个问题出现的频率很高。

6年前 评论

woker 是争抢请求不是分配

6年前 评论
Destiny

通俗易懂

6年前 评论
幽弥狂

挺好。。图太小了 看不清

6年前 评论