这是一个关于 ​​Web 服务器基本工作流程​​ 的全面解释。

我们以最经典的 ​​客户端-服务器-后端​​ 三层架构为例,并结合你之前遇到的 Nginx 场景进行说明。


​核心角色​

  1. ​客户端 (Client)​​: 通常是 ​​Web 浏览器​​ (Chrome, Firefox) 或 ​​API 调用程序​​ (curl, Postman, 手机App)。
  2. ​Web 服务器 (Web Server)​​: 如 ​​Nginx​​、Apache。负责接收请求、处理静态资源或转发请求。
  3. ​应用服务器 (Application Server)​​: 运行业务逻辑的后端程序,如 ​​PHP-FPM​​、Node.js、Python (Django/Flask)、Java (Tomcat) 等。
  4. ​数据层 (Data Layer)​​: 数据库 (MySQL, PostgreSQL)、缓存 (Redis)、外部 API 等。

​Web 服务器基本工作流程(七步曲)​

整个流程可以概括为以下七个核心步骤,下图清晰地展示了请求的生命周期:

sequenceDiagramparticipant C as 客户端 (浏览器)participant N as Web 服务器 (Nginx)participant A as 应用服务器 (PHP/Node)participant D as 数据库/缓存Note over C, D: 1. 建立连接 & 接收请求C->>N: TCP 三次握手<br>发送 HTTP 请求 (GET /index.html)Note over C, D: 2. 解析请求N->>N: 解析请求行、头、体<br>确定 server_name, locationNote over C, D: 3. 匹配并处理请求alt 请求静态资源 (如 .html, .css, .js)N->>N: 从 root 指令指定的路径读取文件else 请求动态资源 (如 .php, /api/)N->>A: 代理转发 (proxy_pass/fastcgi_pass)A->>D: 执行代码、查询数据库D-->>A: 返回数据A-->>N: 生成内容返回endNote over C, D: 4. 生成并返回响应N->>N: 构造 HTTP 响应头/体<br>状态码、Content-Type等N->>C: 发送 HTTP 响应Note over C, D: 5. 记录日志N->>N: 写入 access.log<br>(可选)写入 error.logNote over C, D: 6. 关闭或保持连接alt 连接保持 (HTTP/1.1 Keep-Alive)Note over C, N: 连接复用,等待下一个请求else 连接关闭N->>C: TCP 四次挥手endNote over C, D: 7. 客户端处理C->>C: 接收响应<br>解析 HTML、加载静态资源<br>渲染页面

下面我们来详细分解图中的每一步。

​第 1 步:建立连接 & 接收请求 (Connection & Request Acceptance)​
  • ​工作原理​​:
    1. 客户端(浏览器)向服务器的 ​​知名端口​​(如 HTTP-80, HTTPS-443)发起 ​​TCP 三次握手​​,建立连接。
    2. 连接建立后,客户端通过该连接发送 ​​HTTP 请求报文​​。
    3. Web 服务器(Nginx)的 ​​监听套接字​​ 接收到这个连接和请求数据。
  • ​相关概念​​: TCP/IP 协议栈、Socket。
​第 2 步:解析请求 (Request Parsing)​
  • ​工作原理​​:
    • Web 服务器解析收到的原始 HTTP 请求数据,将其转换为结构化的、程序易于处理的信息。
    • ​解析内容包括​​:
      • ​请求行​​: GET /index.html HTTP/1.1 (方法、路径、协议版本)。
      • ​请求头​​: Host: example.com, User-Agent, Cookie, Content-Type 等。
      • ​请求体​​(如有): POST 提交的表单数据、JSON 等。
  • ​你的案例​​: Nginx 解析出 GET /sc/backend/info?... HTTP/1.1Host: app-solitairedash-ios.bingodash.club
​第 3 步:匹配并处理请求 (Request Processing)​

这是 ​​最核心的一步​​。服务器根据解析出的信息,决定如何响应这个请求。

  • ​工作原理​​:
    • Nginx 根据 server_name 指令匹配到处理该请求的 ​​虚拟主机 (Server Block)​​。
    • 再根据请求路径(如 /sc/backend/info)匹配到对应的 ​​location 块​​。
    • 根据 location 块中的指令采取行动,主要有两种方式:
      1. ​直接处理​​: 如果请求的是静态资源(如 .html, .css, .js, 图片)。
        • Nginx 根据 rootalias 指令找到文件,直接读取其内容。
      2. ​代理转发​​: 如果请求的是动态资源(如 .php, /api/ 路径)。
        • Nginx 作为 ​​反向代理​​,将请求转发给后端的应用服务器(如 PHP-FPM, Tomcat, Node.js)。
        • 使用 proxy_pass(转发给 HTTP 服务)或 fastcgi_pass(转发给 FastCGI 服务如 PHP-FPM)。
        • ​应用服务器执行业务逻辑​​(查询数据库、处理业务),生成内容,返回给 Nginx。
