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

news2024/12/23 5:30:41

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.coloradmin.cn/o/773130.html

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

相关文章

【Java从0到1学习】03 Java 基础知识

1. 关键字 关键字是编程语言里事先定义好并赋予了特殊含义的单词,也称作保留字。和其它语言一样,Java中保留了许多关键字,例如,class、public等,下面列举的是Java中所有的关键字。 1.1 关键字概述 被Java语言赋予特…

VS报错E1696 无法打开类似于stdio.h等头文件的解决办法

VS报错E1696 无法打开类似于stdio.h等头文件的解决办法 我的VS版本是2022的,然后我今天把同事在VS2017上的code(一个完整的解决方案)从svn上拿过来。结果发现,一大堆E1696的错误。主要表现就是项目中include的一些常用的c语言基础…

【字节缓冲流】定义与使用

字节缓冲流 1.字节缓冲流 BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用BufferInputStream:创建BufferInputStream将创建一个内部…

<Linux开发> linux开发工具-之-I2C TOOLS工具使用

<Linux开发> linux开发工具-之-I2C TOOLS工具使用 <Android开发> Android开发工具- 之-I2C TOOLS工具使用 <Linux开发>驱动开发 -之- Linux I2C 驱动 一 前言 在笔者的另一篇文章 <Android开…

行为树(BEHAVIOR TREES)及其工业应用

顾名思义,行为树是描述事物(人,动物,机器人,虚拟角色等等)行为的树形结构。游戏行业使用行为树为角色行为建模。现在行为树建模技术正在向其它领域渗透,比如工业产线编排,机器人控制…

UKF无损卡尔曼滤波

摘要——卡尔曼滤波器为估计工程系统的状态提供了一项重要技术。由于非线性卡尔曼滤波器有多种变体,因此缺乏针对特定研究和工程应用的滤波器选择指南。 这就需要深入讨论不同非线性卡尔曼滤波器的复杂性。 实际状态估计应用特别感兴趣的是扩展卡尔曼滤波器 (EKF) 和…

五、DQL-1.概述

一、DQL介绍 Data Query Language 数据查询语言 用来查询数据库中表的记录。 查询关键字:SELECT 二、语法

TortoiseGit 入门指南11:还原与重置

Git 就像个时光机器,能让我们还原到任何提交。 还原未提交的更改 假如我们在查看一个干净的代码仓库,干净意味着工作区中的文件保持着最后一次提交的状态,没有修改。在查看的过程中,我们有意或无意的修改了工作区中的文件&#…

《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(4)-Charles如何设置捕获会话

1.简介 前边几篇宏哥介绍了Charles界面内容以及作用。今天宏哥就讲解和分享如何设置Charles后,我们就可以愉快地捕获会话,进行抓包了。因为上一篇许多小伙伴看到宏哥的Charles可以分开看到request和response,而自己的却看不到,因…

WEB:FlatScience

背景知识 sql注入 SQLite数据库知识 SQLite3注入方法 题目 用dirsearch进行扫描,下面几个关键目录:robots.txt,login.php,admin.php,剩下的目录就是一些pdf格式的论文了 一个一个访问并查看源代码,在查看l…

23款奔驰S400豪华型升级4D旋转高音,提升车内氛围

奔驰加装4D旋转高音,让高音“有型有色”,高端4D环绕立体声音响系统的视觉效果同样令人印象深刻:系统启动时,安装在前车门后视镜三角板中的两个高音头会与同色车内氛围灯一块亮起,同时向外旋出10mm至最佳效果位置,以提高…

【AutoGluon_01】自动机器学习框架的安装与示例

文章目录 一、安装二、示例一 AutoGluon预测目标数据1、导入数据2、训练3、预测4、评估5、小结 三、示例二 AutoGluon多模态预测(Multimodal Prediction)1、导入数据2、训练3、预测4、评估 四、示例三 AutoGluon进行时间序列预测1、导入数据2、训练3、预…

【redis】redis管道简述

redis管道可以一次性发送多条命令。 命令示例如下: [xxxlocalhost ~]$ echo -e "set k4 99\nincr k4\nget k4" | nc localhost 6379 \OK :100 $3 100下面先简述一下这条命令的组成,再简述一下管道的常用场景和注意事项。 首先,|是…

跨越山海,爱在滇西|拓数派为滇西孩子点亮科学梦想

近日,拓数派在共青团浙江大学委员会、景东县教育体育局和景东团县委等单位指导下开展“爱在滇西”2023年公益助学活动,并携手浙大国际科创中心、浙大微纳电子学院、启真科技控股公司和北京德恒律所共同向景东浙大求是中学捐赠爱心助学金,用于…

微信小程序的目录解析--【浅入深出系列002】

浅入深出系列总目录在000集 如何0元学微信小程序–【浅入深出系列000】 文章目录 本系列校训学习资源的选择先说总目录经常碰到的文件(目录)最最常见的目录pages次最常用的就是images 目录 操作起来真正的操作 配套资源 本系列校训 用免费公开视频,卷…

OpenCVForUnity(八)文本与随机数

文章目录 前言putText (绘制文本)randn (正态分布随机数)randu(均匀分布随机数)randShuffle (数组随机重排)结语 前言 本教程将介绍如何使用随机数生成器类RNG以及从均匀分布中获取随…

LIMA:小规模监督数据指令微调

论文标题:LIMA: Less Is More for Alignment 论文链接:https://arxiv.org/abs/2305.11206 论文来源:Meta AI 一、概述 语言模型在大规模语料上以预测下一个token的方式预训练,使它们能够学习可迁移到几乎任何语言理解或生成任务的…

让小程序动起来-轮播图的两种方式--【浅入深出系列003】

浅入深出系列总目录在000集 如何0元学微信小程序–【浅入深出系列000】 文章目录 本系列校训学习资源的选择啥是轮播图轮播图的关键代码最常见的轮播图代码便于理解的轮播代码两种轮播代码的比较 实际操练第一步,就是找到文件。第二步,先改动一下最显眼…

全源最短路Johnson算法

最短路Johnson算法( O ( n m l o g m ) O(nmlogm) O(nmlogm)) 可以求任意两点最短路, 新图的边权改造为: w ( x , y ) h ( x ) − h ( y ) w(x,y)h(x)-h(y) w(x,y)h(x)−h(y) 构造的新图 d 1 ( x , y ) d ( x , y ) h ( x ) − h ( y ) d1(x,y)d(x,y…

java学习02

一、基本数据类型 Java有两大数据类型,内置数据类型和引用数据类型。 内置数据类型 Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。 byte&#xff1…