理解Nginx与PHP-FPM通信的工作机制

Nginx解析PHP脚本的过程 之前项目中碰到了一些php-fpm的问题:因为网站的一些接口,在特定情况下响应特别慢(1-2分钟),迟迟不结束,导致php-fpm数量越来越多,最后到达127个后,服务器就没能响应正常请求了,浏览器一直打转,迟迟不响应。把接口修好后,php-fpm进程的数量就稳定了,问题得以解决。这让我对php-fpm这个进程产生了兴趣。 在百度和google了不少文章后,我总结了一下关于CGI,fas 阅读详情

转自:https://www.jianshu.com/p/da152c6fdfa6

了解基本原理

浏览器访问网页的过程

请求静态页面

Browser请求http://xxx.com/aa.html -> Web Server(Nginx/Apache)分发 -> 找到aa.html文件返回给Browser。

请求动态脚本

Browser请求http://xxx.com/bb.php -> Web Server(Nginx/Apache)分发 -> PHP解析器(PHP-CGI程序)-> 返回处理结果给Web Server -> 返回数据给Browser。

原理:服务器根据配置文件,知道这是一个PHP脚本文件,需要去找PHP解析器来处理。
PHP解析器会解析php.ini文件初始化执行环境,然后处理请求,再以标准的数据格式返回处理结果,最后退出进程。

CGI 程序到 FPM 进化史

理解Nginx与PHP-FPM通信的工作机制
 

CGI(Common Gateway Interface)

CGI是服务器与后台语言交互的协议,有了这个协议,开发者可以使用任何语言处理服务器转发过来的请求,动态地生成内容,保证了传递过来的数据是标准格式的(规定了以什么样的格式传哪些数据(URL、查询字符串、POST数据、HTTP header等等)),方便了开发者。

PHP-CGI(PHP CGI)

PHP语言对应与服务器交互的CGI程序就是PHP-CGI。

CGI程序本身只能解析请求、返回结果,不会进程管理,所以有一个致命的缺点,那就是每处理一个请求都需要fork一个全新的进程,随着Web的兴起,高并发越来越成为常态,这样低效的方式明显不能满足需求(每一次web请求都会有启动和退出进程,也就是最为人诟病的fork-and-execute模式,这样一在大规模并发下,就死翘翘了)。
就这样,FastCGI诞生了,CGI程序很快就退出了历史的舞台。

FastCGI(Fast CGI)

FastCGI,顾名思义就是更快的CGI程序,用来提高CGI程序性能,它允许在一个进程内处理多个请求,而不是一个请求处理完毕就直接结束进程,性能上有了很大的提高。

  • 提高性能?那么CGI程序的性能问题在哪呢?

PHP解析器会解析php.ini文件,初始化执行环境,就是这里了。
标准的CGI程序对每个请求都会执行这些步骤(不闲累啊!启动进程很累的说!),所以处理每个请求的时间会比较长。这明显不合理嘛!

  • 那么FastCGI是怎么做的呢?

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

ps:也有一些能够调度PHP-CGI进程的程序,比如说由lighthttpd分离出来的spawn-fcgi。好了,PHP-FPM也是这么个东东,在长时间的发展后,逐渐得到了大家的认可(要知道前几年大家可是抱怨PHP-FPM稳定性太差的),也越来越流行。

理解Nginx与PHP-FPM通信的工作机制
 

PHP-FPM(FastCGI Process Manager)

它是FastCGI协议的一个实现,任何实现了FastCGI协议的服务器都能够与之通信。
FPM之于标准的FastCGI程序,也提供了一些增强功能,具体可以参考官方文档:PHP: FPM Installation。

  • FPM是一个PHP进程管理器,包含master和worker两种进程。

master进程只有一个,负责监听端口,接收来自服务器的请求,而worker进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个PHP解释器,是PHP代码真正执行的地方,下面是我本机上FPM的进程情况:1个master进程,2个worker进程。

$ ps -ef | grep fpm

root       130     1  0 01:37 ?        00:00:01 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)

php-fpm    131   130  0 01:37 ?        00:00:00 php-fpm: pool www

