主题
概念卡片:Nginx反向代理与负载均衡
一句话机制:Nginx 反代 = 根据 location 匹配规则路由 + proxy_pass 转发;负载均衡 = upstream 定义后端集群 + 分发策略;二者组合实现「客户端 → Nginx → 多台后端」的高可用网关层。
location 匹配规则
location [ = | ~ | ~* | ^~ ] uri { ... }| 符号 | 含义 | 优先级 |
|---|---|---|
= | 精确匹配 | 最高 |
^~ | 前缀匹配,命中即停止搜索 | 次高 |
~ | 正则匹配,区分大小写 | 中 |
~* | 正则匹配,不区分大小写 | 中低 |
| (无符号) | 普通前缀匹配 | 最低 |
优先级:= > ^~ > ~ > ~* > 无符号前缀。
root vs alias(易混)
| 指令 | 行为 | 注意 |
|---|---|---|
root | 定义路径与 URI 叠加 | location /image { root /opt/static; } 访问 /image/1.png → 找 /opt/static/image/1.png |
alias | 只取定义路径(替换) | 只能在 location 中,末尾必须加 /;访问 /image/1.png → 找 /opt/static/image/1.png |
proxy_pass 带不带 /(高频考点)
| 写法 | 行为 |
|---|---|
proxy_pass http://host:8080;(不带 /) | 透传完整 URI:请求 /bbs/abc.html → 上游收 /bbs/abc.html |
proxy_pass http://host:8080/;(带 /) | 去掉 location 前缀:请求 /bbs/abc.html → 上游收 /abc.html |
负载均衡(upstream)
nginx
upstream demo_server {
# 调度策略(默认轮询)
server 127.0.0.1:8020 weight=3 max_conns=1000 fail_timeout=10s max_fails=2;
server 127.0.0.1:8030;
server 127.0.0.1:8040 backup; # 备份服务器,其他都挂才启用
# server 127.0.0.1:8050 down; # 标记下线维护
keepalive 32;
}| 策略 | 说明 |
|---|---|
| 轮询(默认) | 依次分发 |
weight=N | 加权轮询,权重默认 1 |
ip_hash | 按客户端 IP hash,解决 session 保持(同 IP 永远同后端) |
least_conn | 最少连接数,选当前连接最少的后端 |
least_time | 最短响应时间 |
random | 随机 |
hash $request_uri | 按 URI hash,同 URI 同后端 |
max_fails+fail_timeout:N 次失败后判定不可用一段时间(健康检查)。backup备份节点、down手动下线。
反向代理缓存(proxy_cache)
| 指令 | 作用 |
|---|---|
proxy_cache_path | 缓存路径 + level(目录层级)+ keys_zone(共享内存)+ inactive(清理时间) |
proxy_cache zone | 启用缓存 |
proxy_cache_valid 200 5m | 状态码 + 缓存时长 |
proxy_cache_key $request_uri | 缓存 key |
add_header Nginx-Cache-Status $upstream_cache_status | 响应头暴露命中状态 |
upstream_cache_status 取值:MISS(未命中)/ HIT(命中)/ EXPIRED(过期)/ STALE(陈旧)/ BYPASS(绕过)。
实时性要求高的页面/数据不应缓存——用
proxy_no_cache/proxy_cache_bypass排除。
gzip 压缩
gzip on+gzip_types(MIME 类型,text/html 强制启用)。gzip_comp_level 4-6(压缩级别,越高越慢)、gzip_min_length 1k(小于 1k 越压越大)、gzip_static(直接返回已压缩 .gz)。
不变量(必须成立的约束)
- 并发上限 ≈
worker_processes × worker_connections。 - 反代缓存只缓静态/可复用响应,实时数据必须 bypass。
ip_hash会破坏负载均衡的均匀性(同 IP 黏着同一后端),仅在有 session 保持需求时用。
常见误解
- 以为
alias和root一样 → alias 是替换(不叠加 URI),且只限 location、末尾加/。 - 以为
proxy_pass带不带/无所谓 → 决定了上游收到的 URI 是否去掉前缀。 - 以为负载均衡默认 ip_hash → 默认是轮询,ip_hash 需显式配置。
关联
- 总览:Nginx技术栈总览
- 面试:面试题蒸馏卡:Nginx
- 限流:概念卡片:限流算法
- 网关全景:概念卡片:网关与负载均衡全景