Nginx的11个phases

  • 一个请求经过nginx处理的过程中,会经过一系列的阶段(phases),下面这个表格列出了nginx的所有phases,每个阶段可选的退出方式,包含的模块和对应的指令

    Phases modules / directives description
    NGX_HTTP_POST_READ_PHASE HttpRealIpModule 读取请求内容阶段
    NGX_HTTP_SERVER_REWRITE_PHASE
    Location ( server rewrite )
    HttpRewriteModule
    rewrite
    请求地址重写阶段
    NGX_HTTP_FIND_CONFIG_PHASE
    Location ( location selection )
    HttpCoreModule
    location
    配置查找阶段
    NGX_HTTP_REWRITE_PHASE
    Location ( location rewrite )
    HttpLuaModule
    set_by_lua、rewrite_by_lua
    请求地址重写阶段
    NGX_HTTP_POST_REWRITE_PHASE 不注册其他模块 请求地址重写提交阶段
    NGX_HTTP_PREACCESS_PHASE
    ( location selection )
    degradation
    NginxHttpLimitZoneModule / limit_zone
    HttpLimitReqModule / limit req
    访问权限检查准备阶段
    NGX_HTTP_ACCESS_PHASE HttpAccessModule
    allow, deny
    NginxHttpAuthBasicModule
    HttpLuaModule
    access_by_lua
    访问权限检查阶段
    NGX_HTTP_POST_ACCESS_PHASE 该指令可以用于控制access阶段的指令彼此之间的协作方式 访问权限检查提交阶段
    NGX_HTTP_TRY_FILES_PHASE HttpCoreModule
    try_files
    配置项try_files处理阶段
    NGX_HTTP_CONTENT_PHASE HttpProxyModule / proxy
    HttpLuaModule / content_by_lua
    HttpCoreModule / proxy_pass
    HttpFcgiModule / FastCGI
    内容产生阶段
    NGX_HTTP_TRY_FILES_PHASE HttpLogModuel / access_log 日志模块处理阶段
  • 各个phase说明

    • (1) post read phase

      post-read 属于 rewrite阶段

      post-read 支持Nginx模块的钩子

      内置模块 ngx_realip 把它的处理程序post-read分阶段挂起,强制重写请求的原始地址作为特定请求头的值

      server {listen 8080;set_real_ip_from 127.0.0.1;real_ip_header   X-My-IP;location /test {set $addr $remote_addr;echo "from: $addr";}
      }

      该配置告诉Nginx强制将每个请求的原始地址重写127.0.0.1为请求头的值X-My-IP。同时它使用内置变量 $remote_addr来输出请求的原始地址

      $ curl -H 'X-My-IP: 1.2.3.4' localhost:8080/test
      from: 1.2.3.4

      curl 参数 -H :自定义头信息传递给服务器

      该选项X-My-IP: 1.2.3.4在请求中包含一个额外的HTTP头

      测试结果

      $ curl localhost:8080/test
      from: 127.0.0.1$ curl -H 'X-My-IP: abc' localhost:8080/test
      from: 127.0.0.1
      ``
      
    • server_rewrite phase

      这个阶段主要进行初始化全局变量,或者server级别的重写。如果把重写指令放到 server 中,那么就进入了server rewrite 阶段。(重写指令见rewrite phase)

      ( 1 ) server-rewrite 阶段运行时间早于 rewrite 阶段

      location /tinywan {set $bbb "$aaa, world";echo $bbb;
      }
      set $aaa "HELLO";

      set $a hello 声明被放在server指令中,所以它运行在server-rewrite阶段

      因此 set $b "$a, world'" ,在location指令中执行 set 指令后,它将获得正确的$a

      执行结果

      # curl http://127.0.0.2:8008/tinywan
      HELLO, world

      ( 2 ) post-read 阶段阶段运行时间早于 server-rewrite 阶段执行

      server {listen 8080;set $addr $remote_addr;set_real_ip_from 127.0.0.1;real_ip_header   X-Real-IP;location /test {echo "from: $addr";}
      }

      ( 3 ) ngx_realip 阶段阶段运行时间早于 server 的 set 指令 阶段执行

      $ curl -H 'X-Real-IP: 1.2.3.4' localhost:8080/test
      from: 1.2.3.4

      服务器指令中的命令集始终比模块ngx_realip晚,

      ( 4 ) server-rewrite 阶段阶段运行时间早于 find-config 阶段执行

    • find config phase

      ( 5 ) find-config 阶段阶段运行时间早于 rewrite 阶段执行

      这个阶段使用重写之后的uri来查找对应的location,值得注意的是该阶段可能会被执行多次,因为也可能有location级别的重写指令。这个阶段并不支持 Nginx 模块注册处理程序,而是由 Nginx 核心来完成当前请求与 location 配置块之间的配对工作

    • rewrite phase:

      如果把重写指令放到 location中,那么就进入了rewrite phase,这个阶段是location级别的uri重写阶段,重写指令也可能会被执行多次

      HttpRewriteModule 的set指令、rewrite指令

      HttpLuaModule的 set_by_lua指令,

      ngx_set_misc模块的set_unescape_uri指令

      另外HttpRewriteModule的几乎所有指令都属于rewrite阶段。

  • 结论:作用域为同一个phase的不同modules的指令,如果modules之间做了特殊的兼容,则它们按照指令在配置文件中出现的顺序依次执行下来

  • HttpLuaModule 模块指令

    • init_by_lua

      在nginx重新加载配置文件时,运行里面lua脚本,常用于全局变量的申请。例如lua_shared_dict共享内存的申请,只有当nginx重起后,共享内存数据才清空,这常用于统计。

    • set_by_lua

      设置一个变量,常用与计算一个逻辑,然后返回结果,该阶段不能运行Output API、Control API、Subrequest API、Cosocket API

    • rewrite_by_lua

      在access阶段前运行,主要用于rewrite

    • access_by_lua

      主要用于访问控制,能收集到大部分变量,类似status需要在log阶段才有。这条指令运行于nginx access阶段的末尾,因此总是在 allow 和 deny 这样的指令之后运行,虽然它们同属 access 阶段。

    • content_by_lua

      阶段是所有请求处理阶段中最为重要的一个,运行在这个阶段的配置指令一般都肩负着生成内容(content)并输出HTTP响应。

    • header_filter_by_lua

      一般只用于设置Cookie和Headers等,该阶段不能运行Output API、Control API、Subrequest API、Cosocket API

    • body_filter_by_lua

      一般会在一次请求中被调用多次, 因为这是实现基于 HTTP 1.1 chunked 编码的所谓“流式输出”的,该阶段不能运行Output API、Control API、Subrequest API、Cosocket API

    • log_by_lua

      该阶段总是运行在请求结束的时候,用于请求的后续操作,如在共享内存中进行统计数据,如果要高精确的数据统计,应该使用body_filter_by_lua

  • --with-http_realip_module 模块

    • set_real_ip_from   192.168.1.0/24;     指定接收来自哪个前端发送的 IP head 可以是单个IP或者IP段
    • set_real_ip_from 192.168.2.1;
    • real_ip_header X-Real-IP; IP head 的对应参数,默认即可。

