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文件,我们看到如下配置:

nginx js解析 nginx解析php原理_Nginx

四、总结
当我们访问www.example.com的时候,处理流程是这样的

nginx js解析 nginx解析php原理_php-fpm_02


启动Nginx和php-fpm模块

查看php-fpm进程

nginx js解析 nginx解析php原理_php_03