本篇接上一篇Nginx文章继续介绍Nginx的请求的11个处理阶段,因为Nginx的11阶段详解比较多,所以我拿出额外的一篇进行讲解补充,有兴趣的小伙伴可以先去复习一下篇一的文章进行学习。
Nginx请求处理的11阶段图示:
过程简述:
请求开始处理模块:
1.POST_READ:在 read 完请求的头部之后,在没有对头部做任何处理之前,想要获取到一些原始的值,就应该在这个阶段进行处理。这里面会涉及到一个 realip 模块。
2.SERVER_REWRITE:和下面的 REWRITE 阶段一样,都只有一个模块叫 rewrite 模块,一般没有第三方模块会处理这个阶段。
3.FIND_CONFIG:做 location 的匹配,暂时没有模块会用到。
4.REWRITE:对 URL 做一些处理。
5.POST_WRITE:处于 REWRITE 之后,也是暂时没有模块会在这个阶段出现。
确认用户访问权限模块:
6.PREACCESS:是在 ACCESS 之前要做一些工作,例如并发连接和 QPS 需要进行限制,涉及到两个模块:limt_conn 和 limit_req
7.ACCESS:核心要解决的是用户能不能访问的问题,例如 auth_basic 是用户名和密码,access 是用户访问 IP,auth_request根据第三方服务返回是否可以去访问。
8.POST_ACCESS:是在 ACCESS 之后会做一些事情,同样暂时没有模块会用到。
处理响应和日志模块:
9.PRECONTENT:在处理 CONTENT 之前会做一些事情,例如会把子请求发送给第三方的服务去处理,try_files 模块也是在这个阶段中。
10.CONTENT:这个阶段涉及到的模块就非常多了,例如 index, autoindex, concat 等都是在这个阶段生效的。
11.LOG:记录日志 access_log 模块。
主要过程阶段详解:
POST_READ阶段
POST_READ阶段,是 11 个阶段的第 1 个阶段,这个阶段刚刚获取到了请求的头部,还没有进行任何处理,我们可以拿到一些原始的信息。例如,拿到用户的真实 IP 地址。
TCP 连接是由四元组构成,在四元组中,包含了源 IP 地址,例如获取到真实源IP地址来对binary_remote_addr、remote_addr 这样的变量进行匹配使用或者用于 limit_conn 链接限制模块等。
HTTP 协议中,有两个头部可以用来获取用户 IP:
X-Forwardex-For 是用来传递 IP 的,这个头部会把经过的节点 IP 都记录下来
X-Real-IP:可以记录用户真实的 IP 地址,只能有一个
SERVER_REWRITE阶段
SERVER_REWRITE阶段分为两个,一个是 server_rewrite 阶段,一个是 rewrite,这两个阶段都涉及到一个 rewrite 模块,而在 rewrite 模块中,有一个 return 指令,遇到该指令就不会再向下执行,直接返回响应。
return 指令,可以通过后面跟上body或者URL进行返回状态码,或者直接返回URL。
返回状态码有下几种:
Nginx 自定义:【444:立刻关闭连接,用户收不到响应】
HTTP 1.0 标准:【301:永久重定向、302:临时重定向,禁止被缓存】
HTTP 1.1 标准:【303:临时重定向,允许改变方法,禁止被缓存、307:临时重定向,不允许改变方法,禁止被缓存、308:永久重定向,不允许改变方法】
rewrite 指令用于修改用户传入 Nginx 的 URL。
FIND_CONFIG阶段
当经过 rewrite 模块,匹配到 URL 之后,就会进入 find_config 阶段,开始寻找 URL 对应的 location 配置。
PREACCESS阶段
下面就来到了 preaccess 阶段。在 preaccess 阶段依赖于limit_conn 模块和limit_req 模块处理完成的包含限制每个客户端的并发连接数以及访问频率等这些,preaccess 就是在连接之前。
其中限制访问频率的limit_req 模块包含一个
漏桶(leaky bucket) 算法:
漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。
在网络中,漏桶算法可以控制端口的流量输出速率,平滑网络上的突发流量,实现流量整形,从而为网络提供一个稳定的流量。
这张图里面,水龙头在不停地滴水,就像用户发来的请求,所有的水滴都会以恒定的速率流出去,也就是被处理。漏桶算法对于突发流量有很好的限制作用,会将所有的请求平滑的处理掉。
ACCESS阶段
经过 preaccess 阶段对用户的限流之后,就到了 access 阶段,主要通过access模块、auth_basic模块、auth_request模块、satisfy指令进行用户验证以及鉴权等。
PRECONTENT阶段
PRECONTENT阶段依赖try_files 模块依次试图访问多个 URL 对应的文件(由 root 或者 alias 指令指定),当文件存在时,直接返回文件内容,如果所有文件都不存在,则按照最后一个 URL 结果或者 code 返回。
CONTENT阶段
下面开始就到了 content 阶段,content 阶段主要通过 static 模块、index 模块、autoindex模块、comcat模块等映射文件路径返回静态文件内容。
LOG阶段
LOG阶段主要是将 HTTP 请求相关信息记录到日志。
如上就是Nginx高性能Web和反向代理服务之请求处理的11阶段篇二的内容。主要针对11阶段的HTTP请求处理过程比进行了详解相对有点晦涩建议各位小伙伴还是在线下部署的时候结合该过程进行理解使用。感谢大佬们的参阅,此贴先到这里后续会带上更加优质的帖子,感谢大家!
励志分享超清壁纸语句~~:
言必诚信,行必忠正。——孔子
好的今天就到这里,老样子,感谢各位大神的参阅,孩子为了挣豆子不容易,孩子家里穷没豆子吃饭了!!!