nginx系列第八篇:Ubuntu下验证nginx各请求处理阶段

Nginx处理请求的过程一共划分为11个阶段,按照执行顺序依次是 post-read、server-rewrite、find-config、rewrite、post-rewrite、preaccess、access、post-access、try-files、content 以及 log。

 

准备工作:host文件加入测试域名
sudo vi /etc/hosts
加入:
127.0.0.1       www.liudehua.com

目录

阶段一 POST_READ

阶段二 SERVER_REWRITE

阶段三 FIND_CONFIG

阶段四 REWRITE

阶段五 POST_REWRITE

阶段六  PREACCESS 

阶段七 ACCESS  

阶段八  POST_ACCESS

阶段九  TRY_FILES

阶段十  CONTENT

阶段十一  LOG阶段


阶段一 POST_READ

     POST_READ阶段是nginx处理请求流程中第一个可以添加模块函数的阶段,任何需要在接收完请求头之后立刻处理的逻辑可以在该阶段注册处理函数。
nginx源码中只有realip模块在该阶段注册了函数,当nginx前端多了一个7层负载均衡层,并且客户端的真实ip被前端保存在请求头中时,该模块用来将客户端的ip替换为请求头中保存的值。
realip模块之所以在POST_READ阶段执行的原因是它需要在其他模块执行之前悄悄的将客户端ip替换为真实值,而且它需要的信息仅仅只是请求头。一般很少有模块需要注册在POST_READ阶段,realip模块默认没有编译进nginx。

nginx配置文件:
server {
  listen 80;
  server_name www.liudehua.com;
  set_real_ip_from 127.0.0.1;
  real_ip_header x-real-ip;

  location / {
     set $addr $remote_addr;
     return 200 "real-ip: $addr";
   }
}

错误:
nginx: [emerg] unknown directive "set_real_ip_from"

解决办法:加入realip模块重新编译
sudo ./configure  --prefix=/home/tiger/nginx-1.22.1/nginx --with-stream --with-http_realip_module 
sudo make & make install

测试请求:
curl -H "x-real-ip: 1.2.3.4" http://www.liudehua.com/
real-ip: 1.2.3.4

说明:
curl 工具的 -H 选项指定了额外的 HTTP 请求头

 

阶段二 SERVER_REWRITE

         SERVER_REWRITE阶段是nginx中第一个必须经历的重要phase,请求进入此阶段时已经找到对应的虚拟主机(server)配置。在SERVER_REWRITE阶段中,请求还未被匹配到一个具体的location中。

nginx配置文件:
server {
   listen 80;
   server_name www.liudehua.com;
   location /server_rewrite {
     set $b "$a, hello world";
     return 200 "args: $b";
   }
   set $a test_server_rewrite;
}
请求:
curl http://www.liudehua.com/server_rewrite
响应:
args: test_server_rewrite, hello world

 

阶段三 FIND_CONFIG

       FIND_CONFIG阶段是寻找配置,是根据uri查找location配置。

nginx配置文件:

server {
   listen 80;
   server_name  www.liudehua.com;
   location / {

       return 200 "test FIND_CONFIG";

     }
}
curl http://www.liudehua.com
test FIND_CONFIG

 

阶段四 REWRITE

       REWRITE阶段为location级别的重写。
nginx配置文件:
server {
   listen 80;
   server_name www.liudehua.com;
   location /rewrite {
     root /home/tiger/nginx-1.22.1/nginx/html;
     rewrite . /rewrite/index.txt break;
   }
}

请求:
curl http://www.liudehua.com/rewrite
响应:
^_^ ^_^ ^_^ hello rewrite 

 

 

阶段五 POST_REWRITE

        该阶段不能注册handler,仅仅只是检查上一阶段是否做了uri重写,如果没有重写的话,直接进入下一阶段;如果有重写的话,则利用next跳转域往前跳转到FIND_CONFIG阶段重新执行。Nginx对uri重写次数做了限制,默认是10次

阶段六  PREACCESS 

          该阶段表明Nginx已经将请求确定到了某一个location(当该server没有任何location时,也可能是server),该阶段一般用来做资源控制,默认情况下,诸如ngx_http_limit_conn_module,ngx_http_limit_req_module等模块会在该阶段注册handler,
用于控制连接数,请求速率等。PREACCESS阶段使用的checker是默认的ngx_http_core_generic_phase函数。

nginx配置文件:
server {
   listen 80;
   server_name www.liudehua.com;
   location /post_rewrite {
           root /home/tiger/nginx-1.22.1/nginx/html;
        limit_conn addr 1; #允许请求连接数
        limit_rate 1k; #限定网络传输速率
   }
}
错误:
nginx: [emerg] zero size shared memory zone "addr"

解决办法:加入zone模块重新编译
server标签同级别增加如下配置
limit_conn_zone $binary_remote_addr zone=addr:10m;