php-fpm    133   130  0 01:43 ?        00:00:00 php-fpm: pool www

  • 从FPM接收到请求,到处理完毕,其具体的流程如下:
  1. FPM的master进程接收到请求。
  2. master进程根据配置指派特定的worker进程进行请求处理,如果没有可用进程,返回错误,这也是我们配合Nginx遇到502错误比较多的原因。
  3. worker进程处理请求,如果超时,返回504错误。
  4. 请求处理结束,返回结果。
  • FPM从接收到处理请求的流程就是这样了,那么Nginx又是如何发送请求给FPM的呢?

这就需要从Nginx层面来说明了。

我们知道,Nginx不仅仅是一个Web服务器,也是一个功能强大的Proxy服务器,除了进行http请求的代理,也可以进行许多其他协议请求的代理,包括本文与FPM相关的FastCGI协议。为了能够使Nginx理解FastCGI协议,Nginx提供了FastCGI模块来将http请求映射为对应的FastCGI请求。

Nginx的FastCGI模块提供了fastcgi_param指令来主要处理这些映射关系,下面 是Nginx的一个配置文件实例,其主要完成的工作是将Nginx中的变量翻译成PHP中能够理解的变量。

$ cat /usr/local/nginx/conf/fastcgi.conf

 

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

fastcgi_param  QUERY_STRING       $query_string;

fastcgi_param  REQUEST_METHOD     $request_method;

fastcgi_param  CONTENT_TYPE       $content_type;

fastcgi_param  CONTENT_LENGTH     $content_length;

 

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;

fastcgi_param  REQUEST_URI        $request_uri;

fastcgi_param  DOCUMENT_URI       $document_uri;

fastcgi_param  DOCUMENT_ROOT      $document_root;

fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  REQUEST_SCHEME     $scheme;

fastcgi_param  HTTPS              $httpsif_not_empty;

 

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;

fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

 

fastcgi_param  REMOTE_ADDR        $remote_addr;

fastcgi_param  REMOTE_PORT        $remote_port;

fastcgi_param  SERVER_ADDR        $server_addr;

fastcgi_param  SERVER_PORT        $server_port;

fastcgi_param  SERVER_NAME        $server_name;

除此之外,非常重要的就是fastcgi_pass指令了,这个指令用于指定FPM进程监听的地址,Nginx会把所有的PHP请求翻译成FastCGI请求之后再发送到这个地址。下面一个简单的可以工作的Nginx配置文件:

server {

    listen 80;

    server_name test.me;

    root /usr/local/web/myproject/public;

    index index.php index.html index.htm;

 

    access_log /usr/local/nginx/logs/test-access.log;

    error_log  /usr/local/nginx/logs/test-error.log;

 

    location / {

      try_files $uri $uri/ /index.php?$query_string;

    }

 

    location ~\.php$ {

        include fastcgi_params;

        fastcgi_param SCRIPT_FILENAME /usr/local/web/myproject/public/$fastcgi_script_name;

        fastcgi_pass unix:/usr/local/php/var/run/php-fpm.sock;

        fastcgi_index index.php;

    }

}

在这个配置文件中,我们新建了一个虚拟主机,监听80端口,项目根目录为/usr/local/web/myproject/public。然后我们通过location指令,将所有的以.php结尾的请求都交给FastCGI模块处理,从而把所有的PHP请求都交给了FPM处理,从而完成Nginx到FPM的闭环。
如此以来,Nginx与FPM通信的整个流程应该比较清晰了。

理解Nginx与PHP-FPM通信的工作机制
 

修改了php.ini配置文件后,使用PHP-FPM为什么能平滑重启?

修改php.ini之后,PHP-CGI进程是没办法平滑重启的。
PHP-FPM对此的处理机制是新的worker进程用新的配置,已经存在的worker进程处理完手上的活就可以歇着了,通过这种机制来平滑过渡。

