这是一个关于 Web 服务器基本工作流程 的全面解释。
我们以最经典的 客户端-服务器-后端 三层架构为例,并结合你之前遇到的 Nginx 场景进行说明。
核心角色
- 客户端 (Client): 通常是 Web 浏览器 (Chrome, Firefox) 或 API 调用程序 (curl, Postman, 手机App)。
- Web 服务器 (Web Server): 如 Nginx、Apache。负责接收请求、处理静态资源或转发请求。
- 应用服务器 (Application Server): 运行业务逻辑的后端程序,如 PHP-FPM、Node.js、Python (Django/Flask)、Java (Tomcat) 等。
- 数据层 (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)
- 工作原理:
- 客户端(浏览器)向服务器的 知名端口(如 HTTP-80, HTTPS-443)发起 TCP 三次握手,建立连接。
- 连接建立后,客户端通过该连接发送 HTTP 请求报文。
- 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.1
和Host: app-solitairedash-ios.bingodash.club
。
第 3 步:匹配并处理请求 (Request Processing)
这是 最核心的一步。服务器根据解析出的信息,决定如何响应这个请求。
- 工作原理:
- Nginx 根据
server_name
指令匹配到处理该请求的 虚拟主机 (Server Block)。 - 再根据请求路径(如
/sc/backend/info
)匹配到对应的 location 块。 - 根据
location
块中的指令采取行动,主要有两种方式:- 直接处理: 如果请求的是静态资源(如
.html
,.css
,.js
, 图片)。- Nginx 根据
root
或alias
指令找到文件,直接读取其内容。
- Nginx 根据
- 代理转发: 如果请求的是动态资源(如
.php
,/api/
路径)。- Nginx 作为 反向代理,将请求转发给后端的应用服务器(如 PHP-FPM, Tomcat, Node.js)。
- 使用
proxy_pass
(转发给 HTTP 服务)或fastcgi_pass
(转发给 FastCGI 服务如 PHP-FPM)。 - 应用服务器执行业务逻辑(查询数据库、处理业务),生成内容,返回给 Nginx。
- 直接处理: 如果请求的是静态资源(如
- Nginx 根据
第 4 步:生成并返回响应 (Response Construction & Delivery)
- 工作原理:
- Web 服务器将处理结果组装成一个格式正确的 HTTP 响应报文。
- 响应包括:
- 状态行:
HTTP/1.1 200 OK
或HTTP/1.1 404 Not Found
或HTTP/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 服务器就像一个 高效的调度中心:
- 接收 来自各方的请求。
- 解析 请求内容,搞清楚对方要什么。
- 路由 请求,决定是自己处理还是转交给其他专家(应用服务器)。
- 打包 处理结果,并 返回 给请求方。
- 记录 下所有工作流水账(日志),以备查阅。
你之前遇到的 301
状态码,正是在 第 4 步(生成响应) 中,由 Nginx 根据 第 3 步(location 匹配) 的规则 (return 301
或 rewrite ... permanent
) 生成的,目的是告诉浏览器:“你要的资源永久地搬到了新地址,请去那里找”。