Nginx 与 FPM 的工做机制

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

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

至于 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 层面来讲明了。wordpress

咱们知道,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 配置文件:spa

图片描述

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

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

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