【大白分享】Nginx高性能Web和反向代理服务之请求处理的11阶段篇二
  

山东_朱文鑫 79032人觉得有帮助

{{ttag.title}}
大家好,我是大白,努力的意义,不在于一定会让你取得多大的成就,只是让你在平凡的日子里,泪得比原来的那个自己更好一点。依旧感谢各位小伙伴的一路支持与陪伴。

Nginx高性能Web和反向代理服务之整体结构篇一:https://bbs.sangfor.com.cn/forum ... read&tid=257167

本篇接上一篇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请求处理过程比进行了详解相对有点晦涩建议各位小伙伴还是在线下部署的时候结合该过程进行理解使用。感谢大佬们的参阅,此贴先到这里后续会带上更加优质的帖子,感谢大家!

励志分享超清壁纸语句~~:


言必诚信,行必忠正。——孔子

好的今天就到这里,老样子,感谢各位大神的参阅,孩子为了挣豆子不容易,孩子家里穷没豆子吃饭了!!!

打赏鼓励作者,期待更多好文!

打赏
19人已打赏

韩_鹏 发表于 2023-6-6 08:38
  
感谢分享                                        
嘀嘀柠柠 发表于 2023-6-6 08:47
  
每天学习一点点,每天进步一点点。
新手078326 发表于 2023-6-6 22:03
  
楼主的文章图文并茂,清晰易懂
新手517842 发表于 2023-6-6 22:09
  
楼主的文章图文并茂,清晰易懂
新手899116 发表于 2023-6-6 22:14
  

楼主的文章图文并茂,清晰易懂
新手780102 发表于 2023-6-6 22:26
  

楼主的文章图文并茂,清晰易懂
司马缸砸了光 发表于 2023-6-6 22:46
  

楼主的文章图文并茂,清晰易懂
暴躁的钢索 发表于 2023-6-7 08:33
  
每天学习一点点,每天进步一点点。
韩_鹏 发表于 2023-6-7 08:39
  
g感谢分享                                                  
发表新帖
热门标签
全部标签>
安全效果
西北区每日一问
技术盲盒
技术笔记
干货满满
【 社区to talk】
每日一问
信服课堂视频
GIF动图学习
新版本体验
技术咨询
2023技术争霸赛专题
功能体验
产品连连看
自助服务平台操作指引
标准化排查
秒懂零信任
技术晨报
安装部署配置
原创分享
排障笔记本
玩转零信任
排障那些事
SDP百科
技术争霸赛
深信服技术支持平台
通用技术
以战代练
升级&主动服务
社区新周刊
畅聊IT
答题自测
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
每日一记
运维工具
云计算知识
用户认证
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
产品预警公告
信服圈儿
S豆商城资讯
「智能机器人」
追光者计划
社区帮助指南
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
每周精选
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
高手请过招
高频问题集锦
POC测试案例
全能先锋系列
云化安全能力

本版达人