LNMP架构中Nginx如何与PHP进行交互

  1. 简述
    因为nginx不支持对动态脚本文件的解析,所以如果客户端浏览器有对动态脚本文件的请求时,nginx就需要调用动态文本解析程序即php来处理请求。

  2. 原理:
    1.nginx紧紧作为一个web服务器,接收和响应客户浏览器发送来的请求,其worker进程直接管理每一个请求。
    2.php作为后端程序,处理客户端请求动态脚本文件,并将处理后的结果返回给web服务器,web服务器在将处理结果按一定的格式封装返回给浏览器。
    3.对于nginx而言,php是与之同级别的一个外部程序,两者之间的交互需要通过CGI(通用网关接口),及nginx通过CGI对php进行调用来处理浏览器请求。
    4.普通的CGI每接收到一次请求会重新解析配置文件php.ini,效率低,其衍生协议FastCGI解决了这个问题,服务端会通过php-fpm创建一个master进程,同时加载配置文件,然后在创建多个worker进程,处理客户端请求。当请求到来时master会将请求传递给worker进程处理,然后立即可以接收下一个请求,这样可以提高并发性。(真正解析动态文件的是php.cgi,php-fpm是管理php-cgi的软件)
    5.FastCGI接口方式采用C/S架构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给脚本分析服务器执行,然后将得到的结构返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
    6.FastCGI上游为nginx服务器,作为FastCGI的客户端,下游为外部程序,在LNMP架构中指的时PHP。
    原理图:
    image_1d51agce9ssucna1v2qnoq118616.png-75.9kB

  3. 过程分析
    1.用户发送http请求报文给nginx服务器
    2.nginx会根据文件url和后缀来判断请求
    3.如果请求的是静态内容,nginx会将结果直接返回给用户
    4.如果请求的是动态内容,nginx会将请求交给fastcgi客户端,通过fastcgi_pass将这个请求发送给php-fpm
    5.php-fpm会将请求交给wrapper(即master进程)
    6.wrapper收到请求会生成新的线程(worker进程)调用php动态程序解析服务器
    7.如果用户请求的是博文、或者内容、PHP会请求MySQL查询结果
    8.如果用户请求的是图片、附件、PHP会请求nfs存储查询结果
    9.php会将查询到的结果交给Nginx
    10.nginx会生成一个响应报文返还给用户

  4. 通信方式
    1.TCP方式
    nginx配置文件:
    fastcgi_pass 127.0.0.1:9000;
    php-fpm配置文件:
    listen = 127.0.0.1:9000
    2.socket方式
    nginx配置文件:
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    php-fpm配置文件:
    listen = /run/php/php7.0-fpm.sock