聊聊nginx+php-fpm的运行原理

正向代理和反向代理

正向代理

对于人是可以感知到的,但对于服务器是感知不到的,俗称正向代理服务器。
比如vpn,我们人是有感知的(要装vpn客户端),但是服务器是不感知的,他不会管你来自哪里,只知道是http请求,一视同仁的把内容返回给你。

反向代理

通过反向代理实现负载均衡
对于人是不感知的,但是对于服务器来说是感知的,俗称反向代理服务器。

比如访问百度的时候,百度会根据dns来分配代理服务器,代理服务器还有子服务器,一层一层的进行负载均衡。对于机器来说肯定是可以感知的,但是对于人来说 是感知不到的。人只知道打开了这个网站而已,不会管理服务器是怎么运行的。

nginx和php-fpm是什么

nginx

nginx是一个高性能的http和反向代理服务器,也是一个IMAP/POP3/SMTP服务器

php-fpm

全称为php-Fastcgi Process Manager,pph-fpm是FastCGI的实现,并提供了进程管理的功能。
进程包含master进程和worker进行两种进程。
master进程只有一个,负责监听端口,接收来自web server的请求,相当于领导。
而worker进程有多个,可以在nginx配置文件里设置,负责干活,相当于员工,每个进程内部都嵌入了一个php解释器,是php代码真正执行的地方。
关于cgi和fast-cgi的协议,在此不表,可以自行百度。
简单来说cgi和fast-cgi都是webserver处理动态语言的协议,fast-cgi是cgi的升级版,效果更高。
fast-cgi每次处理完请求后,不会kill掉cgi进程,而是保留这个进程,使这个进程可以一次处理多个请求。
而cgi是每次请求,都需要fork一个cgi进程,请求结束再kill掉这进程。有10000次,就要fork和kill 10000次这个进行。

nginx与php-fpm的结合

利用nginx的反向代理功能,将动态请求转向后端的php-fpm。
也就是配置一个nginx站点

1,配置nginx.conf文件。
在nginx.conf最后一行,添加include文件

1
include /etc/nginx/server/*

2,添加站点server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80;
server_name www.test.com;
root /var/www/blog;
location / {
index index.php; #跳转到www.test.com/index.php
autoindex on;
}
#当请求网站下php的文件,就反向代理到php-fpm
location ~ \.php${
include /etc/nginx/fastcgi.conf; #加载nginx的fastcgi模块
fastcgi_intercept_errors on;
fastcgi_pass 127.0.0.1:9000; #nginx fastcgi进程监听的ip地址和端口。默认的。9000是nginx服务器的默认端口。
}

}

下面我们启用php的php-fpm来处理这个请求
打开php-fpm.conf文件,一般在/etc/php/php-fpm.conf。我们看到如下配置

1
listen = 127.0.0.1:9000

即:php-fpm模块监听127.0.0.1:9000端口,等待请求到来去处理

也就是说先在nginx里开启fast-cgi模块,监听端口,并且让php-fpm也监听这个端口,当fast-cgi接收到请求后,就送到php-fpm去执行。 php-fpm执行完后 返回结果给 fast-cgi, fast-cgi再返回给nginx, nginx再返回给浏览器。

1,浏览器访问blog.mallol.cn
2,nginx收到请求
3,路由到blog.mallol.cn/index.php
4,加载fastcgi模块,并监听127.0.0.1:9000端口
5,*.php的请求到达127.0.0.1:9000
6,php-fpm监听到127.0.0.1:9000
7,php-fpm的master接收到请求,启用worker去处理请求
8,php-fpm处理完请求,返回给fastcgi->nginx.
9,nginx将结果通过http返回给浏览器

启动nginx和php-fpm

1
2
sudo nginx -s reload
sudo php-fpm
坚持原创技术分享,您的支持将鼓励我继续创作!