Nginx负载均衡

负载均衡核心

一句话定义

将用户请求均匀分发到多台后端服务器,共同承载流量。

三大优势

  • 提高可用性:单台宕机,流量自动切换至正常服务器,避免单点故障。

  • 提高扩展性:通过增加服务器节点应对更高并发。

  • 提升性能:避免单一服务器过载,提供流畅用户体验。

四大负载均衡策略(核心对比)

“轮询默认人人有,最少连接挑轻的,IP哈希绑用户,权重强弱配流量。”

策略名称

配置指令

核心原理

适用场景

轮询

默认,无需配置

按顺序轮流分发,不考虑服务器负载

服务器性能都差不多的无状态应用。

最少连接

least_conn;

分发到当前活动连接数最少的服务器

请求处理时间差异大或长连接服务(如WebSocket)

IP哈希

ip_hash;

根据客户端IP算哈希,同一IP永远访问同一台服务器

需要会话保持(如:购物车、登录状态)的场景

权重

weight=数字

给服务器设置数字权重,数字越大,分到的请求越多

服务器性能不均衡,高性能节点分担更多

备用服务器

backup

标记为备用,仅当所有非备用服务器不可用时才启用

提供高可用冗余,保证服务兜底

负载均衡配置核心指令

upstream 块

  • 一句话总结:定义后端服务器集群,供 proxy_pass 调用。

  • 示例:

     upstream backend {
         server backend1.example.com;
         server backend2.example.com;
     }

server 指令(节点参数)

  • 一句话总结:定义集群中的单个后端节点,并通过参数控制流量分发与健康检查。

  • 核心参数示例:

     server 192.168.1.10:80 weight=3 max_fails=3 fail_timeout=30s backup down;
    • weight=3:权重3,性能强的多分流量。

    • max_fails=3 + fail_timeout=30s:30秒内失败3次则标记为不可用。

    • backup:备用节点,主节点全挂才启用。

    • down:永久下线(维护时用)。

ip_hash

  • 一句话总结:基于客户端IP哈希,确保同一客户端始终访问同一台后端服务器(会话保持)。

  • 关键限制:不能与 weight 共用;节点下线需用 down 标记,不可直接删除配置。

  • 示例:

     upstream backend {
         ip_hash;
         server 192.168.1.10:80;
         server 192.168.1.11:80 down;  # 下线需标记,不可删除
     }

least_conn

  • 一句话总结:将请求分发给当前活动连接数最少的后端服务器。

  • 示例:

     upstream backend {
         least_conn;
         server 192.168.1.10:80;
         server 192.168.1.11:80;
     }

5. 日志变量($upstream_*)

  • 一句话总结:在访问日志中记录负载均衡详细信息(如转发地址、响应时间、状态码)。

  • 常用变量:

     log_format main '... $upstream_addr | $upstream_status | $upstream_response_time';

反向代理配套指令

proxy_pass

  • 一句话总结:将请求转发给指定的后端URL或 upstream 集群。

  • 示例:proxy_pass http://backend;

proxy_set_header

  • 一句话总结:修改或添加转发给后端的请求头(必须配置Host和真实IP)。

  • 示例:

     proxy_set_header Host $host;
     proxy_set_header X-Real-IP $remote_addr;

proxy_method

  • 一句话总结:强制修改转发时的HTTP方法(如GET改POST)。

  • 示例:proxy_method POST;

proxy_hide_header

  • 一句话总结:隐藏上游响应中指定的头部,不转发给客户端(默认隐藏Date、Server等)。

  • 示例:proxy_hide_header Cache-Control;

proxy_pass_header

  • 一句话总结:允许转发默认被禁止的响应头(与 proxy_hide_header 相反)。

  • 示例:proxy_pass_header X-Accel-Redirect;

proxy_pass_request_body / proxy_pass_request_headers

  • 一句话总结:控制是否转发请求体(包体)和请求头,默认均为on。

  • 示例:proxy_pass_request_body off;

proxy_redirect

  • 一句话总结:重写上游返回的 Location 重定向地址,防止客户端访问内部地址。

  • 示例(将内部地址替换为公网地址):

     proxy_redirect http://内部地址/ http://公网地址/;

proxy_next_upstream

  • 一句话总结:当与当前后端通信出现指定错误(超时、5xx状态码等)时,自动重试下一台后端。

  • 示例:

     proxy_next_upstream error timeout http_500 http_502 http_503;

核心配置模板(带精简注释)

 http {
     upstream backend_pool {
         # 策略(选其一):默认轮询 | least_conn; | ip_hash;
         least_conn;  # 例:最少连接策略
 ​
         # 后端节点定义
         server 192.168.1.10:80 weight=3 max_fails=2 fail_timeout=30s;
         server 192.168.1.11:80;               # 默认权重1
         server 192.168.1.12:80 backup;        # 备用
     }
 ​
     server {
         listen 80;
         location / {
             proxy_pass http://backend_pool;   # 转发到集群
 ​
             # 必配头信息
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 ​
             # 可选:失败重试
             proxy_next_upstream error timeout http_500 http_502;
 ​
             # 可选:重写重定向
             proxy_redirect http://internal/ http://public/;
         }
     }
 }