LNMP 工作原理:从请求到响应的全流程解析【20251201】002篇 LNMP是指组成的动态网站服务器架构,是一种高效、稳定的Web应用解决方案。高性能: Nginx事件驱动模型 + PHP-FPM进程池资源高效: 静态动态分离,各司其职扩展性强: 支持水平扩展和负载均衡稳定性好: 进程隔离,单点故障不影响整体。 阅读详情

相关推荐

【PHP面试题29】什么是PHP-FPM?它与PHP和Nginx有什么关系

PHP面试专区。计划将全覆盖PHP开发领域所有的面试题,对标资深工程师/架构师序列,欢迎大家提前关注锁定。PHP-FPM(FastCGI Process Manager)是PHP的FastCGI进程管理器,它是PHP 5.3.3及更高版本的一部分。它通过为每个请求分配一个独立的进程来提高PHP脚本的执行效率和性能,并且可以与Web服务器(如Nginx、Apache等)进行通信。PHP-FPM是PHP的FastCGI进程管理器,它通过为每个请求分配一个独立的进程来提高PHP脚本的执行效率和性能。

黑夜开发者的博客 1477

fastcgi_param参数详解

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径 fastcgi_param QUERY_STRING $query_string; #请求的参数;如?app=123 fastcgi_param REQUEST_METHOD $reques...

weixin_33859504的博客 290

Win11 WSL2 Ubuntu 18.04 ROS Gazebo 图形渲染性能调优:从LLVM到NVIDIA GPU的完整指南

本文详细解决了在Win11 WSL2 Ubuntu 18.04环境中运行ROS Gazebo时图形渲染卡顿的问题。通过诊断默认LLVM软件渲染的瓶颈,指导用户更新Mesa驱动PPA源,并关键性地设置环境变量以强制启用NVIDIA GPU硬件加速,最终显著提升仿真性能与流畅度。

weixin_29204749的博客 283

概念:通用网关接口CGI(Common Gateway Interface)

Common Gateway Interface(CGI——通用网关接口)         用于初始化软件服务的服务器方接口。这套接口描述了Web服务器与同一计算机上的软件的通信方式。   通用网关接口,它是一段程序,运行在服务器上,提供同客户端HTML页面的接口,通俗的讲CGI就像是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器,再把服务器执行的

技术是条不归路 4577

Android SDK安装教程(超详细),从零基础入门到精通,从这篇开始_android sdk下载安装

Android SDK安装教程(超详细),从零基础入门到精通,从这篇开始_android sdk下载安装

Jinmindong 5016

【位运算进阶之----右移(>>)】

😄嘻嘻,朋友们,大家好!昨天我们学习了左移,今天我们来谈谈右移>>。⭐️简单来说,,也就是去掉一个数的二进制表达的末位,右移一位就去掉一位,右移两位就去掉两位。下面就让我们来详细看看吧!

weixin_73453526的博客 8931

CGI(通用网关接口)

CGI是一种规范,是Web 服务器运行时外部程序的规范。 公共网关接口(Common Gateway Interface,CGI)是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。 经过CGI规范处理过的应用程序能与浏览器进行交互,还可通过数据API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将...

dmpnosvn28419的博客 483

信息收集-服务器信息

服务器上面可以运行大量的系统服务和第三方应用服务,如果操作系统或者第三方软件没有及时升级打补丁,攻击者就有可能直接通过服务器上运行的服务进行攻击。

weixin_49349476的博客 1446

Nginx与PHP-FPM通信的工作机制

fastcgi_pass指令了,这个指令用于指定FPM进程监听的地址,Nginx会把所有的PHP请求翻译成FastCGI请求之后再发送到这个地址。下面一个简单的可以工作的Nginx配置文件: server { listen 80; server_name test.me; root /usr/local/web/myproject/public; index index.php index.html index.htm; access_log /us...

wiscourper的博客 8941

YOLOv8推理程序

YOLOv8单独推理,有时候我们自定义的模块算子无法正常转换为其他框架,而且需要做成应用,因此需要一个单独推理的程序,返回的是识别后的照片还有各个类别及其对应数量。文章最后给出Flask封装为Server以及调用的实例还有Client请求代码,支持几十路多线程并发,只需加载一次模型,后边推理即可。

AIOT魔法师 698

Oracle EBS AP 应付模块核心实现逻辑(极简骨架 + 分层拆解 + 业务流转 + 分录 + 核心表)

Oracle EBS AP应付模块采用四层逻辑架构:1)主数据层统一管控供应商基础信息;2)发票负债层通过三单匹配校验生成应付账款;3)付款核销层实现负债冲减;4)SLA层自动生成财务凭证。核心流程包括发票验证(匹配PO/收货单)、付款核销(全额/部分冲账)、会计分录自动生成(通过SLA引擎)。模块严格遵循"无匹配不负债、无验证不入账"原则,与采购、库存等模块深度集成,实现从供应商创建到付款核销的完整业务闭环,确保应付账款准确性和审计追溯能力。