请求:
curl http://www.liudehua.com/post_rewrite
     

阶段七 ACCESS  

      该阶段的首要目的是做权限控制,默认情况下Nginx的ngx_http_access_module和ngx_http_auth_basic_module模块分别会在该阶段注册一个handler。
nginx配置文件:
server {
   listen 80;
   server_name www.liudehua.com;
   auth_basic "User Authentication";
   auth_basic_user_file /etc/nginx/.passwd-www;
    
    location / {
        root   /home/tiger/nginx-1.22.1/nginx/html;
        index  index.html;
    }
}

测试:安装工具htpasswd
sudo apt install apache2-utils
添加认证文件:
htpasswd -c /home/tiger/nginx-1.22.1/nginx/html/.passwd-www www
浏览器访问:
http://www.liudehua.com/

阶段八  POST_ACCESS

        POST_ACCESS和POST_REWRITE阶段一样,只是处理一下上一阶段的结果,而不能挂载自己的handler,具体为如果ACCESS阶段返回了NGX_HTTP_FORBIDDEN或NGX_HTTP_UNAUTHORIZED(记录在r->access_code字段),该阶段会结束掉请求。

阶段九  TRY_FILES

        TRY_FILES阶段仅当配置了try_files指令时生效,实际上该指令不常用,它的功能是指定一个或者多个文件或目录,最后一个参数可以指定为一个location或一个返回码,当设置了该指令时,TRY_FILES阶段调用checker函数ngx_http_core_try_files_phase来依此检查指定的文件或目录是否存在,如果本地文件系统存在某个文件或目录则退出该阶段继续执行下面的阶段,否则内部重定向到最后一个参数指定的location或返回指定的返回码。
        该阶段也不能注册handler
nginx配置文件:
server {
   listen 80;
   server_name www.liudehua.com;
    
    location / {
        root /home/tiger/nginx-1.22.1/nginx/html;
           try_files $uri /test.html /index.htm /index.html;
    }
}

以上配置会按顺序检查文件是否存在,顺序:$uri -> /test.html -> /index.htm  -> /index.html

阶段十  CONTENT

     CONTENT 阶段任务是生成响应内容并输出HTTP响应。
     content阶段包含三个静态资源服务模块,ngx_index,ngx_autoindex,ngx_static用于当在location未使用任何content阶段的指令时处理URL请求。ngx_index和ngx_autoindex只作用于已/结尾的URI,其他由ngx_static执行。
     ngx_index使用index指令用于查找首页文件,配合root指令实现,当找到文件后触发内部跳转而不是直接返回该文件,若都不存在则返回403。
nginx配置文件:
server {
   listen 80;
   server_name www.liudehua.com;

   root /home/tiger/nginx-1.22.1/nginx/html;
   
    location / {
        index index.txt;
    }
}

请求:
curl  http://www.liudehua.com/
响应:
fdsssssssssssss
42333333
5433333333333

 

阶段十一  LOG阶段

      LOG阶段主要的目的就是记录访问日志,进入该阶段表明该请求的响应已经发送到系统发送缓冲区。另外这个阶段的handler链实际上并不是在ngx_http_core_run_phases函数中执行,而是在释放请求资源的ngx_http_free_request函数中运行,这样做的原因实际是为了简化流程,因为ngx_http_core_run_phases可能会执行多次,而LOG阶段只需要再请求所有逻辑都结束时运行一次,所以在ngx_http_free_request函数中运行LOG阶段的handler链是非常好的选择。


 

备注:参考

https://www.cnblogs.com/imcati/p/11681392.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab: cell合并/拼接 数组/array/matrix 去重

