Skip to content

概念卡片: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 保持需求时用。

常见误解

  • 以为 aliasroot 一样 → alias 是替换(不叠加 URI),且只限 location、末尾加 /
  • 以为 proxy_pass 带不带 / 无所谓 → 决定了上游收到的 URI 是否去掉前缀。
  • 以为负载均衡默认 ip_hash → 默认是轮询,ip_hash 需显式配置。

关联

最近更新