金牌架构师 440

Nginx和PHP-FPM通信机制小结

CGI协议与FastCGI协议 每种动态语言(PHP,Python等)的代码文件需要通过对应的解析器才能被服务器识别,而 CGI(Common Gateway Interface) 通用网关接口协议就是用来使解释器和服务器可以互相通信。PHP文件在服务器上的解析需要用到PHP解析器,再加上对应的 CGI 协议,从而可以使服务器可以解析PHP文件。 由于CGI的机制是每次处理一个请求,fork一个进程,等请求处理完成后,再去 kill 这个进程,在实际应用中比较浪费资源,于是就出现了 CGI 的改良版本 Fa

qq_32019789的博客 343

新手强化学习—深入解析 YOLOv13 项目包中的文件结构和各文件作用

YOLOv13是YOLO系列最新发布的计算机视觉模型。在这篇博客中,我将深入分析YOLOv13中各个文件的作用,对整个项目的文件结构有更清晰的认识。

Limiiiing的博客 484

理解 Nginx 与 PHP-FPM 通信的工作机制

是服务器与后台语言交互的协议,有了这个协议,开发者可以使用任何语言处理服务器转发过来的请求,动态地生成内容,保证了传递过来的数据是。文件初始化执行环境,然后处理请求,再以标准的数据格式返回处理结果,最后退出进程。,而不是一个请求处理完毕就直接结束进程,性能上有了很大的提高。太多时,也会停掉一些,这样就提高了性能,也节约了资源。进行请求处理,如果没有可用进程,返回错误,这也是我们配合。的代理,也可以进行许多其他协议请求的代理,包括本文与。只有一个,负责监听端口,接收来自服务器的请求,而。

wangjia911911的博客 323

G120变频器抱闸逻辑在提升机上应用

一、前言: 对于提升机、起重机、堆垛机、升降机等提升机构,负载为位能性负载,在设备启动和停止阶段,由于重物作用,可能会出现“溜车”现象、控制变频器与电机抱闸时许可以解决此问题 使用具有矢量控制功能的变频器 二、参数设置 抱闸控制时序: 启动: 1、变频器接收到启动命令时-----输出电流对电机进行励磁,经过P346电机励磁时间(==丹佛斯 设置启动电流延时0.5S)------达到一定的转矩 2、变频器输出开抱闸命令,经过P1216延时打开抱闸时间(==PLC延时控制打开抱闸) 注意:抱闸

fenglingxicao的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

fastcgi_pass unix:/run/php/php8.2-fpm.sock;的庖丁解牛

是 Nginx 配置中最关键的一行之一,它定义了 Nginx 如何将 PHP 请求转发给 PHP-FPM。FastCGI 使用二进制协议,消息类型包括:ClientNginxFPM_SockFPM_WorkerGET /index.php构建 FastCGI 消息(FCGI_PARAMS + FCGI_STDIN)FPM Master 调度空闲 Worker执行 index.php返回 FCGI_STDOUTFastCGI 响应HTTP 响应ClientNginxFPM_SockFPM_Worker 3.

长风破浪会有时的博客 1149

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

php必备技能!![会补充]

1.解释继承,多态,接口, 2.抽象类和接口的区别 3.php与apache/nginx之间如何通信 深入理解PHP之:Nginx 与 FPM 的工作机制 4.数据库连接池 5.设计模式 6.trait的理解和原理 7.修饰符的解释public/protect/provite 8.进程线程描述 9,.token缓存地址 ...