​第 4 步:生成并返回响应 (Response Construction & Delivery)​
  • ​工作原理​​:
    • Web 服务器将处理结果组装成一个格式正确的 ​​HTTP 响应报文​​。
    • ​响应包括​​:
      • ​状态行​​: HTTP/1.1 200 OKHTTP/1.1 404 Not FoundHTTP/1.1 301 Moved Permanently
      • ​响应头​​: Content-Type, Content-Length, Set-Cookie, Location(用于重定向)等。
      • ​响应体​​: 请求的实际内容(HTML、JSON、图片数据等)。
    • 服务器通过建立的 TCP 连接将响应报文发送回客户端。
​第 5 步:记录日志 (Logging)​
  • ​工作原理​​:
    • 请求处理完毕后,Web 服务器会将本次请求的详细信息记录到 ​​访问日志 (access.log)​​ 中。
    • 如果处理过程中发生错误(如文件未找到、权限不足、后端服务挂掉),会将错误信息记录到 ​​错误日志 (error.log)​​ 中。
  • ​你的案例​​: 你看到的 301 状态码就记录在 access.log 中。
​第 6 步:关闭或保持连接 (Connection Management)​
  • ​工作原理​​:
    • ​HTTP/1.1 默认开启 Keep-Alive​​: TCP 连接不会立即关闭,可以用于后续的多个请求-响应循环,减少重复建立连接的开销,提升性能。
    • ​连接空闲一段时间或完成后​​: 最终会由一方发起 ​​TCP 四次挥手​​ 来关闭连接。
​第 7 步:客户端处理 (Client Processing)​
  • ​工作原理​​:
    • 客户端(浏览器)接收到 HTTP 响应。
    • 根据状态码和 Content-Type 决定如何处理响应体(如渲染 HTML、执行 JavaScript、保存文件)。
    • 浏览器引擎开始工作(解析、布局、渲染),最终将页面呈现给用户。

​总结​

Web 服务器就像一个 ​​高效的调度中心​​:

  1. ​接收​​ 来自各方的请求。
  2. ​解析​​ 请求内容,搞清楚对方要什么。
  3. ​路由​​ 请求,决定是自己处理还是转交给其他专家(应用服务器)。
  4. ​打包​​ 处理结果,并 ​​返回​​ 给请求方。
  5. ​记录​​ 下所有工作流水账(日志),以备查阅。

你之前遇到的 301 状态码,正是在 ​​第 4 步(生成响应)​​ 中,由 Nginx 根据 ​​第 3 步(location 匹配)​​ 的规则 (return 301rewrite ... permanent) 生成的,目的是告诉浏览器:“你要的资源永久地搬到了新地址,请去那里找”。

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

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

相关文章

IDEA 连接MySQL数据库

一、 连接数据库1、打开连接2、建立连接3、输入用户名和密码二、操作数据库1、选择数据库2、New| Query Console 查询控制台3、写查询语句4、New| SQL Script| sql Generator 生成这个数据库表的SQL结构New | SQL Script | Generate DDL to Query Console 在查询控制台生成…

江协科技STM32课程笔记(二)—外部中断EXTI

二、外部中断EXTI中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行。1、stm32中断简介…

Java常见排序算法实现

以下是Java中几种常见排序算法的实现&#xff0c;包括冒泡排序、选择排序、插入排序、快速排序和归并排序。 各排序算法特点说明&#xff1a;冒泡排序&#xff1a; 原理&#xff1a;重复比较相邻元素&#xff0c;将大的元素逐步"冒泡"到数组末尾特点&#xff1a;稳定…

Python爬虫实战:研究Pandas,构建地理信息数据采集和分析系统

1. 引言 1.1 研究背景 地理数据作为描述地球表面空间要素的数据,包含了丰富的空间位置、分布特征和属性信息,在城市规划、环境监测、商业分析等众多领域发挥着不可替代的作用。随着 "数字地球"、"智慧城市" 等概念的提出和发展,地理数据的重要性日益凸…

nvm安装node后出现报错: “npm 不是内部或外部命令,也不是可运行的程序 或批处理文件”

一、问题描述 使用nvm安装node后&#xff0c;使用npm命令报错如下 报错1&#xff1a;npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。报错2&#xf…

【高等数学】第十二章 无穷级数——第二节 常数项级数的审敛法

上一节&#xff1a;【高等数学】第十二章 无穷级数——第一节 常数项级数的概念和性质 总目录&#xff1a;【高等数学】 目录 文章目录1. 正项级数及其审敛法1. 正项级数及其审敛法 正项级数 各项都是正数或零的级数称为正项级数正项级数收敛 正项级数 ∑n1∞un\displaystyle\…

图观 流渲染场景编辑器

一、 产品简介图观 流渲染场景编辑器&#xff0c;以编辑器插件形式&#xff0c;在Unreal Engine中轻松编辑并发布数字孪生场景。支持 GIS 全球/局部 数字孪生场景构建&#xff0c;并预置 图观技术架构工程模板&#xff0c;支持对 场景效果、镜头视野&#xff0c;环境时间气象、…

