目录

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个阶段(示意图):

  1. 当读到请求头的时候,能够决定使用哪个server块进行处理。接着进入11个处理阶段中
  2. 确定哪个location生效,即identify configuration block
  3. 决定是否进行限速,Apply Rate limit
  4. 进行一些验证,监听用户请求权限,Perform Authentication
  5. 验证通过后,要生成给用户的响应,Generate Content(可能需要和上游服务器进行通信)
  6. 返回给用户的请求,要经过过滤模块,比如gzip
  7. 接着会经过log,进行记录日志

Http请求处理的11个阶段(实际流程):

  1. POST_READ:接受到read请求之后,核心模块realip
  2. SERVER_REWRITE:rewrite
  3. FIND_CONFIG:Nginx框架完成,做location的匹配
  4. REWRITE: rewrite
  5. POST_REWRITE:刚刚rewrite之后需要做的事情
  6. PREACCESS:limit_conn(并发连接数是否达到),limit_req(每秒处理请求是否达到)
  7. ACCESS:解决的是能不能访问,auth_basic(根据用户访问的用户名和密码),access(根据用户访问IP),auth_request(根据第三方服务)
  8. POST_ACCESS:
  9. PRECONTENT: 处理content之前,比如一个请求产生多个子请求,在之前将请求发给第三方服务
  10. CONTENT:反向代理/index/autoindex/concat
  11. 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个阶段相关推荐

  1. Nginx HTTP请求的11个阶段

    前言 上一篇文章(https://blog.csdn.net/zzhongcy/article/details/86086369)简单说明了nginx的11个阶段, 今天网上看到一篇详细介绍的文章,这 ...

  2. Nginx处理HTTP请求的11个阶段

    nginx将一个HTTP请求分为11个处理阶段,这样做让每个HTTP模块可以仅仅专注于完成一个独立,简单的功能.而一个请求的完整处理过程可以由多个HTTP模块共同合作完成.可以极大的提高多个模块合作的 ...

  3. Nginx处理请求的11个阶段

    Nginx 处理请求的全过程一共划分为 11 个阶段(如图),按阶段由上到下依次执行 (上一阶段的所有指令执行完毕,才进入下一阶段) 各阶段的含义如下: ² post-read: 接收到完整的http ...

  4. Nginx源码实现的细枝末节 11个阶段的实现丨Nginx Filter|中间件开发|惊群效应|负载均衡丨组件丨c/c++linux服务器开发

    Nginx源码实现的细枝末节 11个阶段的实现 视频讲解如下,点击观看: Nginx源码实现的细枝末节 11个阶段的实现丨Nginx Filter|中间件开发|惊群效应|负载均衡丨组件丨c/c++li ...

  5. WEB请求处理二:Nginx请求反向代理

    上一篇<WEB请求处理一:浏览器请求发起处理>,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建立TCP连接,发送HTTP请求.本文将讲述请求到达反向代理服务器的一个处理 ...

  6. WEB 请求处理二:Nginx 请求 反向代理

    上一篇<WEB请求处理一:浏览器请求发起处理>,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建立TCP连接,发送HTTP请求.本文将讲述请求到达反向代理服务器的一个处理 ...

  7. 阿里限流神器Sentinel夺命连环 17 问?,nginx请求转发原理

    阿里限流神器Sentinel夺命连环 17 问?,nginx请求转发原理 前沿技术精品 2021-11-17 10:43:04 阅读数:77 评论数:0 点赞数:0 收藏数:0 标签:Sentinel ...

  8. 程序员职业生涯的11个阶段程序人生

    程序员的职业生涯是一段充满起伏的有趣经历.考虑到其陡峭的学习曲线,完全可以预见你将经历挫折.启蒙.骄傲自大这几个时期,以及穿插其间的各种心路历程.在这篇文章中让我们轻松一下,在作者诙谐的语言中来回顾这 ...

  9. atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較...

    atitit.提升开发效率---使用server控件生命周期  asp.net 11个阶段  java jsf 的6个阶段比較 例如以下列举了server控件生命周期所要经历的11个阶段. (1)初始 ...

最新文章

  1. xbmc-12.0稳定版代码初探 (2) —— XBMC_HOME
  2. 别让双手闲下来,来做一些练手项目吧
  3. android的各种*.img 文件
  4. 职场社交是一个真需求吗?
  5. webapp 中为span元素赋值
  6. LeetCode:Add Two Numbers
  7. IOS-字符串太长换行拼接
  8. 我的Markdown的利器——Markdown Here、有道云笔记、iPic
  9. H264所采用的指数格伦布熵编码算法原理及应用
  10. 车萝卜CEO马斌斌:真正自动驾驶的时候你更需要HUD和ARHUD...
  11. C++中public/private/protected三种继承方式下基类成员对派生类的可见性探讨
  12. 对五次实验重新编写后的一些感想
  13. 还在头痛被黑客劫持? 五步帮你摆脱烦恼!
  14. 那些年使用Android studio遇到的问题
  15. OFDM载波间隔_NBloT上行子载波
  16. bzoj3717 [PA2014]Pakowanie(状压dp+贪心)
  17. 1038: 绝对值最大 C语言
  18. 跨境电商o2o模式的表现形式有哪些?
  19. cass简码大全_cass简码实体对照表
  20. xtend怎么使用_Java替代Xtend又推出了另一个块摇摆更新

热门文章

  1. Log4j 漏洞修复和临时补救方法
  2. 动漫公司logo logo制作
  3. java毕业设计海滨体育馆管理系统mybatis+源码+调试部署+系统+数据库+lw
  4. 还在为找不到好看的图标发愁?阿里巴巴矢量图标库全部免费下载
  5. H323加载H264插件时出现找不到dll文件问题解决
  6. LTE全网通 SMD贴片天线方案 CrossAir贴片天线 CA-L01
  7. linux 多线程环形缓冲区,[多线程]环形缓冲区以及多线程条件同步
  8. C语言栈实现进制转换
  9. Win7下BootCamp蓝屏问题解决方案二
  10. Ubuntu安装qt4.8