Nginx处理http的流程

文章目录

  • 前言
  • 一、发版本后旧版本可以用
    • 项目基本情况
      • Nginx 配置
      • **解释每一行的作用:**
      • **表现和行为:**
      • **适用场景**:
      • 资源的缓存策略
    • 在这里插入图片描述
  • 二, nginx处理http的流程
          • Nginx 的 GitHub 源码地址
    • **Nginx 核心源码解读(HTTP 处理流程)**
  • **1. Nginx 处理 HTTP 请求的完整流程**
  • **2. Nginx 处理 HTTP 请求的核心源码**
    • **3. HTTP 请求解析:`ngx_http_request.c`**
        • **关键结构体:`ngx_http_request_t`**
      • **3.1 解析 HTTP 请求行**
      • **3.2 解析 HTTP 头**
    • **4. 匹配 Server/Location:`ngx_http_core_module.c`**
      • **4.1 解析 `server {}`**
      • **4.2 解析 `location {}`**
    • **5. 处理 HTTP 请求 Handler**
    • **6. 发送 HTTP 响应**
    • **7. Nginx HTTP 请求完整流程**
    • **8. 经典优化**
      • ✅ **优化 Worker**
      • ✅ **开启 `sendfile`**
      • ✅ **启用 Gzip**
    • **总结**


前言


一、发版本后旧版本可以用

发版本后旧版本可以用,需要手动刷新后才可获取新版本。

项目基本情况

版本配置:
vue :" ^3.2.25"
vite : “^3.1.0”
element-plus: “^2.1.7”

vite.config.js