Visual Studio 函数头显示引用个数

在visual studio 里面有自带的显示引用方案 codeLens

数据结构的哈希表冲突解决方法

哈希表是一种高效的数据结构,通过哈希函数将键映射到存储位置。但由于哈希函数可能将不同键映射到相同位置(称为哈希冲突),需要有效的方法来解决冲突。以下是常见的冲突解决策略,每种方法都有其原理、优缺点和适用场景。我将逐步解释这些方法,确保内容清晰可靠。 1. 开放…

MySQL 基础概念与简单使用

MySQL 基础概念与简单使用 一、数据库基本概念 1、数据库定义 数据库&#xff08;Database&#xff09;是存储在计算机内、有组织、可共享的数据集合&#xff0c;用于高效地管理大量数据。 2、数据库分类 按数据模型分类&#xff1a; 关系型数据库&#xff08;如 MySQL、Oracle…

关系模型的数据结构

在关系数据库这个世界里&#xff0c;所有东西&#xff08;包括你要记录的人、物、事&#xff0c;以及它们之间的联系&#xff09;都用一种叫做“关系”的结构来表示。而这种“关系”的灵魂&#xff0c;就是“码”&#xff08;Key&#xff09;。1. 核心思想&#xff1a;万物皆“…

180 课时吃透 Go 语言游戏后端系列0:序言

零基础能学习 Go 游戏后端开发吗&#xff1f; 当然能学啦&#xff01;别担心&#xff0c;就算你之前对编程一窍不通&#xff0c;也完全没问题。我特意准备了180课时的开发课程&#xff0c;由浅入深、从理论到实践带领大家学会使用GO语言进行游戏后端开发。 编程就像学一门新语…

Android-SerialPort-API-master源码 串口调试 权限分析 定制

我把界面美化了一下Android-SerialPort-API-master源码 1.加了发送按钮 2.加上固定/dev/ttyGS1和GS9串口权限问题已经查清楚了。app与PosServer都是使用google的SerialPort方案。我做的app 都多使用一个函数available()&#xff0c;这个函数是非常有用的。在上位机发送单条指令…

KVM 入门使用手册

KVM 入门使用手册 1. 概述 2. 安装 在 Ubuntu/Debian 上安装 在 RHEL/CentOS/Fedora 上安装 3. 网络配置 查看默认网络 使用桥接网络 (推荐用于服务器) 4. 创建虚拟机 方法一:使用图形界面 (virt-manager) 方法二:使用命令行 (virt-install) 5. 管理虚拟机 使用 `virsh` 命令…

Devise Ruby身份验证解决方案全攻略

文章目录 前言Devise到底是什么&#xff1f;为什么选择Devise&#xff1f;环境准备Devise安装指南第一步&#xff1a;添加Devise到你的Gemfile第二步&#xff1a;初始化Devise第三步&#xff1a;生成用户模型第四步&#xff1a;运行数据库迁移 Devise核心模块详解Database Auth…

68-python操作SQLite

1. 了解SQLite SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的&#xff0c;而且已经在很多嵌入式产品中使用了它&#xff0c;它占用…

在Qt项目中使用QtConcurrent::run,实现异步等待和同步调用

在使用Qt进行开发时&#xff0c;经常需要使用异步方法&#xff0c;不同于C#的async/await&#xff0c;Qt中提供了QtConcurrent::run接口方法可供调用&#xff0c;习惯了C#的await&#xff0c;便想着能不能封装几个类似的函数在项目中使用&#xff0c;探索了下&#xff0c;有如下…

视频分类 pytorchvideo

目录 1. 速度 vs 精度分析 mvit: r2plus1d_r50 推理代码&#xff1a; x3d_xs推理代码&#xff1a; R(21)D X3D&#xff08;轻量级&#xff0c;速度快&#xff09; I3D&#xff08;经典 3D CNN&#xff09; 替换分类层&#xff08;适配你的任务&#xff09; https://gith…

OpenTiny NEXT 内核新生:生成式UI × MCP,重塑前端交互新范式!

近期&#xff0c;我们推出 OpenTiny NEXT —— OpenTiny的下一代企业级前端智能开发解决方案。这不仅是一次技术升级&#xff0c;更是一场用户交互范式的变革&#xff1a;从传统的人机交互升级成为人机交互范式和智能体交互范式的融合。我们坚信&#xff0c;每一个企业应用都值…

深度神经网络1——梯度问题+标签数不够问题

要解决一个复杂问题&#xff0c;可能要训练更深的神经网络&#xff0c;可能会10层及以上&#xff0c;每层包含数百个神经元&#xff0c;成千上万个连接。这样大的神经网络在训练的时候可能会遇到以下问题&#xff1a;这样在进行反向传播的时候&#xff0c;随着层数越来越低会遇…