Nginx系列-11 HTTP消息处理流程

news2024/11/14 13:46:36

背景

了解Nginx处理HTTP请求的11个阶段,有助于理解和配置nginx、自定义模块、基于lua模块自定义功能。按如下配置,执行"curl http://localhost:8001/query/test.html",如果读者对结果不是很确定,建议阅读本文。

server {
    listen 8001;
    server_name localhost;
    
    rewrite ^/query/(.*)$ /ask/$1;
    
    location /ask {
        root html;
        try_files index.html =500;
        proxy_pass http://localhost:8002;
        rewrite ^/ask(.*)$ /query;
        index 50.html;
        return 200 "ask success";
    }
}

1.HTTP消息处理流程

以下分小节进行讲解Http请求进入Nginx后,处理流程按顺序分为以下11个阶段:
在这里插入图片描述

说明:所有阶段不是必须经历的,可能在某个阶段结束请求,如return指令后,请求就不再向下传递。

1.1 消息读取

[1] post_read
接收完完整的请求头后进入该阶段,由于未经过处理,此时保留请求的原始信息,如客户端的真实IP和原始请求路径。

说明:realip模块使用可参考:Nginx系列-10 realIp模块使用。

1.2 rewrite

[2] server_rewrite
匹配server块后进行该阶段,处理server块中的return、rewrite等指令;
说明:return和rewrite根据配置的先后顺序执行,rewrite后可以继续执行return;而return指令执行完,直接退出处理流程,直接发送响应给客户端(即配置在return后的rewrite失效)。

server {
 rewrite指令1;
 return指令;
 rewrite指令2;
}

此时,rewrite指令1和return指令依次执行,而rewrite指令2不会执行。

说明:rewrite指令的使用可以参考:Nginx系列-6 rewrite使用介绍

[3] find_config
根据url(被rewrite后-使用重新后的url)查找匹配的location。此阶段根据请求url和location的配置进行匹配。

说明:url匹配可以参考:Nginx系列-3 servername优先级和location优先级和常用正则表达式 和 Nginx系列-4 proxy_pass使用和路径拼接问题

[4] rewrite
进入匹配的location块后,处理location块内的return、rewrite等指令。
由此,在location中,return、rewrite指令优先级高于allow/deny, try_files, proxy_pass, index等指令。
[5] post_rewrite
判断location块内是否有重写,如果没有,进入下一阶段;如果有重写,跳到find_config阶段查询匹配的location.
此过程会判断url重写是否达到上线,如果达到上限会返回500异常,不再进行重写。

1.3 access

access包括3个阶段,用于对客户端的请求进行访问控制。
[6] pre_access
在access访问控制的前置阶段,侧重于从链路层面限制,如使用limit_req、limit_conn、limit_rate分别来控制请求数、访问速率、链接数等。
[7] access
access阶段侧重于进行业务层面的限制,如使用deny/allow实现黑白名单、使用auth模块进行用户密码校验.

说明:deny/allow的使用可以参考:Nginx系列-8 常见指令收集

[8] post_access
配合access阶段使用,如果ACCESS阶段返回了NGX_HTTP_FORBIDDEN或NGX_HTTP_UNAUTHORIZED, 会中断请求。

1.4 content

content包括2个阶段,用于生成实际的响应内容。
[9] pre_content
处理try_files指令,如果没有直接进入下一个阶段。
[10] content
处理proxy_pass、index等指令,生成响应内容。
由此可以看出,try_files的优先级高于proxy_pass和index,即当try_files和proxy_pass和index共处于location块内时,只有try_files生效。

location /ask {
    proxy_pass http://localhost:8002; #不生效
    index 50.html; #不生效
    try_files index.html =500; #生效
}

说明:try_files的使用可以参考Nginx系列-5 root和alias和index和try_files

1.* filter模块

对生成的content内容,进行进一步处理。
如ngx_http_sub_module模块提供的sub_filter可对生成的content进行字符替换。
filter模块不仅可以处理content阶段的响应,还可以处理return指令的结果:

