Nginx与php-fpm之间的关系

在web开发中Nginx和php-fpm(下文简称fpm)之间的协同工作是进行动态网页开发的关键。

  • 首先我们先来了解一下cgi和fast-cgi。

    • cgi是是web server和后台语言交互的协议,有了这个协议开发者可以使用任何后台语言处理web server的请求,动态生成内容返回。但是cgi协议有一个致命的缺陷就是每一个请求都会执行一次fork创建一个子进程,子进程通过加载配置文件、初始化执行环境然后才开始处理请求,处理完成后结束该处理进程。随着web开发的兴起,高并发越来越成为了常态,这样的处理方式以满足不了日常的高并发需求,于是fast-cgi就出现了。
    • fast-cgi,顾名思义是一个更快地cgi协议,与cgi不同的是允许一个进程处理多个请求,而不是处理完一个请求就结束。fast-cgi协议采用的是一个master进程管理多个worker进程的模式处理请求的。当一个请求来临时首先master进程会加载配置文件(php.ini)、初始化执行环境并解析请求,然后选用一个worker进程进行实际的处理,worker进程处理完返回之后继续等待master分配。
  • Nginx(web sever)担任的是一个内容分发者的角色,如果客户端(浏览器)请求的是index.html文件,即静态文件,Nginx会去文件系统中找到该文件发送给浏览器。当请求的是index.php文件,即动态文件的时候,Nginx通过配置将该文件交给php解析器处理(Nginx不会对任何文件做处理),Nginx就通过fast-cgi协议将请求发送给php解析器处理。

  • fpm是一个 php进程管理器,包含 master 进程和 worker 进程两种进程:master 进程只有一个,负责监听端口,接收来自 web server 的请求,而 worker 进程则一般有多个 (具体数量根据实际需要配置),每个进程内部都嵌入了一个 php 解释器,是 php 代码真正执行的地方。从fpm接收到请求到处理完毕经历了如下过程:

    • fpm的master收到请求加载php.ini文件,初始化执行环境
    • master根据配置指派worker进程处理请求(若没有worker进程返回502错误,若worker处理超时,则返回504错误)
    • 请求处理结束,将结果返回给web server由web server返回给浏览器

通过上面的介绍我们可以总结一下Nginx与fpm的关系(从整个web请求过程来说):

  • 浏览器请求一个页面,首先拿到这个请求的是Nginx(web server)代理服务器,Nginx会对请求的资源做一个分析,若请求的是静态文件直接去文件系统中找到并返回,若是一个动态文件(php脚本文件xxx.php)Nginx会通过fast-cgi协议将请求转发给fpm,最终由fpm的worker进程处理请求,即加载php脚本文件执行,并将结果通过fast-cgi协议返回给Nginx,Nginx拿到处理结果后返回给浏览器,浏览器进行渲染展示。一个完整的web请求完成,其中Nginx与fpm在整个流程中通过fast-cgi交互,完成对动态文件的解析。
发布了62 篇原创文章 · 获赞 68 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/magic_world_wow/article/details/103902952