nginx请求的11个阶段
目录
1.Http请求处理的11个阶段(示意图):
2. 11个阶段的顺序处理
3.POST_READ阶段
4.REWRITE阶段
5.FIND_CONFIG阶段
6.PREACCESS阶段
6.1.如何限制每个客户端的并发连接数?==》ngx_http_limit_conn_module模块
6.2.如何限制每个客户端的每秒请求数? ==》ngx_http_limit_req_module模块
6.3.limit_req和limit_conn配置同时生效,哪个有效?
6.4.nodelay添加与否,有什么区别?
7.ACCESS模块
7.1 如何限制某些IP地方的访问?
7.2 对用户名密码做限制的auth_basic模块
7.3 使用第三方做权限控制的auth_request模块
7.4 限制所有access阶段模块satisfy指令
编辑
8. precontent阶段
8.2 实时拷贝流量
9. content阶段
9.1 static 模块
1.Http请求处理的11个阶段(示意图):
- 当读到请求头的时候,能够决定使用哪个server块进行处理。接着进入11个处理阶段中
- 确定哪个location生效,即identify configuration block
- 决定是否进行限速,Apply Rate limit
- 进行一些验证,监听用户请求权限,Perform Authentication
- 验证通过后,要生成给用户的响应,Generate Content(可能需要和上游服务器进行通信)
- 返回给用户的请求,要经过过滤模块,比如gzip
- 接着会经过log,进行记录日志
Http请求处理的11个阶段(实际流程):
- POST_READ:接受到read请求之后,核心模块realip
- SERVER_REWRITE:rewrite
- FIND_CONFIG:Nginx框架完成,做location的匹配
- REWRITE: rewrite
- POST_REWRITE:刚刚rewrite之后需要做的事情
- PREACCESS:limit_conn(并发连接数是否达到),limit_req(每秒处理请求是否达到)
- ACCESS:解决的是能不能访问,auth_basic(根据用户访问的用户名和密码),access(根据用户访问IP),auth_request(根据第三方服务)
- POST_ACCESS:
- PRECONTENT: 处理content之前,比如一个请求产生多个子请求,在之前将请求发给第三方服务
- CONTENT:反向代理/index/autoindex/concat
- LOG:按照阶段顺序打印日志
2. 11个阶段的顺序处理
可以查看nginx_modules.c文件中的ngx_module_names,configure执行完之后,我们会使用with/--without/--modules来添加模块,这些模块添加完成后,就会在ngx_module_names数组里面。他们出现的位置和顺序很关键。从左图和右图可以看出,在ngx_module_namse中先出现的会后执行。
11个阶段顺序处理,也可能会出现不按照此顺序执行,比如说可以指定固定阶段,比如access阶段,满足access就不处理auth_basic以及access相关的,继而处理content阶段。
3.POST_READ阶段
realIp模块:可以帮助我们发现客户端的真实IP地址,这个为我们后面的限速/限流打下基础。
如何拿到真实的用户IP地址?
添加realIP模块后,nginx中的变量binary_remote_addr/remote_addr 的变量就会被X-Forwardded-For/X-Real-IP这些头部字段获取到的值覆盖,从而拿到真实的用户IP地址,这样就可以做限速和限流了。(所以limit_con阶段必须在POST_READ之后)
realip模块默认不会编译进入nginx,
4.REWRITE阶段
1.return指令:
2.return指令与error_page:
当收到返回码的时候,可以重定向为另一个url,或者一个指定页面。
3.rewrite指令:
【eg】
当我们访问first路径下的3.txt的时候,会重定向到/third/3.txt,最终返回的是3.txt中的内容。
当直接访问/third/3.txt的时候,返回的是200 'third!'
4.rewrite模块中if指令
if条件的表达式
5.FIND_CONFIG阶段
location匹配规则:
【eg】
6.PREACCESS阶段
6.1.如何限制每个客户端的并发连接数?==》ngx_http_limit_conn_module模块
- 生效阶段:NGX_HTTP_PREACCESS_PHASE阶段
- 模块:http_limit_conn_module
- 默认编进nginx模块 通过--without-http_limit_conn_module禁用
- 生效范围:
- 全部worker进程(基于共享内存)
- 进入preaccess阶段前不生效
- 限制的有效性取决于key的设计:依赖postread阶段的realip模块获取到真实IP
6.2.如何限制每个客户端的每秒请求数? ==》ngx_http_limit_req_module模块
- 生效阶段:NGX_HTTP_PREACCESS_PHASE阶段
- 模块:http_limit_req_module
- 默认编进nginx模块 通过--without-http_limit_req_module禁用
- 生效算法:leaky bucket算法
- 生效范围:
- 全部worker进程(基于共享内存)
- 进入preaccess阶段前不生效
6.3.limit_req和limit_conn配置同时生效,哪个有效?
因为limit_req模块在limit_conn模块之前,所以limit_req模块先生效
6.4.nodelay添加与否,有什么区别?
7.ACCESS模块
7.1 如何限制某些IP地方的访问?
ngx_http_access_module模块
- 生效阶段:NGX_HTTP_ACCESS_PHASE阶段
- 模块:http_access_module
- 默认编进nginx模块 通过--without-http_access_module禁用
- 生效范围:
- 进入access阶段前不生效
- 指令:
图中加上子网掩码的标识允许一段地址的访问,比如192.168.1.0/24
7.2 对用户名密码做限制的auth_basic模块
基于HTTP Basic Authentication协议进行用户名密码的认证,默认编译进nginx。
指令:
基于RFC(2617):HTTP Basic Authentication
客户端正常发送一个请求的额时候,nginx回复401,这个在客户端不会感知到,客户端会看到一个输入用户名和密码的界面 。在nginx中应用层协议会添加WWW-Authenticate关键字。
7.3 使用第三方做权限控制的auth_request模块
7.4 限制所有access阶段模块satisfy指令
satisfy all; 必须所有access阶段的模块全部执行成功,才会继续向下执行
satisfy any; access阶段模块只要有一个返回成功,就可以继续向下执行
satisfy是框架指令,一定会执行,deny是access模块的指令,被框架所控制。deny和satisfy同时存在的时候,deny的优先级低于satisfy。所以下图所示,satisfy any;肯定会访问成功,即使有deny all;的操作。
同样,如果配置了allow all;是没有机会输入密码的,因为allow也是access模块的,配置了satisfy后,会优先于allow执行。
8. precontent阶段
8.1 按序访问资源的try_files模块
eg:访问first资源的时候,若本机没有maintenance.html文件的时候,会访问html/->html/index.html->html.html都没有的时候,会访问@lasturl
8.2 实时拷贝流量
mirror可以做简单的流量拷贝,对多个环境需要处理用户流量非常有帮助。
9. content阶段
9.1 static 模块
eg:root会将完整url映射到文件路径中,而alias只会讲location后的URL映射到文件路径
第一个location:会在访问路径之前添加html变为html/root/index.html
第二个location:访问/alias会直接访问html文件夹下的index.html,变成/html/index.html
第三个location: 会在访问html/first之后再次添加/root/1.txt变为 /html/first/1.txt/root/1.txt
第四个location:访问/alias/1.txt变成/html/first/1.txt
nginx请求的11个阶段相关推荐
- Nginx HTTP请求的11个阶段
前言 上一篇文章(https://blog.csdn.net/zzhongcy/article/details/86086369)简单说明了nginx的11个阶段, 今天网上看到一篇详细介绍的文章,这 ...
- Nginx处理HTTP请求的11个阶段
nginx将一个HTTP请求分为11个处理阶段,这样做让每个HTTP模块可以仅仅专注于完成一个独立,简单的功能.而一个请求的完整处理过程可以由多个HTTP模块共同合作完成.可以极大的提高多个模块合作的 ...
- Nginx处理请求的11个阶段
Nginx 处理请求的全过程一共划分为 11 个阶段(如图),按阶段由上到下依次执行 (上一阶段的所有指令执行完毕,才进入下一阶段) 各阶段的含义如下: ² post-read: 接收到完整的http ...
- Nginx源码实现的细枝末节 11个阶段的实现丨Nginx Filter|中间件开发|惊群效应|负载均衡丨组件丨c/c++linux服务器开发
Nginx源码实现的细枝末节 11个阶段的实现 视频讲解如下,点击观看: Nginx源码实现的细枝末节 11个阶段的实现丨Nginx Filter|中间件开发|惊群效应|负载均衡丨组件丨c/c++li ...
- WEB请求处理二:Nginx请求反向代理
上一篇<WEB请求处理一:浏览器请求发起处理>,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建立TCP连接,发送HTTP请求.本文将讲述请求到达反向代理服务器的一个处理 ...
- WEB 请求处理二:Nginx 请求 反向代理
上一篇<WEB请求处理一:浏览器请求发起处理>,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建立TCP连接,发送HTTP请求.本文将讲述请求到达反向代理服务器的一个处理 ...
- 阿里限流神器Sentinel夺命连环 17 问?,nginx请求转发原理
阿里限流神器Sentinel夺命连环 17 问?,nginx请求转发原理 前沿技术精品 2021-11-17 10:43:04 阅读数:77 评论数:0 点赞数:0 收藏数:0 标签:Sentinel ...
- 程序员职业生涯的11个阶段程序人生
程序员的职业生涯是一段充满起伏的有趣经历.考虑到其陡峭的学习曲线,完全可以预见你将经历挫折.启蒙.骄傲自大这几个时期,以及穿插其间的各种心路历程.在这篇文章中让我们轻松一下,在作者诙谐的语言中来回顾这 ...
- atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較...
atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較 例如以下列举了server控件生命周期所要经历的11个阶段. (1)初始 ...
最新文章
- xbmc-12.0稳定版代码初探 (2) —— XBMC_HOME
- 别让双手闲下来,来做一些练手项目吧
- android的各种*.img 文件
- 职场社交是一个真需求吗?
- webapp 中为span元素赋值
- LeetCode:Add Two Numbers
- IOS-字符串太长换行拼接
- 我的Markdown的利器——Markdown Here、有道云笔记、iPic
- H264所采用的指数格伦布熵编码算法原理及应用
- 车萝卜CEO马斌斌:真正自动驾驶的时候你更需要HUD和ARHUD...
- C++中public/private/protected三种继承方式下基类成员对派生类的可见性探讨
- 对五次实验重新编写后的一些感想
- 还在头痛被黑客劫持? 五步帮你摆脱烦恼!
- 那些年使用Android studio遇到的问题
- OFDM载波间隔_NBloT上行子载波
- bzoj3717 [PA2014]Pakowanie(状压dp+贪心)
- 1038: 绝对值最大 C语言
- 跨境电商o2o模式的表现形式有哪些?
- cass简码大全_cass简码实体对照表
- xtend怎么使用_Java替代Xtend又推出了另一个块摇摆更新
热门文章
- Log4j 漏洞修复和临时补救方法
- 动漫公司logo logo制作
- java毕业设计海滨体育馆管理系统mybatis+源码+调试部署+系统+数据库+lw
- 还在为找不到好看的图标发愁?阿里巴巴矢量图标库全部免费下载
- H323加载H264插件时出现找不到dll文件问题解决
- LTE全网通 SMD贴片天线方案 CrossAir贴片天线 CA-L01
- linux 多线程环形缓冲区,[多线程]环形缓冲区以及多线程条件同步
- C语言栈实现进制转换
- Win7下BootCamp蓝屏问题解决方案二
- Ubuntu安装qt4.8