Nginx解析PHP的原理

Posted by Liao on 2020-04-24

Nginx是一个高性能的服务器,能处理HTTP请求,并能做反向代理。

Nginx本身不会对PHP进行解析,而是通过进程管理器php-fpm对其进行解析。

Nginx通过反向代理的功能将动态请求转向php-fpm。

Cgi

Cgi是Common Gateway Interface的缩写。过去服务器只能处理静态语言,无法对动态语言(PHP)进行处理。Cgi协议是用于解决语言解释器(PHP、Python等)与服务器的通信,只要写程序的时候按照cgi协议写就行。

FastCgi

服务器接收到一个请求时,要fork一个cgi进程,请求结束的时候要杀掉一个进程,十分浪费资源,于是出现了fastcgi对cgi进行改良。fastcgi处理完请求后,不会杀掉进程,而是保留它,使它一次能处理多请求。

php-fpm

php-fpm就是php-Fcstcgi Process Manager,是PHP对FastCgi的一个实现,实现对进程的管理。

进程包括master和worker两种进程。master只有一个,用于监听端口(默认是socket),接收来自服务器的请求;而worker可以有多个进程(按照实际配置),每个进程内部嵌入PHP解释器,是PHP代码真正执行的地方。

在Linux上,Nginx与php-fpm的通信有TCP Socket 和 Unix Socket两种方式

Unix socket 又叫 IPC (inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信,这种方式需要在 nginx 配置文件中填写 php-fpm 的 socket 文件位置。

两者区别:

Unix Socket通信效率高,但不稳定。由于 Unix socket 不需要经过网络协议栈,不需要封装解封装、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程,所以其效率比 TCP Socket 的方式要高,可减少不必要的 tcp 开销。

Unix Socket 高并发时不稳定,连接数爆发时,会产生大量的长时缓存,在没有面向连接协议的支撑下,大数据包可能会直接出错不返回异常。

而 TCP 是面向连接的协议,可以更好的保证通信的正确性和完整性。

因此可以屡一下当有url输入时处理的流程:

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
访问www.example.com 
|
浏览器缓存
|
DNS域名解析
|
TCP进行连接
|
HTTP请求与相应给Nginx服务器
|
跳转到入口文件www.example.com/index.php
|
加载nginx的fastcgi模块
|
fast-cgi监听127.0.0.1:9000地址
|
www.example.com/index.php请求到达127.0.0.1:9000
|
php-fpm监听127.0.0.1:9000
|
php-fpm接收到请求,启用worker进程处理请求
|
php-fpm处理完请求,返回给nginx
|
nginx将结果通过http返回给浏览器

[]: https://learnku.com/articles/23694?order_by=vote_count&