Nginx的11个phases相关推荐

  1. Nginx的11个执行流程

    1 Nginx简介 Web服务器市场份额 Nginx [engine x] 最初由 Lgor Sysoev 编写.根据 Netcraft 的数据,到2020年9月,Nginx 服务或代理了25.76% ...

  2. nginx 1.11.0实现http和https正向代理

    编译安装时候加上这个--with-http_ssl_module 生成两个文件443.crt和443.key.crt是证书,key是私钥 1.先生成私key文件,再用之生成加密的私key文件 open ...

  3. nginx系列11:负载均衡哈希算法ip_hash与hash模块

    使用默认的round-robin负载均衡算法无法保证某一类请求只能由上游的某一台应用服务器处理,它只适用于AKF扩展中的水平扩展,如果要保证某一类请求只能由上游的某一台应用服务器处理,就需要用到AKF ...

  4. Nginx HTTP请求的11个阶段

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

  5. Nginx与Lua利用fpm打成rpm包

    1.下载相关软件 需要软件有:Nginx,LuaJIT,ngx_devel_kit,ngx_lua等安装文件 安装Lua或者LuaJIT都是可以的,但是出于效率的考虑,推荐安装LuaJITshell& ...

  6. Nginx负载均衡的详细配置及使用案例

    Nginx负载均衡的详细配置及使用案例详解 感谢看过这一些列博文和评论的小伙伴, 我把自己所看到的学到的拿到这里来分享是想和大家一起学习进步, 想听听园友给出的意见, 也是对自己学习过程的一个总结.  ...

  7. 在CentOS 6.3 64bit上安装Nginx 1.8.0

    根据工作需要,现在需要安装nginx服务器,本来可以直接安装别人制作好的rpm包的,但是本着爱折腾和时刻尝鲜的精神,我决定从官网下载最新的nginx源码来安装,下面记录了我的安装过程. 下面的安装假定 ...

  8. Zabbix(六):项目实战之--自动发现nginx调度器及后端web服务集群、自定义参数监控...

    项目: 1.自动发现nginx调度器及后端apache构建的web服务集群: 2.使用自定义参数监控调度器上nginx服务的相关统计数据及速率数据: 3.使用自定义参数监控后端apache服务的相关统 ...

  9. 如何为 Flask Web 应用配置 Nginx

    原文地址:How to Configure NGINX for a Flask Web Application 原文作者:patricksoftware 译文出自:掘金翻译计划 本文永久链接:gith ...

最新文章

  1. mvc的宿舍管理系统源码 基于jsp_[源码和文档分享]基于JSP的MVC框架实现的图书推荐系统展示平台网站...
  2. 7.2 TensorFlow笔记(基础篇): 生成TFRecords文件
  3. centos7虚拟机开启端口后 外部不能访问的问题
  4. 网站中被误解的用户体验设计
  5. 一位19年的Mac用户:“我真的很讨厌库克”
  6. c++中char * 和 char []的区别-转
  7. 读写生信流程必备的 Perl 语法
  8. Java类装载器(Classloader)机制解析整理
  9. python爬取美女图片
  10. Chorme浏览器中安装Axure插件的方法
  11. 路由器登录校园网解决终端限制问题
  12. React native和原生之间的通信
  13. Gazebo模型制作dae
  14. kaggle入门之Digital Recognition(数字识别)
  15. stroage——SAN存储与WINDOWS主机连接
  16. springMVC的扩展与接管
  17. statusbar 尺寸 显示图标_CAD状态栏图标显示状态的设置方法步骤
  18. Ubuntu查看usb设备驱动/usb以太网卡设备驱动
  19. 通用数据打捞工具操作手册
  20. SEO灰帽手段常用四种手法,仅供参考

热门文章

  1. 共享两个有用的网页布局表格 【有用】
  2. CSS:媒体查询 CSS3 Media Queries
  3. Ubuntu文本检索神器——SearchMonkey
  4. set_include_path函数应用
  5. 如何用Pygame写游戏(五)
  6. LeetCode 524. Longest Word in Dictionary through Deleting
  7. 【AI视野·今日CV 计算机视觉论文速览 第213期】Fri, 4 Jun 2021
  8. 【Linux入门学习之】ubuntu10.04 ruijie配置上网(用mentohust)
  9. python类与对象 封装继承与多态 0308
  10. 创建线程的办法 java 1615387415