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

CGI 是 Web Server 与后台语言交互的协议,有了这个协议,开发者可以使用任何语言处理 Web Server 发来的请求,动态的生成内容。但 CGI 有一个致命的缺点,那就是每处理一个请求都需要 fork 一个全新的进程,随着 Web 的兴起,高并发越来越成为常态,这样低效的方式明显不能满足需求。就这样,FastCGI 诞生了,CGI 很快就退出了历史的舞台。FastCGI,顾名思义为更快的 CGI,它允许在一个进程内处理多个请求,而不是一个请求处理完毕就直接结束进程,性能上有了很大的提高。

至于 FPM (FastCGI Process Manager),它是 FastCGI 的实现,任何实现了 FastCGI 协议的 Web Server 都能够与之通信。FPM 之于标准的 FastCGI,也提供了一些增强功能,具体可以参考官方文档:PHP: FPM Installation。

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

从 FPM 接收到请求,到处理完毕,其具体的流程如下:

FPM 的 master 进程接收到请求
master 进程根据配置指派特定的 worker 进程进行请求处理,如果没有可用进程,返回错误,这也是我们配合 Nginx 遇到502错误比较多的原因。
worker 进程处理请求,如果超时,返回504错误
请求处理结束,返回结果
FPM 从接收到处理请求的流程就是这样了,那么 Nginx 又是如何发送请求给 fpm 的呢?这就需要从 Nginx 层面来说明了。

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

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

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

在这个配置文件中,我们新建了一个虚拟主机,监听在 80 端口,Web 根目录为 /home/rf/projects/wordpress。然后我们通过 location 指令,将所有的以 .php 结尾的请求都交给 fastcgi 模块处理,从而把所有的 php 请求都交给了 fpm 处理,从而完成 Nginx 到 fpm 的闭环。

如此以来,Nginx 与 FPM 通信的整个流程应该比较清晰了吧。

文章转载自:https://segmentfault.com/a/11...

Nginx 与 FPM 的工作机制相关推荐

  1. 【CyberSecurityLearning 52】Web架构安全分析(web工作机制、HTTP协议)

    目录 Web 工作机制 网页.网站 Web容器 静态页面 中间件服务器 数据库的出现 建立一个网站 HTTP 协议概述 概述 特点 URL HTTP 报文分析 HTTP 工作模式 REQUEST 请求 ...

  2. Nginx服务器的Web请求处理机制

    今天学习一下Nginx的优势,肯定了解一下其他服务器特性,做一下对比 1.多进程方式 每次接收到客户端时,都会生成一个子进程去处理,客户端断开,子进程会被回收 优点:相互独立,实现简单,保证服务器的稳 ...

  3. 2021年大数据HBase(十四):HBase的原理及其相关的工作机制

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的原理及其相关的工作机制 一.HBase的flus ...

  4. java语言的实现机制_JAVA语言之Java NIO的工作机制和实现原理介绍

    本文主要向大家介绍了JAVA语言之Java NIO的工作机制和实现原理介绍,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 前言 本文只简单介绍NIO的原理实现和基本工作流程 I/O和 ...

  5. docker用gpu的参数_从零开始入门 K8s | GPU 管理和 Device Plugin 工作机制

    导读:2016 年,随着 AlphaGo 的走红和 TensorFlow 项目的异军突起,一场名为 AI 的技术革命迅速从学术圈蔓延到了工业界,所谓 AI 革命从此拉开了帷幕.该热潮的背后推手正是云计 ...

  6. MapReduce1和Yarn的工作机制

    Hadoop中的MapReduce的工作机制分为两种: MapReduce 1 也就是Hadoop 2.0之前的工作机制 YARN MapReduce 1 构成 MapReduce 1最主要的其实就是 ...

  7. 从源码分析Hystrix工作机制

    作者:vivo互联网服务器团队-Pu Shuai 一.Hystrix解决了什么问题? 在复杂的分布式应用中有着许多的依赖,各个依赖都难免会在某个时刻失败,如果应用不隔离各个依赖,降低外部的风险,那容易 ...

  8. mysql的proxy机制_MySQL Proxy工作机制浅析

    MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断.改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate之类的网络代理服务器的基本思想是一样的.代理服务器是和T ...

  9. 第6章-MapReduce的工作机制-笔记

    为什么80%的码农都做不了架构师?>>>    作业的提交 可以只用一行代码来运行一个MapReduce作业: JobClient.runJob(conf). 作业的调度 Hadoo ...

最新文章

  1. SpringBoot中的线程池,你真的会用么?
  2. SEO快速排名算法独家揭秘
  3. mysql 数据库导入导出方法总结
  4. 如何在Ubuntu 14.04下安装OpenGL开发环境
  5. 四叶草社交平台——十天冲刺(10)
  6. Git 的origin和master解析
  7. Install Python3.6 on Amazon Linux/EC2 在Amazon Linux实例中安装使用Python3.6
  8. LeetCode 982. 按位与为零的三元组(位运算+计数)
  9. VM安装虚拟机及其破解密码
  10. Django简单介绍-基础1
  11. nodejs+react使用webpack打包时控制台报错
  12. DHCP原理及报文格式
  13. Gmail过滤器设置
  14. 软件测试肖sir__简历模板制作
  15. 【离散数学】集合论 第三章 集合与关系(6) 二元关系的定义、表示和运算及性质
  16. aliez歌词_请问aLiez完整版中文 +罗马音歌词
  17. JS实现弹窗效果,超简单哦
  18. GraphPad Prism 中文版 科研绘图工具
  19. 主机甲和主机乙之间使用后退N帧协议(GBN)传输数据,甲的发送窗口为1000,数据帧长为1000字节,信道带宽为100Mb/s,乙每收到一个数据帧......[数据传输率]错题总结
  20. Windows 10驱动签名_win 10驱动数字签名_驱动签名注意事项

热门文章

  1. win10 安装低版本的 .net framework
  2. C# 窗体半透明,控件不透明
  3. C++基础知识:fflush(stdin)的误区
  4. Java新职篇:变量的作用域和生存期
  5. VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——VoiceRecorder控件的使用方式.Net移动开发...
  6. 一周第二次课(3月20日)1.6/1.7 配置IP 1.8 网络问题排查
  7. 怎么把AI文件导入到PS里面
  8. Kafka 配置参数汇总及相关说明
  9. iOS开源项目周报1229
  10. ueditor去掉本地保存功能