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

    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

  • 相关阅读:
    [附源码]计算机毕业设计人事系统Springboot程序
    深度吐槽阿里云ack服务
    Linux性能优化 - CPU优化
    一、认识微服务
    Python 无废话-基础知识流程控制语句
    数据库管理工具,你可以用Navicat,但我选DBeaver!
    6-图文打造LeeCode算法宝典-数组与排序算法题解
    【计算机视觉项目实战】中文场景识别
    【C++进阶】map和set——下篇(红黑树的学习以及封装map和set)
    vue脚手架vue-cli可视化安装与介绍看完觉得很简单!
  • 原文地址:https://blog.csdn.net/c243311364/article/details/125454889