server {
    listen 8001;
    server_name localhost;
    location /query {
        return 200 "8001 query success";
        
        # 将响应体中消息的success转为大写
  sub_filter success SUCCESS;
        sub_filter_types *;
        sub_filter_once off;
    }
}

测试结果如下所示:

[root@124 conf]# curl http://localhost:8001/query
8001 query SUCCESS

1.5 log

[11] log
access_log模块工作在此阶段,当请求发送给客户端后,记录访问日志,此时access.log文件中新增一条记录。

2.扩展

后续将介绍Nginx基于Lua模块扩展功能,会结合本文的http处理流程进行介绍。

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

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

相关文章

免费pdf转word软件有哪些?5个软件帮助你快速进行文件转换

免费pdf转word软件有哪些?5个软件帮助你快速进行文件转换 将PDF文件转换为Word格式可以方便编辑和修改。以下是五款免费的PDF转Word软件,它们可以帮助你快速进行文件转换。 迅捷PDF转换器 这是一款设计简洁、操作便捷的PDF工具,它集成了多…

go语言day20 使用gin框架获取参数 使用自定义的logger记录日志

Golang 操作 Logger、Zap Logger 日志_golang zap-CSDN博客 目录 一、 从控制器中获取参数的几种形式 1) 页面请求url直接拼接参数。 2) 页面请求提交form表单 3) 页面请求发送json数据,使用上下文对象c的BindJSON()方法接…

面试场景题系列--(4)设计一个支持敏感数据存储和传输安全的加解密平台--xunznux

文章目录 设计一个支持敏感数据存储和传输安全的加解密平台1. 设计背景2. 需求分析日常开发中的加解密程序常见问题解决方案具体来说系统主要用例过程和功能系统需求 3. 概要设计3.1 部署模型3.2 加解密调用流程 4. 详细设计4.1 密钥领域模型4.2 核心服务类设计4.3 加解密数据接…

张量网络碎碎念:从 SO3 到 SO2

在上两篇文献中,我像大家介绍了 多通道 模型在 AI for Science 任务中的应用。核心思路类似 CV 中,将灰白单通道拓展到 RGB 多通道,能够提升图片表征能力。(见 图神经网络与分子表征:8. TFN)痛点在于张量积…

昇思25天学习打卡营第4天|基础知识-数据变换 Transforms

目录 数据变换 Transforms 环境 Common Transforms Compose Vision Transforms Rescale Normalize HWC2CHW Text Transforms PythonTokenizer Lookup Lambda Transforms 补充知识 map方法: lambda函数 filter() 函数 数据变换 Transforms 通常情况下&…

新手小白也能做!十大跨境电商平台推荐

梦想着将你的商品推向世界吗?跨境电商不仅是一门生意,更是一场文化和创新的交流。但作为新手,面对众多平台,你可能会有些迷茫。别担心,我们为你精选了几个全球知名的跨境电商平台,从入驻条件到开店成本&…

【windows11禁止自动更新(重启自动更新)】

