Nginx+php运行原理

Posted by Chen Blog on April 9, 2019

作为一个web开发人员。对nginx的工作机制还是要了解的。本篇文章就是为了搞清楚nginx和PHP是怎么协同工作的。

参考文献

本文大致讲解流程

  1. 一个PHP请求到返回数据的整个流程
  2. cgi协议和fast-cgi协议是什么
  3. php-cgi和PHP-FPM是什么
  4. linux上面配置

一个PHP请求到返回数据的整个流程

url访问一个PHP的文件。默认访问的是服务器的80端口。现在服务器的80端口是nginx在负责监听。nginx接收到这个请求之后,发现请求的是一个PHP文件。根据自己的配置文件知道,这个处理要让fast-cgi来处理。然后就看到要把这条处理让给127.0.0.1:9000端口来处理。 正好这时,正在监听9000端口的php-fpm的master进程接收到一个来自nginx的请求,叫它开始干事了。然后php-fpm的master进程接收到了这个请求,接着看看自己有没有可以处理的worker进程。然后交给worker进程来执行。几毫秒之后,php-fpm就处理完毕了(worker进程继续等待工作,不会死掉)。然后就将处理结果返回给nginx。nginx再把结果返回给客户端。

借一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 www.example.com/test.php
        |
        |
      Nginx
        |
        |
	匹配到为php请求
        |
        |
加载nginx的fast-cgi模块
        |
        |
fast-cgi监听127.0.0.1:9000地址
        |
        |
www.example.com/test.php请求到达127.0.0.1:9000
        |
        |
php-fpm 在监听127.0.0.1:9000
        |
        |
php-fpm master进程接收到请求,让worker进程处理请求
        |
        |
php-fpm 处理完请求,返回给nginx
        |
        |
nginx将结果通过http返回给浏览器
        

cgi协议和fast-cgi协议是什么

  • cgi协议是什么?

    原来的PHP请求就是基于cgi协议的,它做事风格是,一个PHP请求就开一条进程来处理。处理完之后,这个进程就死掉了。每一次请求就开一个进程,然后死掉。非常浪费资源。

  • fast-cgi协议是什么?

    发现到cgi的严重问题后,开始研究新的效率高的协议来处理动态语言的请求。那么fast-cgi就问世了。它要求,一个进程处理完之后,不要死掉,留着继续等待下一个请求。这样就可以重复利用资源。效率也提高了很多。

php-cgi和PHP-FPM是什么

  • php-cgi是什么?

    php-cgi就是对cgi协议的而实现。因为cgi协议是每个请求都要开一个进程来处理,后来被淘汰了,这东西在cgi协议不被看重之后,随之而来的是,肯定它也不被看重了。直到最后的死亡。

  • php-fpm是什么?

    它就是实现了fast-cgi这个协议。并且对自己的进程进行管理。它有两种进程。一个是master进程,只有一个。一种是worker进程。有很多个。master进程负责接收nginx给过来的请求。然后叫worker做。worker做完之后把结果给nginx。然后就继续等待下一个任务。

总结

现在的PHP动态语言处理几乎都是基于fast-cgi协议的php-fpm了来处理了。因为它更加高效,更加节省系统资源。

linux上面配置

  • nginx.conf

  • php-fpm.conf