简单web服务器示例图

2 阅读2分钟

Web 服务器是客户端与后端应用之间的入口层,负责接收 HTTP/HTTPS 请求,并对请求进行处理、转发、优化和保护。

从实际开发角度,重点掌握下面这些就够全面了:

职责作用典型例子
① 接收 HTTP/HTTPS 请求监听端口、建立连接、解析 HTTP 请求监听 80/443
② 静态资源服务直接返回 HTML、CSS、JS、图片、视频等/static/logo.png
③ 路由与请求分发根据域名、URL 等决定请求交给哪个服务/api/user/* → user-service
④ 反向代理将客户端请求代理到后端应用服务器Nginx → Spring Boot
⑤ 负载均衡将请求分配给多台后端服务器Server1 / Server2 / Server3
⑥ HTTPS / TLS管理证书、TLS 握手、加解密HTTPS → 内部 HTTP
⑦ 缓存缓存静态资源或响应,降低后端压力Cache-Control、代理缓存
⑧ 压缩与性能优化减少网络传输量、提高响应速度gzip、Brotli
⑨ 安全与访问控制限流、IP 控制、请求大小限制等单 IP 每秒最多 100 请求
⑩ 日志与监控记录请求、响应状态、耗时、错误access.log、error.log
⑪ 错误处理处理异常情况并返回合适的 HTTP 响应404、502、503

最核心的工作流程

把上面所有东西放到一张逻辑图里,就是:

                    客户端
              浏览器 / App / 爬虫
                     │
                     │ HTTP/HTTPS
                     ↓
          ┌─────────────────────┐
          │     Web Server      │
          │   Nginx / Apache    │
          │                     │
          │ ① 接收请求          │
          │ ② 解析请求          │
          │ ③ 路由/分发         │
          │ ④ HTTPS             │
          │ ⑤ 安全/限流         │
          │ ⑥ 缓存/压缩         │
          │ ⑦ 日志/监控         │
          └─────────┬───────────┘
                    │
          ┌─────────┴──────────┐
          ↓                    ↓
      静态资源              动态请求
          │                    │
     HTML/CSS/JS               │ 反向代理
     图片/视频                 ↓
          │             ┌──────────────┐
          │             │  后端应用    │
          │             │ Spring Boot  │
          │             │ Go / Python  │
          │             └──────┬───────┘
          │                    ↓
          │              MySQL / Redis
          │                    │
          └──────────┬─────────┘
                     ↓
                  返回响应

这里尤其要区分 Web Server 和后端应用:

Web Server 更关心“请求怎么进来、往哪里送、怎么安全高效地送”。

后端应用更关心“这个请求具体要执行什么业务逻辑”。

比如:

GET /api/users/1001

可能经历:

浏览器
  ↓
Nginx
  │
  ├─ HTTPS 解密
  ├─ 限流
  ├─ 记录日志
  ├─ 判断路由
  │
  ↓
user-service
  ↓
Spring MVC 路由
  ↓
UserController
  ↓
getUser(1001)
  ↓
MySQL

路由也可以这样理解

Web Server 路由
     ↓
“应该交给哪个服务?”

后端框架路由
     ↓