1. cell合并/拼接 字符串、向量、矩阵、cell数组拼接 cell1{[1,1],[2,1,1]}; cell2{[2,2],[2,1,1,5]}; res[cell1,cell2];%列拼接 res[cell1;cell2];%行拼接2. 数组/array/matrix 去重 数组或矩阵中的去除重复元素 另参考 string比较 % 第一种方法 r_integer [1,3,2,2,2,…

C语言--程序环境和预处理

翻译环境 C语言的代码是文本信息,对于计算机来说无法直接理解,需要通过翻译环境进行翻译成二进制信息; 我们在写代码的时候,一般都会写在一个源文件中,这时候我们就使用我们的编译器(VS)将其转换为机器代码&#xff0…

Android应用启动全流程分析(源码深度剖析)

作者:努比亚技术团队 源码来源:努比亚技术团队 1.前言 从用户手指点击桌面上的应用图标到屏幕上显示出应用主Activity界面而完成应用启动,快的话往往都不需要一秒钟,但是这整个过程却是十分复杂的,其中涉及了Android系…

TortoiseGit 入门指南13:拣选

对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。 这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用 合并(merge)。另一种情况是,你只需要部分代码变动&#xff0…

Android 11以下DialogFragment里弹出PopWindow显示问题

最近在写UI的时候发现一个非常有意思的事情,Android 11以下在DialogFragment里面弹出PopWindow,最终会被截取。 尝试过一些方法以后将解决方案做一个记录: mPopWindow.setClippingEnabled(false); 应该是Android 11后这里默认设置成了true…

Rust学习-构建命令行程序

Rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择 本文以实现一个minigrep为例,展开对之前学习的回归 初版 接收命令行参数并打印文件内容 // 当所需函数嵌套了多于一层模块时,通常将父模块引入作用域 // std…

[JVM] 2. 类加载子系统(1)-- 内存结构、类加载子系统概述

一、内存结构 类加载子系统的职责是:加载class文件到内存中。 完整的内存结构如下: 二、类加载过程 类加载过程总体分为Loading(加载)、Linking(链接)、Initialization(初始化)三…

Mars3d采用ellipsoid球实现模拟地球旋转效果

1.Mars3d采用ellipsoid球实现模拟地球旋转效果 2.开始自选装之后,模型一直闪烁 http://mars3d.cn/editor-vue.html?idgraphic/entity/ellipsoid 3.相关代码: import * as mars3d from "mars3d"export let map // mars3d.Map三维地图对象 …

深入浅出如何通过API瞬间搭建亿万商品外贸代购系统PHP系统

什么是淘宝代购 淘宝代购是近年兴起的一种购物模式,是帮国外客户购买中国商品。主要是通过万邦 科技的外贸代购系统,把淘宝、天猫等电商平台的全站商品通过API 接入到你的网站 上,瞬间就可以架设一个有数亿产品的大型网上商城,而…

2023年测试之路,从功能测试进阶测试开发工程师,突破内卷...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 测试开发工程师到…

Redis可视化工具(Redis Desktop Manager)

redis是我们平时开发工作中经常用到的非关系型数据库,常用于做数据缓存,分布式锁等。 为了更方便的使用redi,这里给大家推荐一款可视化工具:Redis Desktop Manager。 1.下载与安装 直接到gihub下载,地址 Release 0.…

剑指 Offer 59 - I. 滑动窗口的最大值

题目介绍 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums [1,3,-1,-3,5,3,6,7], 和 k 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 …

uni-app的H5版本下载跨域问题

前端能正常访问图片,但无法下载 因为路径不经过业务代码,所以需要在nginx配置跨域 代码: add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET, POST, OPTIONS; add_header Access-Control-Allow-H…

基于simulink的DPLL仿真笔记

该笔记主要用于本人思路整理与记录 本设计运用的是电荷泵一阶环路滤波器,二阶三阶则在此基础上举一反三,以后如有机会会慢慢补全 文章目录 一.仿真模型PS(题外话) 二.仿真结果三.环路滤波器分析1. 环路滤波器对比LPF2. 环路滤波器…

Shikra:新一代多模态大语言模型,理解指向,说出坐标

“ Shikra:解锁多模态语言模型参考对话的魔法” Shikra和用户的对话案例 在人类的日常交流中,经常会关注场景中的不同区域或物体,双方都可以通过说话并指向这些区域来进行高效的信息交换。我们将这种对话模式称为参考对话(Referen…

等保协议概要

一、等级划分 《信息安全等级保护管理办法》将信息系统的安全保护等级分为以下五级: 第一级,信息系统受到破坏后,会对公民、法人和其他组织的合法权益造成损害,但不损害国家安全、社会秩序和公共利益。 第一级信息系统运营、使用单位应当依据国家有关管理规范和技术标准进…

uniapp自定义头部,计算状态栏和导航栏高度超简单三步

效果图 1.pages.json 页面给要自定义头部的页面加入一行代码 "navigationStyle":"custom" {"path": "pages/index/index","style": {"navigationBarTitleText": "","navigationStyle":"…

Gin+Gorm练手小项目bubble清单企业级结构剖析

概述 本项目来源于Qimi老师的小清单项目——基于gingorm开发的练手小项目,通过该项目可初识go web开发该有的姿势。笔者对代码有些许修改,以下是项目成功运行的截图,主要功能有添加,删除,确认,查看待办事项…

05 信号与槽机制

信号(Signal): 信号的本质是事件,例如鼠标点击,窗口刷新,键盘输入等 槽(Slot): 槽的本质是信号对应的函数,可以有参,可以发生重载 信号与槽机制…

有哪些记事本app可以用来整理个人笔记?

我总是在思考一个问题,为什么现在越来越多的人选择使用记事本app?它们相比传统笔记本,又有什么吸引人的地方呢?这其实并不难理解。因为,记事本app不仅可以让我们及时记录重要信息,还能对这些信息进行系统、…