为什么大厂都用 Nginx?反向代理、负载均衡、缓存一次讲透

0 阅读6分钟

1. 从单机到集群:为什么需要 Nginx

早期的 Web 应用很简单:客户端直接请求 Web 服务器,一台服务器搞定一切。请求量少时完全没问题。

但当网站要面对多个站点、成百上千甚至更高的并发时,单台服务器就扛不住了。于是我们想到加服务器。可服务器一多,新问题来了——客户端该把请求发给哪一台?

答案就是引入一个"调度者":反向代理。它统一接收所有请求,再按策略把负载均衡地分到后面的多台服务器上。

2. 三个概念:代理、反向代理、负载均衡

  • 代理(正向代理 Forward Proxy):代理的是客户端。比如公司员工访问公网,请求先经过代理,由代理去访问目标网站,顺便过滤流量、扫描内容、做访问控制。
  • 反向代理(Reverse Proxy):代理的是服务器。客户端以为自己直接访问某台服务器,实际上请求先到反向代理,再由它转发给后端,客户端完全不知道后端有几台机器。
  • 负载均衡(Load Balancing):把请求均匀地分配到多台后端服务器,避免某台过载、某台闲置,是反向代理最重要的机制之一。

正向代理和反向代理

一句话记住三者关系:反向代理是入口,负载均衡是它的核心功能,缓存和安全是附加价值。

3. 反向代理的四大能力

① 负载均衡

请求先进 Nginx,再由它分发到后端。算法可以自定义:轮询(round-robin,默认)、最少连接(least_conn)、IP 哈希(ip_hash)、权重(weight)等。

负载均衡

② 缓存

后端经常要查数据库、动态生成页面,每次都打库,数据库很快成瓶颈。反向代理可以缓存响应:第一次请求转发到后端并把结果存下来,之后相同请求直接返回缓存副本,不用反复访问数据库。缓存既加快响应,又减轻后端和数据库压力。

缓存

③ 安全:一个入口,两层防护

  • 隐藏后端、缩小攻击面:没有网关时,所有服务器都暴露公网,任何一台被打穿,故障就可能蔓延到整个服务器群。有了反向代理,对外只暴露一个入口,后端藏在私有网络里,攻击面极大缩小。
  • 加密通信(HTTPS / SSL 终止):客户端与代理之间走 HTTPS 加密,代理负责解密(SSL/TLS 终止)再转发内网。既防传输途中被窃听,又统一了证书管理。

TLS终止

④ 分块响应

大文件(比如视频)不必等整个文件加载完才响应,Nginx 支持流式传输和分块响应,边读边发。这也是 Netflix 大量使用 Nginx 的原因——其 CDN 设备(Open Connect Appliance)内置 Nginx,看中的正是大文件流式分发能力。

总结:Nginx 的核心作用就四个关键词——请求转发、缓存、安全、分块响应。

4. nginx.conf 是怎么配置、怎么用的

Nginx 的一切行为都由 nginx.conf(注意:不是 nginx.config)决定。默认路径在 /etc/nginx/nginx.conf,Windows 在安装目录 conf/nginx.conf。

4.1 配置文件长什么样:层级结构

配置由**指令(directive)+ 块(context)**组成,层层嵌套:

main(全局)
├── events          # 连接处理(worker_connections 等)
└── http            # HTTP 服务
    ├── upstream    # 后端服务器组(供负载均衡用)
    └── server      # 一个虚拟主机 / 站点
        ├── listen / server_name
        └── location # 路径匹配规则

nginx.config

语法规则只有三条:

  1. 指令以分号结尾:listen 80;
  2. 块用花括号包裹:http { ... }
  3. # 开头是注释

4.2 一个完整示例(涵盖全部功能)

worker_processes auto;          # 全局:进程数

events {
    worker_connections 1024;    # 每个进程最大连接数
}

http {
    # 缓存路径
    proxy_cache_path /var/cache/nginx keys_zone=my_cache:10m;

    # 后端服务器组(负载均衡)
    upstream backend {
        least_conn;                          # 最少连接算法
        server 192.168.1.10:3000 weight=3;   # 权重高,分配更多
        server 192.168.1.11:3000 weight=1;
    }

    # HTTP 强制跳转 HTTPS
    server {
        listen 80;
        server_name example.com;
        return 301 https://$host$request_uri;
    }

    # HTTPS 站点
    server {
        listen 443 ssl;
        server_name example.com;
        ssl_certificate     /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;

        location / {
            proxy_pass http://backend;   # 转发到后端组
            proxy_cache my_cache;        # 开启缓存
            proxy_cache_valid 200 1h;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location /static/ {              # 静态文件
            root /var/www;
            expires 7d;
        }
    }
}

4.3 改完怎么生效(使用流程)

nginx -t          # 1. 先检查语法是否正确
nginx -s reload   # 2. 热重载,平滑生效,不中断现有连接

nginx             # 启动
nginx -s stop     # 停止
nginx -s quit     # 优雅退出(处理完现有请求再退出)

核心思路:改配置 → nginx -t 验证 → nginx -s reload 生效。 一个请求进来,先按 server_name 匹配站点,再按 location 匹配路径,最后 proxy_pass 转发到 upstream 定义的后端组。

5. 生产环境中的 Nginx

云负载均衡器 + Nginx:分层协作

每个云平台(AWS、阿里云、腾讯云等)都有自己的负载均衡器(ALB、SLB)。它和 Nginx 不冲突,是分层关系:

  • 云负载均衡器:公网入口,处理公网流量;
  • Nginx:内网,接收云 LB 转来的流量,再分发给各微服务。

这种"云 LB → Nginx → 微服务"的分层,让服务更安全、更灵活。

云负载均衡器

在容器和 K8s 里

Nginx 在容器时代依然极受欢迎。Kubernetes 的 Ingress Controller(入口控制器) 最常用的实现就是 Nginx,作为集群对外的统一入口,把流量路由到内部微服务,本质就是高级负载均衡反向代理。

与 Apache 对比

Apache 也是老牌 Web 服务器,同样能做反向代理和负载均衡。但 Nginx 更轻量、并发更强、配置简单,特别适合静态文件和高并发,是最受欢迎的反向代理;Apache 模块丰富、动态处理成熟,但高并发下资源消耗较大。

Nginx + Node.js

Node.js 是基于 V8 引擎的 JavaScript 运行时,事件驱动、非阻塞 I/O,适合高并发 Web 服务;Express 是它的 Web 应用框架。生产环境中典型部署是:

客户端 → Nginx(反向代理/负载均衡) → 多个 Node.js 实例

Nginx 负责分发、静态文件、HTTPS、缓存,Node.js 专注业务逻辑——前者是高效服务器,后者是 Web 框架,两者是经典组合。

总结

  • 正向代理代理客户端,反向代理代理服务器。
  • 反向代理四大能力:负载均衡、缓存、安全(隐藏后端 + HTTPS)、分块响应。
  • 一切配置都在 nginx.conf:main → http → server → location 层层包含,upstream 定义后端组。
  • 用法就三步:改配置 → nginx -t 验证 → nginx -s reload 热重载。
  • 生产环境:云 LB 管公网,Nginx 管内网,分层协作;K8s 里它是 Ingress 控制器;配 Node.js 是经典组合。