Nginx是俄国人最早开发的webserver,现在已经风靡全球,相信大家并不陌生,php也通过20多年的发展来到了7系列版本,更加关注性能,这对搭档在最近这些年,叱咤风云,基本上LNMP成了当下的标配,可是,你用了这么多年的Nginx+php的搭配,你真正知道他们之间是怎么交互怎么通信的么?
一、Nginx是什么
Nginx是一个高性能的http反向代理服务器,也是一个IMAP/POP3/SMTP服务器。
二、php-fpm是什么
1、cgi、fast-cgi协议
cgi的历史
早期的webserver只能处理HTML等静态文件,但是随着技术的发展,出现了php等动态语言。webserver处理不了了怎么办呢?那就交给php解释器处理吧!交给php解释器处理很好,但是php解释器如何和webserver进行通信呢?
为了解决不同的解释器(php解释器和Python解释器)和webserver的通信,于是出现了cgi协议,cgi(common
gateway
interface)通用网关协议,只要你按照cgi协议去编写程序,就能实现语言解释器与webserver的通信,如php-cgi程序。
2、fast-cgi的改进
有了cgi协议,解决的PHP解释器和webserver的通信问题,webserver终于可以处理动态语言了。但是,webserver每收到一个请求,就会去fork一个cgi进程,请求结束再kill掉这个进程,这样有10000个请求,webserver就需要fork、kill php-cgi进程10000次。有没有发现很浪费资源?
于是,出现了cgi的改良版本,fast-cgi。fast-cgi每次处理完一个请求后,不会立刻kill掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求,这样每次就不用重新fork一个进程了,大大提高了效率。
3、php-fpm
php-fpm即php-Fast-cgi Process Manager
php-fpm是fast-cgi的实现,并提供进程管理的功能。
包含了master进程和worker进程两种进程。
master进程只有一个,负责监听端口,接受来自webserver的请求,而worker进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个php解释器,是php代码真正执行的地方。
三、Nginx如何与php-fpm结合
我们知道Nginx不仅能处理http的请求,还有做反向代理。
Nginx通过反向代理功能将动态请求转向php-fpm。
下面解释一下Nginx.conf配置项中的含义:
server {
listen 80; #监听80端口,接收http请求
server_name www.example.com; #就是网站地址
root /usr/local/etc/nginx/www/huxintong_admin; # 准备存放代码工程的路径
#路由到网站根目录www.example.com时候的处理
location / {
index index.php; #跳转到 www.example.com/index.php
autoindex on;
}
#当请求网站下php文件的时候,反向代理到php-fpm
location ~ \.php$ { include /usr/local/etc/nginx/fastcgi.conf; #加载nginx的fastcgi模块
fastcgi_intercept_errors on; fastcgi_pass 127.0.0.1:9000; #nginx fastcgi进程监听的IP地址和端口
}
}
打开php-fpm.conf文件,我们看到如下配置:
四、总结
当我们访问www.example.com的时候,处理流程是这样的
启动Nginx和php-fpm模块
查看php-fpm进程