export default ({ command, mode }: ConfigEnv): UserConfig => {return {plugins: [vue(),vueJsx({}),AutoImport({resolvers: [ElementPlusResolver()]}),Components({resolvers: [ElementPlusResolver()]}),createSvgIconsPlugin({// 需要缓存的文件夹iconDirs: [resolve(process.cwd(), 'src/assets/svgs')],// 指定symbolIdsymbolId: 'icon-[dir]-[name]'})],build: {},}
}

Nginx 配置

      # 禁用 /pc/index.html 缓存location /pc/index.html {expires -1;  # 不缓存add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";add_header Pragma "no-cache";add_header Expires "0";}

在 Nginx 配置中设置 location /mobile/index.html 来禁用缓存,具体来说,配置如下:

location /mobile/index.html {expires -1;  # 不缓存add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";add_header Pragma "no-cache";add_header Expires "0";
}

解释每一行的作用:

  1. expires -1;

    • 该指令会禁用对 /pc/index.html 文件的缓存。expires -1 表示资源过期时间设置为负值,浏览器会认为该资源立即过期。
  2. add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";

    • no-store:要求浏览器不要缓存任何响应内容。
    • no-cache:即使缓存了该资源,也要求浏览器每次都向服务器验证资源是否更新(即使是缓存的资源也不能直接使用,必须验证)。
    • must-revalidate:在缓存过期后,必须向服务器验证缓存的有效性。
    • proxy-revalidate:在代理缓存过期后,必须验证缓存的有效性。
    • max-age=0:表示资源的最大有效时间为 0 秒。即使缓存了该文件,也需要每次请求都重新验证。
  3. add_header Pragma "no-cache";

    • Pragma: no-cache 是 HTTP/1.0 中用于禁用缓存的指令,虽然它现在已经较少使用,但为了兼容老旧的 HTTP/1.0 客户端,它仍然添加。
  4. add_header Expires "0";

    • 这表示 Expires 头部设置为 0,使得资源立即过期。Expires 是 HTTP/1.0 中用来指定资源过期时间的字段,设置为 0 等同于禁止缓存。

表现和行为:

  • 浏览器行为

    • 当用户访问 /pc/index.html 时,浏览器将不会缓存该文件,每次请求时都会向服务器发起新的请求。
    • 浏览器会每次请求时验证该文件是否有更新,服务器每次返回 index.html 文件时都会重新加载,而不使用缓存中的文件。
  • 代理缓存

    • 如果该请求通过代理(例如 CDN 或缓存代理),代理也会被指示不缓存该资源。即便代理缓存了该文件,也会在缓存过期后重新验证文件的有效性。
  • 确保文件每次都重新请求

    • 这种配置主要用于动态文件,确保用户始终获取到最新版本的文件,而不被浏览器或代理缓存。

适用场景

这种配置适用于你希望某些页面 始终从服务器获取最新版本,而不依赖于浏览器缓存的情况。例如:

  • 动态生成的页面(如登录页、用户界面等)。
  • 某些特殊的 index.html 页面,其中包含根据请求而动态变化的内容或配置。

该配置会 完全禁用 /mobile/index.html 的缓存,确保浏览器每次访问时都从服务器重新获取该文件,无论文件内容是否发生变化。

资源的缓存策略

在这里插入图片描述

二, nginx处理http的流程

Nginx 的 GitHub 源码地址

Nginx 的官方源码托管在 GitHub 和 官方 Mercurial 仓库:

GitHub 镜像(非官方维护,仅同步):
nginx
官方 Mercurial(hg)仓库:
http://hg.nginx.org/nginx/

Nginx 核心源码解读(HTTP 处理流程)

Nginx 作为高性能 Web 服务器,采用 事件驱动 + 多进程架构,核心 HTTP 处理流程涉及 请求解析、匹配 location、调用模块处理请求、返回响应


1. Nginx 处理 HTTP 请求的完整流程

当一个 HTTP 请求到达 Nginx 时,Nginx 主要执行以下 6 个阶段

阶段作用
1. 接收请求accept() 监听连接,创建 ngx_connection_t 结构体
2. 解析请求解析 GET /index.html HTTP/1.1,存储在 ngx_http_request_t 结构体
3. 匹配 Server/Location根据 server_namelocation 规则,找到相应的配置
4. 执行 HTTP 过滤模块例如 rewrite, access, gzip 等模块
5. 选择 Handler 处理请求例如 ngx_http_static_module 处理静态文件,ngx_http_proxy_module 代理请求
6. 发送响应发送 200 OK 响应头,返回 HTML/JSON/静态文件

2. Nginx 处理 HTTP 请求的核心源码

Nginx 处理 HTTP 请求的核心代码主要在:

  1. src/http/ngx_http_request.c (请求解析)
  2. src/http/ngx_http_core_module.c (匹配 serverlocation
  3. src/http/ngx_http_handler.c (调用不同的 handler)
  4. src/http/ngx_http_output_filter.c (返回 HTTP 响应)

3. HTTP 请求解析:ngx_http_request.c

📌 作用

  • 解析 HTTP 请求行(GET /index.html HTTP/1.1
  • 解析 HTTP 头部(HostUser-Agent 等)
  • 解析请求体(Content-LengthPOST 数据)
关键结构体:ngx_http_request_t

所有 HTTP 请求的信息都会存储在 ngx_http_request_t 结构体:

struct ngx_http_request_s {ngx_http_connection_t   *connection;  // 关联客户端连接ngx_str_t uri;                       // 请求的 URIngx_str_t args;                      // URL 查询参数 ?id=123ngx_uint_t method;                   // HTTP 方法 (GET, POST)ngx_http_headers_in_t headers_in;    // HTTP 请求头ngx_http_headers_out_t headers_out;  // HTTP 响应头ngx_http_core_loc_conf_t *loc_conf;  // 匹配的 location 配置
};

3.1 解析 HTTP 请求行

📌 代码位置ngx_http_parse_request_line()

ngx_int_t ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)

解析 GET /index.html HTTP/1.1

if (ngx_str3_cmp(m, 'G', 'E', 'T', ' ')) {r->method = NGX_HTTP_GET;
} else if (ngx_str3_cmp(m, 'P', 'O', 'S', 'T')) {r->method = NGX_HTTP_POST;
}
  • 解析 URI
r->uri_start = p;
while (*p && *p != '?' && *p != ' ') { p++; }
r->uri_end = p;
  • 解析 HTTP 版本
if (ngx_str3_cmp(p, 'H', 'T', 'T', 'P')) { r->http_version = NGX_HTTP_VERSION_11; }

3.2 解析 HTTP 头

📌 代码位置ngx_http_parse_header_line()

ngx_int_t ngx_http_parse_header_line(ngx_http_request_t *r, ngx_buf_t *b, ngx_uint_t allow_underscores)

解析请求头(示例)

Host: example.com
User-Agent: curl/7.68.0

代码:

if (ngx_str3_cmp(h, 'H', 'o', 's', 't')) {r->headers_in.host = h;
} else if (ngx_str3_cmp(h, 'C', 'o', 'n', 't', 'e', 'n', 't', '-', 'L', 'e', 'n', 'g', 't', 'h')) {r->headers_in.content_length_n = ngx_atoi(value, len);
}

4. 匹配 Server/Location:ngx_http_core_module.c

📌 作用

  • 解析 server {}location {} 配置
  • 选择最匹配的 server {}
  • 选择最匹配的 location {} 规则

4.1 解析 server {}

📌 代码位置ngx_http_core_server()

static char *ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
  • 解析 listen 80;
  • 解析 server_name example.com;
  • 解析 location / {}

4.2 解析 location {}

📌 代码位置ngx_http_core_location()

static char *ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
  • 解析 root /var/www/html;
  • 解析 proxy_pass http://backend;

5. 处理 HTTP 请求 Handler

📌 代码位置ngx_http_handler.c

ngx_int_t ngx_http_handler(ngx_http_request_t *r)
  • 选择合适的模块处理请求:
    • ngx_http_static_module(静态文件)
    • ngx_http_proxy_module(反向代理)
    • ngx_http_rewrite_module(重写)
    • ngx_http_gzip_module(Gzip 压缩)

6. 发送 HTTP 响应

📌 代码位置ngx_http_output_filter.c

ngx_int_t ngx_http_output_filter(ngx_http_request_t *r, ngx_chain_t *in)

1️⃣ 设置 HTTP 状态码

r->headers_out.status = NGX_HTTP_OK;

2️⃣ 设置响应头

r->headers_out.content_length_n = size;
r->headers_out.content_type = ngx_string("text/html");

3️⃣ 发送数据

ngx_http_send_header(r);
ngx_http_output_filter(r, &out);

7. Nginx HTTP 请求完整流程

1. 客户端请求: GET /index.html HTTP/1.1
2. Nginx 解析请求 (ngx_http_request.c)
3. 匹配 server/location (ngx_http_core_module.c)
4. 选择模块处理请求 (ngx_http_handler.c)
5. 发送 HTTP 响应 (ngx_http_output_filter.c)

8. 经典优化

优化 Worker

worker_processes auto;
worker_connections 4096;

开启 sendfile

sendfile on;
tcp_nopush on;

启用 Gzip

gzip on;
gzip_types text/html text/css application/json;

总结

  • Nginx 解析 HTTP 请求ngx_http_request.c
  • 匹配 server / locationngx_http_core_module.c
  • 调用合适的处理模块ngx_http_handler.c
  • 发送响应ngx_http_output_filter.c

这个 完整 HTTP 处理流程 让 Nginx 成为一个高性能 Web 服务器 🚀

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

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

相关文章

QT各种版本下载安装

参考链接: 【Qt】超详细!Qt4.8.6和VS2010的配置及使用 由于QT官网一般现在进不去,所以下载一些QT版本只能通过镜像或者以前下载存储的安装包来进行,现在推荐两种方法 从参考链接中搬过来: 方案一:国内镜…

【STM32H743IIT6】STM32H7的ADC时钟频率设置问题 —— 网上大多文章未注意到的要点!

前言 我使用的是定时器触发ADC采样。最近在想达到ADC的最高采样率的时候,发现一直却卡在1Msps上不去,直到在硬汉嵌入式的论坛里才发现了答案:[ADC] STM32H743/H750的Y版和V版芯片ADC的主频区别 这篇文章就详细的讲一下这个问题,这…

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四) 第一部分:网络平台搭建与设备安全防护任务书第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1:应急响应&…

touchgfx的工作机制

touchgfx的工作机制 一.MVP软件架构 MVP的全称为Model-View-Presenter Model: 就是数据部分,在整个touchgfx应用中,只有一个Model类实例对象,它为所有的Screen屏幕界面服务,可以理解成是一个全局变量区,同时它还负责和后端系统通信 View: 就是UI界面部分,对应于View类,在整…

在 Ansys Mechanical 中解决干涉拟合

有意和无意的过盈配合在工程设计和有限元分析 (FEA) 中很常见。当两个组件重叠或接触时,就会发生这种情况,从而产生应力和变形,必须仔细分析以确保功能正常。有意干涉,例如轴和轴承之间的压配合或用于固定金…

Linux设备驱动开发-SPI驱动开发详解(包含设备树处理详细过程)

基础知识及 SPI 相关结构体介绍 引脚:MISO(master 输入,slave 输出),MOSI(master 输出,slave 输入),片选引脚,SCK(时钟) 控制寄存器&…

Visual Studio 中的 /MD 与 /MT、动态库与静态库的深入解析

文章目录 1. /MD 与 /MT 的区别1.3 调试版本1.4 注意事项 2. 动态库与静态库的联系与区别2.3 联系与区别 3. 结合你的错误分析3.1 错误原因3.2 解决方案3.3 经验教训 4. 总结 在 Visual Studio 中进行 C/C 项目开发时,开发者经常需要对运行时库选项(例如…

蓝桥杯备考:贪心算法之矩阵消除游戏

这道题是牛客上的一道题,它呢和我们之前的排座位游戏非常之相似,但是,排座位问题选择行和列是不会改变元素的值的,这道题呢每每选一行都会把这行或者这列清零,所以我们的策略就是先用二进制把选择所有行的情况全部枚举…

绿色节能|暴雨服务器荣获液冷装置新专利授权

近日,暴雨信息宣布“液冷装置及电子设备”专利正式获批,标志着暴雨信息在电子设备散热领域取得重大技术突破,为数据中心及高性能电子设备的散热需求提供了创新性解决方案。 双重密封零漏液保障 传统冷板技术存在液体泄漏风险,严…

萌新学 Python 之闭包函数

闭包函数:在一个函数体内嵌套函数,是一个函数对象,允许在内部函数中修改或引用外部函数的变量 闭包函数对数据有封存功能 闭包函数需要满足以下几个条件: 1.函数必须有一个嵌套函数,在定义函数时,内部再…

【Python修仙编程】(二) Python3灵源初探(2)

第一部分:林羽的修仙之旅——字符串与布尔类型的修炼 林羽站在练气期一阶的起点,望着手中的《Python无极心法》秘籍,心中充满了期待。师傅玄天真人在一旁微笑着说道:“林羽,今天我们要修炼的是‘字符串’和‘布尔类型…

AI大模型(四)基于Deepseek本地部署实现模型定制与调教

AI大模型(四)基于Deepseek本地部署实现模型定制与调教 DeepSeek开源大模型在榜单上以黑马之姿横扫多项评测,其社区热度指数暴涨、一跃成为近期内影响力最高的话题,这个来自中国团队的模型向世界证明:让每个普通人都能…

2.部署kafka:9092

官方文档:http://kafka.apache.org/documentation.html (虽然kafka中集成了zookeeper,但还是建议使用独立的zk集群) Kafka3台集群搭建环境: 操作系统: centos7 防火墙:全关 3台zookeeper集群内的机器,1台logstash 软件版本: …

IO进程 day05

IO进程 day05 9. 进程9. 9. 守护进程守护进程的特点守护进程创建步骤 10. 线程10.1. 线程的概念10.2. 进程和线程的区别10.2. 线程资源10.3. 线程的函数接口1. pthread_create-创建线程线程函数和普通函数的区别 2. pthread_exit3.线程资源回收函数join和detach的区别 获取线程…

数字IC低功耗后端设计实现之power gating和isolation技术

考虑低功耗设计需求,下图中间那个功能模块是需要做power domain的,即这个模块需要插MTCMOS。需要开启时,外面的VDD会和这个模块的LOCAL VDD形成通路,否则就是断开即power off状态。 这些低功耗设计实现经验,你真的懂了…

使用 Open3D 批量渲染并导出固定视角点云截图

一、前言 在三维点云处理与可视化中,固定视角批量生成点云渲染截图是一个常见的需求。例如,想要将同一系列的点云(PCD 文件)在同样的视角下生成序列图片,以便后续合成为视频或进行其他可视化演示。本文将介绍如何使用…

c++的继承

封装、继承和多态是c的三大特性,他们的关系甚为紧密 封装的概念简单易懂,其实就是将数据和操作数据的方法结合在一起,形成一个独立的单元(类),通过访问控制符(如private、protected和public&…

3dtiles平移旋转工具制作

3dtiles平移旋转缩放原理及可视化工具实现 背景 平时工作中,通过cesium平台来搭建一个演示场景是很常见的事情。一般来说,演示场景不需要多完善的功能,但是需要一批三维模型搭建,如厂房、电力设备、园区等。在实际搭建过程中&…

我是如何从 0 到 1 找到 Web3 工作的?

作者:Lotus的人生实验 关于我花了一个月的时间,从 0 到 1 学习 Web3 相关的知识和编程知识。然后找到了一个 Web3 创业公司实习的远程工作。 👇👇👇 我的背景: 计算机科班,学历还可以(大厂门槛水平) 毕业工…

进程状态(R|S|D|t|T|X|Z)、僵尸进程及孤儿进程

文章目录 一.进程状态进程排队状态:运行、阻塞、挂起 二.Linux下的进程状态R 运行状态(running)S 睡眠状态(sleeping)D 磁盘休眠状态(Disk sleep)t 停止、暂停状态(tracing stopped)T 停止、暂停状态(stopp…