作为一个web开发人员。对nginx的工作机制还是要了解的。本篇文章就是为了搞清楚nginx和PHP是怎么协同工作的。
参考文献
本文大致讲解流程
- 一个PHP请求到返回数据的整个流程
- cgi协议和fast-cgi协议是什么
- php-cgi和PHP-FPM是什么
- 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