第一种: 鼠标点击我的电脑点管理,然后就打开了计算机管理,将Windows Update改成禁用,然后确定,重启。 第二种方法: 下载地址:下载地址 下载好之后点击下载的那个应用程序**(点了之后就可以删掉了&#…

Mysql 输出本月初至当前的全部天数

代码&#xff1a; SELECT DATE_FORMAT(DATE_ADD(CONCAT(DATE_FORMAT(CURDATE(), "%Y-%m-01")),INTERVAL (CAST(help_topic_id AS SIGNED)) DAY),%Y-%m-%d) as DATE FROMmysql.help_topic WHERE help_topic_id < TIMESTAMPDIFF(DAY, CONCAT(DATE_FORMAT(CURDATE…

【软件测试】--接口测试

1. 接口用例设计 接口测试的测试点 功能测试 单接口功能&#xff1a; 手工测试中的单个业务模块&#xff0c;一般对应一个接口 登陆业务 --> 登陆接口加入购物车业务 --> 加入购物车接口订单业务 --> 订单接口支付业务 --> 支付接口 借助工具、代码。绕开前端界面…

Mybatis框架基础知识

Mybatis 1.1什么是Mybatis 1.MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。 2.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 3.MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO…

Celeron® J1900/N2807/2930 +FPGA PCI104模块,支持 WinXP(无硬件图形加速)操作系统、宽温

Celeron J1900/N2807/2930 PCI104模块 规格产品类型PCI 104 嵌入式主板芯片组SOCCPUIntel Celeron Processor J1900/N2807/2930内存板载2GB DDR3L双通道内存BIOSAMI 显示 L VDS 18/24-bit&#xff0c;VGA L VDS 支持最大分辨率为 1366768&#xff0c;VGA 支持最大分辨率为2048…

【分享】三种有效的PDF转Word技巧

在日常工作和学习中&#xff0c;有时我们需要将PDF文件转换为Word文档&#xff0c;或者转为Word文档后&#xff0c;可以更方便编辑和修改其内容。今天分享3个可以快速转换格式的工具&#xff0c;一起来看看吧&#xff01; 方法1&#xff1a;使用PDF编辑器 PDF编辑器一般具备格…

SpringBoot整合jasypt加密和解密yml配置文件

使用场景 在微服务架构中&#xff0c;配置管理是一个重要的问题。通常&#xff0c;我们会在配置文件中存放一些敏感信息&#xff0c;如数据库连接字符串、API 密钥等。这些敏感信息如果明文存储在配置文件中&#xff0c;存在较大的安全隐患。为了提高安全性&#xff0c;我们需…

虚拟串口下载破解

文章目录 文章介绍下载链接安装教程 文章介绍 下载虚拟串口并破解 下载链接 下载链接 安装教程 安装完成后不要运行&#xff0c;将Cracked中的文件复制 替换文件安装目录中的这两个文件

历史性突破:200层以上存储芯片率先量产,领先国外芯片巨头

中国芯片技术取得了历史性进展&#xff0c;我们已经可以率先实现200层以上存储芯片的量产&#xff0c;走在了国外存储芯片行业前列。 这一突破性的进展&#xff0c;有望使我们在全球芯片行业中占据领先地位。 后起之秀&#xff0c;鱼跃龙门 存储芯片的生产&#xff0c;不仅是…

三菱GX WORKS3中如何使用恒定周期程序实现定时中断?

三菱GX WORKS3中如何使用恒定周期程序实现定时中断? 如下图所示,打开GX WOKRS3新建一个项目,恒定周期项目树下,添加一个程序本体,在程序中编写简单的自加1指令INC, 如下图所示,在参数—CPU参数中找到 中断设置—恒定周期间隔设置,我这里使用的是I31定时中断,所以这里我…

浅入浅出MyBatis(二)简单实现MyBatis底层机制

MyBatis底层机制示意图 mybatis-config.xml mybatis-config.xml 是MyBatis全局配置文件&#xff0c;在项目中只能有一份。通过该配置文件可以得到SqlSessionFactory对象 SqlSessionFactory 通过SqlSessionFactory可以得到SqlSession&#xff0c;拿到SqlSession就可以操作数据…

【C语言】简易版扫雷游戏(数组、函数的练习)

目录 一、分析和设计 1.1、扫雷游戏的功能分析 1.2、文件结构设计&#xff08;多文件的练习&#xff09; 1.3、数据结构的设计 二、代码 三、效果展示 三、优化 一、分析和设计 1.1、扫雷游戏的功能分析 以在线版的扫雷游戏为参考&#xff0c;分析它的功能&#xff1a;扫…

JAVA中的多线程详解

1.概念 进程(Process)&#xff1a; 进程是一个包含自身执行地址的程序&#xff0c;多线程使程序可以同时存在多个执行片段&#xff0c;这些执行片段根据不同的条件和环境同步或者异步工作&#xff0c;由于转换的数独很快&#xff0c;使人感觉上进程像是在同时运行。 现在的计…

Kafka知识总结(事务+数据存储+请求模型+常见场景)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 事务 事务Producer保证消息写入分区的原子性&#xff0c;即这批消…