详解nginx+php执行请求的工作原理总结
概述
有玩过nginx的朋友肯定常听说的cgi,php-cgi,fastcgi,php-fpm,那他们之间到底是什么关系,下面帮助大家了解下nginx+php执行请求的工作原理。cgi协议
CGI不是一门程式语言。它是网页的表单和你写的程式之间通讯的一种协议。可以用任何语言写一个CGI指令码,这些语言只要能接收输入输出资讯,读取环境变数。所以,几乎所有的程式语言都能写一个CGI指令码,例如:python(把我大python放在第一个!),C,甚至是shell指令码。CGI是一种通讯协议,它把使用者传递过来的资料转变成一个k-v的字典。这个字典中不光有使用者的资料,还有HTTP协议的引数。它做的就是把资料,组织成一个固定结构形式的资料。方便任何符合CGI协议的程式都可以呼叫!但是CGI不是负责通讯(传输资料)的,通讯的话是通过socket,也就是server,例如上面例子中,是通过Apache进行通讯。之后呼叫CGI指令码,把资料转变成符合CGI协议的资料结构,用于后面的资料处理!
总之,cgi协议用来确定webserver(例如nginx),也就是内容分发服务器传递过来什么资料,什么样格式的资料。
php-cgi程序直译器
php-cgi是php的cgi协议程序直译器,每次启动时,需要经历载入php.ini档案->初始化执行环境->处理请求->返回内容给webserver->php-cgi程序退出的流程。
fastcgi协议
fastcgi协议是对cgi协议效率提升的补充,主要是针对每次请求过来时都需要启动一个cgi直译器程序的优化,不再需要cgi直译器程序每次收到webserver请求后都需要重新载入php.ini档案和初始化执行环境。
php-fpm程序管理器
php-fpm是对fastcgi协议的实现,是程序管理器,启动时包括master和worker程序俩部分,master程序监听埠,接收来自webserver请求,worker程序一般具有多个,每个worker程序都有一个cgi程序直译器,用来执行php程式码。php-fpm有两种执行方式, 与Apache一样,它的程序数也是可以根据设定分为动态和静态的,一种是直接开启指定数量的php-fpm程序,不再增加或者减少;另一种则是开始的时候开启一定数量的php-fpm程序,当请求量变大的时候,动态的增加php-fpm程序数到上限,当空闲的时候自动释放空闲的程序数到一个下限。
这两种不同的执行方式,可以根据服务器的实际需求来进行调整。
php启动和工作原理
启动phpfpm时,会启动master程序,载入php.ini档案,初始化执行环境,并启动多个worker程序。每次请求来时会将请求传递给worker程序进行处理php平滑重启原理
每次修改完php.ini配置并重启后,会启动新的worker程序载入新的配置,而之前已经存在的程序会在工作完成之后销毁,因此实现平滑重启nginx工作原理
如果想弄明白nginx和php配合的原理,还需要先了解nginx的配置档案中的server部分。server {
listen 80; #监听80埠,接收http请求
server_name www.example.com; #一般存放网址,表示配置的哪个专案
root /home/wwwroot/zensmall/public/; # 存放程式码的根目录地址或程式码启动入口
index index.php index.html; #网站预设首页
#当请求网站的url进行location的字首匹配且最长匹配字串是该配置项时,按顺序检查档案是否存在,并返回第一个找到的档案
location / {
#try_files,按顺序检查档案是否存在,返回第一个找到的档案
#$uri代表不带请求引数的当前地址
#$query_string代表请求携带的引数
try_files $uri $uri/ /index.php?$query_string; #按顺序检查$uri档案,$uri地址是否存在,如果存在,返回第一个找到的档案;如果都不存在,发起访问/index.php?$query_string的内部请求,该请求会重新匹配到下面的location请求
}
#当请求网站的php档案的时候,反向代理到php-fpm去处理
location ~ .php$ {
include fastcgi_params; #引入fastcgi的配置档案
fastcgi_pass 127.0.0.1:9000; #设定php fastcgi程序监听的IP地址和埠
fastcgi_index index.php; #设定首页档案
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #设定指令码档案请求的路径
}
}
上面server配置的整体含义是:每次nginx监听到80埠的url请求,会对url进行location匹配。如果匹配到/规则时,会进行内部请求重定向,发起/index.php?$query_string的内部请求,而对应的location配置规则会将请求传送给监听9000埠的php-fpm的master程序。
总结
下面总结下最简单的使用者请求流程:
大致如下:使用者访问域名->域名进行DNS解析->请求到对应IP服务器和埠->nginx监听到对应埠的请求->nginx对url进行location匹配->执行匹配location下的规则->nginx转发请求给php->php-fpm的master程序监听到nginx请求->master程序将请求分配给其中一个闲置的worker程序->worker程序执行请求->worker程序返回执行结果给nginx->nginx返回结果给使用者。
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~
