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 终止)再转发内网。既防传输途中被窃听,又统一了证书管理。
④ 分块响应
大文件(比如视频)不必等整个文件加载完才响应,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 # 路径匹配规则
语法规则只有三条:
- 指令以分号结尾:
listen 80; - 块用花括号包裹:
http { ... } #开头是注释
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 是经典组合。