步骤2:nginx会根据用户访问的URI和后缀来判断请求
1、比如用户访问index.php,nginx会根据配置文件中的位置进行匹配,例如:
root@json:/data/web# cat /etc/nginx/conf.d/blog.conf server { root /data/web/blog/; index index.html index.htm; server_name www.fwait.com; location / { try_files $uri $uri/ /index.html; } location /blog/ { #alias /usr/share/doc/; auth_basic "authorized users only"; auth_basic_user_file /etc/nginx/passwd.conf; #autoindex on; allow 192.168.1.103; deny all; } location ~ .php$ { include /etc/nginx/fastcgi_params; fastcgi_intercept_errors on; fastcgi_pass 127.0.0.1:9000; } }
如果用户访问index.php,则会匹配到location~.php$,表示匹配用户通过URI访问的资源的大小,访问的资源以.php结尾。
nginx根据用户请求的资源匹配到具体位置后,就会执行该位置对应的动作。 该位置的动作的含义是:
包含/etc/nginx/fastcgi_params; #表示nginx将调用fastcgi套接字
fastcgi_intercept_errorson; #表示开启fastcgi中断和错误信息记录
fastcgi_pass127.0.0.1:9000;#表示nginx通过fastcgi_pass将用户请求的资源发送到127.0.0.1:9000进行分析,其中nginx和php脚本分析服务器在同一台机器上,所以127.0.0.1:9000的意思是本地PHP脚本解析服务器。
根据nginx服务器的配置可以看出,用户访问的是动态的php资源,nginx会调用php相关的脚本分析程序来分析用户访问的资源。
第三步:从第二步可以看出,用户请求的是动态内容,nginx会将请求传递给fastcgi客户端,通过fastcgi_pass将用户的请求发送给php-fpm
如果用户访问的是静态资源,就简单了,nginx直接将用户请求的静态资源返回给用户。
第四步:fastcgi_pass将动态资源交给php-fpm后,php-fpm会将资源传递给php脚本解析服务器的wrapper
第五步:wrapper收到php-fpm的请求后,wrapper会生成一个新的线程来调用php动态程序分析服务器
如果用户请求读取MySQL数据库等,则会触发数据库读操作;
如果用户请求图片/附件等,PHP会触发对前端存储服务器的查询,比如通过NFS存储的存储集群;
第6步:PHP将查询结果返回给nginx
第七步:nginx构造响应消息,将结果返回给用户
这只是 nginx 的一种类型。 用户请求和返回用户请求结果是异步进行的,即用户请求的资源在nginx中传输一次,而nginx可以同步,即服务器针对解析后的资源直接返回资源。 对于用户来说,不需要在nginx中做中转。
2、相关疑点
1、用户每次请求动态资源是否都需要触发一次完整的动态资源解析过程?
不php守护进程,有两种方法可以解决这个问题:
首先,启用nginx本身的缓存功能,缓存动态资源分析结果。 当用户上次访问对应的资源时,nginx就会执行这次缓存查询。 如果查询成功,则直接返回动态资源解析后的静态资源。 给用户;
其次,在nginx前端部署缓存机,比如部署varnish缓存集群来缓存资源。 用户请求的资源可以先在缓存集群上查找;
2、使用nginx作为缓存是否可行? 根据实际情况php守护进程,如果nginx在整个web架构中不陷入困境,可以使用nginx作为缓存,不建议这样做,因为nginx是用户请求和响应用户的唯一途径要求。 如果 nginx 存在困境,其他前端性能再好,比如存储集群,也没用,所以在实际部署中,不建议开启 nginx 的缓存功能(在这种情况下)使用 nginx 作为 httpserver)。 由于启用了nginx缓存功能,一来会提高nginx的性能,二来会消耗部署nginx的对应服务器的硬件资源。
3、如果用一个图来表示nginxfastcgiwrapperphp之间的关系
4.fastcgi具体是什么?
CGI全称公共网段套接字CommonGatewayInterface