weixin_38375151的博客 235

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

网络是怎样的

网络是怎样的1.输入URL2.DNS域名解析3 建立TCP连接,(4 发送请求,7 断开连接)**Socket库**3.1 收发数据的全貌3.2 创建套接字阶段3.3 连接阶段3.3.1 调用connect3.3.2 通讯双方交换控制信息3.3.3 连接操作的实际过程3.4.2 对较大数据进行拆分3.4.3使用ACK号确认网络包已收到3.7 小结5 WEB服务器5.1 服务器程序的结构5.2 服务端的具体工作过程5.3 nginx服务器是如何接收消息的 1.输入URL 在浏览器中输入URL网址就可以得到我

godfather_001的博客 267

Nginx跟PHP实现通信原理图,fastcgi接口监听IP地址和端口号 php-fpm管理fastcgi子进程

通过看这篇博客nginx和php之间是怎样通信的呢,我对Nginx和PHP通信做了个总结,如下图: 如果总结的有问题,希望大家留言指出来。 那么Nginx是如何跟PHP通信交流的呢? 首先Nginx下关于PHP的配置: location ~ \.php${ root:/path; fastcgi_pass:127.0.0.1:9000; } 通过上面的配置文件,可以看出当请求过来时...

投资自己 2645

PHP-FPM 与 Nginx 的通信机制总结

PHP-FPM 介绍 CGI 协议与 FastCGI 协议 每种动态语言( PHP,Python 等)的代码文件需要通过对应的解析器才能被服务器识别,而 CGI 协议就是用来使解释器与服务器可以互相通信。PHP 文件在服务器上的解析需要用到 PHP 解释器,再加上对应的 CGI 协议,从而使服务器可以解析到 PHP 文件。 由于 CGI 的机制是每处理一个请求需要 fork 一个 CGI 进...

weixin_43814458的博客 260

深入理解PHP之:Nginx 与 FPM 的工作机制

网络上有很多关于如何配置 Nginx + FPM 的文章,但它们更多从操作的角度出发,告诉我们怎么做,但却没有告诉我们为什么要这么做,本文从 Nginx 与 FPM 的工作机制出发,探讨配置背后的原理,让我们真正理解 Nginx 与 PHP 是如何协同工作的。 要说 Nginx 与 PHP 是如何协同工作的,首先得说 CGI (Common Gateway Interface) 和 FastCGI...

Yan 小铁匠 497

PHP 解析器就是PHP-FPM吗?底层原理是什么?

PHP 解析器和 PHP-FPM 在 PHP 应用程序中扮演着不同的角色。解析器负责理解和执行 PHP 代码,而 PHP-FPM 则管理这些解析器的生命周期,确保高效率和稳定性。通过上述的例子,我们可以看到 PHP-FPM 如何与 Web 服务器协同工作,处理来自用户的请求,并返回相应的响应。

长风破浪会有时的博客 1892

Nginx 和 PHP-FPM 协同工作一共包含哪些部分?

Nginx 和 PHP-FPM 的协同工作是现代 PHP 应用(如 Laravel)运行的核心机制。它们通过 FastCGI 协议进行通信,各自负责不同的任务:Nginx 处理 HTTP 请求和静态资源,PHP-FPM 负责执行动态 PHP 脚本。职责:特点:职责:特点:以下是 Nginx 和 PHP-FPM 协同工作的主要部分:Nginx 的配置文件定义了如何处理请求以及如何与 PHP-FPM 通信。关键部分包括: 块: 定义虚拟主机的配置,例如域名、监听端口等。 块: 匹配 PHP 请求,并将其转

长风破浪会有时的博客 892

Web服务器与PHP应用的工作机制

学习PHP运行原理,了解 Nginx、CGI、FastCGI、PHP-CGI、PHP-FPM等基本概念及之间的关系。

小青龍 的博客 4万+
上一篇: linux常用命令学习
下一篇: nginx配置说明
wiscourper_
博客等级 码龄17年 1641粉丝 272原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值