nginx负载均衡及详细配置
2025-08-22 16:06:01,

一、 nginx负载均衡策略

Nginx作为一种高效的Web服务器和反向代理服务器,广泛应用于网站的负载均衡中。负载均衡是指将接收到的网络请求分配到多个后端服务器上,这样可以提高网站的处理能力,避免单个服务器过载,同时也提高了网站的可用性和可靠性。

1.1 基本负载均衡策略

  • 轮询(Round Robin) :这是最基本的负载均衡方法,也是Nginx默认的策略。它按照请求的顺序依次将请求分配给每个服务器。如果某个服务器宕机,它会自动被排除在分配队列之外
  • 权重(Weighted Round Robin) :在轮询的基础上,可以为每个服务器设置一个权重,根据权重的不同,服务器被分配请求的概率也不同。权重越高,分配到的请求越多
  • IP哈希(IP Hash) :通过客户端的IP地址进行哈希计算,然后根据哈希值将请求分配给特定的服务器。这种方法可以确保来自同一IP地址的客户端用户会被分配到同一台服务器,适用于需要会话保持的应用场景
  • 最少连接数(Least ConneC++tions) :将请求分配给当前连接数最少的服务器。这种策略适用于处理时间不均匀的请求,可以避免某些长时间占用连接的请求导致服务器负载过高

1.轮询:每个请求会按时间顺序逐一分配到不同的后端服务器

参数 备注
fail_timeout 与max_fails结合使用。
max_fails 设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了
fail_time 服务器会被认为停机的时间长度,默认为10s
backup 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里
down 标记服务器永久停机了,用于明确排除故障或维护中的服务器,避免无效请求

注意:

  • 在轮询中,如果服务器down掉了,会自动剔除该服务器。
  • 缺省配置就是轮询策略。
  • 此策略适合服务器配置相当,无状态且短平快的服务使用。
upstream backend {
    server backend1.example.com fail_timeout=60s max_fails=2;
    server backend2.example.com fail_timeout=60s max_fails=2;
}

max_fails=2; 表示如果在 fail_timeout 时间段内,Nginx 向某一个上游服务器发起请求失败次数达到 2 次,则认为该服务器不可用。
fail_timeout=60s; 有两个作用:首先,它定义了上述 max_fails 中提到的时间窗口长度,在这个例子中是 60 秒;其次,一旦某个上游服务器被认为不可用,Nginx 将会在接下来的 60 秒内不再向这台服务器转发任何请求。
这种配置有助于提高服务的可靠性,通过自动禁用那些看起来已经失效的服务器,并在一段时间后重新尝试连接它们,从而避免将客户端请求发送到不健康的服务器上。
在这个配置中,如果 backend1.example.com 在 60 秒内连续失败 2 次请求,Nginx 会暂时停止向它转发请求 60 秒,并仅将请求转发给 backend2.example.com。同样地,对于 backend2.example.com 也会应用相同的规则。这样的设置可以确保即使有一个服务器出现问题,用户仍然能够被导向到另一个可用的服务器。

2.权重:通过 weight 参数为服务器分配权重(weight=1 为默认值),权重越高分配的请求越多

  • 权重越高分配到需要处理的请求越多。
  • 此策略可以与least_conn和ip_hash结合使用。
  • 此策略比较适合服务器的硬件配置差别比较大的情况;例如: 虚拟机和物理界混合部署

注意:

upstream backend {
    server 192.168.1.1:80 weight=10;  # 高性能服务器,处理更多请求
    server 192.168.1.2:80 weight=5;   # 低性能服务器,处理较少请求
}

3.IP哈希:根据客户端 IP 地址进行哈希计算,确保同一 IP 的请求始终转发到同一台服务器

注意:

  • 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)
  • ip_hash不能与backup同时使用
  • 此策略适合有状态服务,比如session
  • 当有服务器需要剔除,必须手动down掉
  • 需要会话保持的场景(如电商购物车、用户登录状态),但服务器故障时可能导致会话丢失
upstream backend { 
ip_hash; # 启用 IP 哈希策略 
server 192.168.1.1:80; 
server 192.168.1.2:80; 
}
------------------------------------------------------
upstream fileserver {
		ip_hash;
        server 192.19.31.91:32100 fail_timeout=60s max_fails=2;
        server 192.19.31.92:32100 fail_timeout=60s max_fails=2;
		keepalive 100;
    }

4.最少连接数:将请求转发给当前连接数最少的服务器,适应流量波动

注意:

  • 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
upstream backend {
    least_conn;  # 启用最少连接策略
    server 192.168.1.1:80;
    server 192.168.1.2:80;
}

加权最少连接数:在最少连接的基础上,通过 weight 参数为服务器设置处理能力权重,均衡更精准

  • 公式(当前连接数) / (weight),值越小的服务器优先分配请求。

注意:

  • 适用于服务器性能有差异,且需动态均衡连接数的场景(如混合云部署)
upstream backend {
    least_conn;
    server 192.168.1.1:80 weight=10;  # 高配服务器,权重更高,允许处理更多连接
    server 192.168.1.2:80 weight=5;   # 低配服务器,权重较低,保护其负载
}

1.2 第三方策略

  • fair:根据后端服务器的响应时间来分配请求,响应时间短的服务器优先分配
  • url_hash:根据访问URL的哈希结果来分配请求,确保同一个URL请求总是被分配到同一台服务器,有助于提高缓存命中率

5.fair(公平策略):将请求转发给响应速度最快的服务器,优化用户体验

注意:原理(非官方标准策略,需 upstream_fair模块)

  • 需要第三方插件
  • 将请求转发给响应速度最快的服务器,优化用户体验。
  • 动态感知服务器处理能力,适合请求耗时差异大的场景。

6.URL哈希:对请求的 URL 进行哈希计算,相同 URL 的请求始终转发到同一台服务器(常用于缓存场景)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取

注意:

  • 依赖模块:需加载 ngx_http_upstream_hash_module(Nginx 官方模块,编译时需启用)
upstream backend {
    hash $request_uri consistent;  # 对 URL 哈希,`consistent` 启用一致性哈希(减少服务器变动时的哈希重分布)
    server 192.168.1.1:80;
    server 192.168.1.2:80;
}

1.3 策略对比

通过合理选择负载均衡策略,Nginx 可高效分配流量,提升后端服务的可用性和性能

策略 核心逻辑 优势场景 缺点
轮询 顺序分配 服务器性能一致 不考虑负载状态
加权轮询 按权重分配 服务器性能不同 静态配置,不动态调整
最少连接 连接数最少优先 长连接或请求耗时不均 未考虑服务器性能差异
加权最少连接 连接数与权重结合 性能差异化且需动态均衡 配置较复杂
IP 哈希 客户端 IP 绑定 会话保持 服务器故障时会话可能丢失
URL 哈希 URL 绑定服务器 资源缓存加速 需额外模块,仅适用特定场景

二、 nginx配置

2.1 基本命令

nginx -t             检查配置文件是否有语法错误
nginx -s reload       热加载,重新加载配置文件
nginx -s stop         快速关闭
nginx -s quit         等待工作进程处理完成后关闭

若在Linux系统可以配置nginx.service文件

[Unit]
 
Description=Nginx Web Server
 
After=network.target
 
[Service]
 
Type=forking
 
ExecStart=/usr/local/nginx/sbin/nginx  -c /usr/local/nginx/conf/nginx.conf    #修改nginx目录
 
ExecReload=/usr/local/nginx/sbin/nginx -s reload
 
ExecStop=/usr/local/nginx/sbin/nginx -s stop
 
KillMode=process

Restart=always
 
RestartSec=5s

StartLimitInterval=0
 
[Install]
WantedBy=multi-user.target
启动安装(开机自启动)nginx
sudo systemctl daemon-reload   //重新加载systemd服务
sudo systemctl enable nginx.service
sudo systemctl start nginx.service
    
systemctl status nginx.service
systemctl restart nginx.service

2.2 nginx默认配置详解

user nginx;   # Nginx 工作进程运行的用户(默认:nginx,可改为其他用户)
worker_processes auto;   # 工作进程数,通常设为 CPU 核心数(默认:1,建议设为 auto 或实际核心数)
error_log /var/log/nginx/error.log;    #错误日志
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;    # 定义每个工作进程的最大连接数。此处设置为 1024,表示每个进程最多处理 1024 个并发连接
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
#定义日志格式 main,用于记录访问日志
#$remote_addr:客户端 IP 地址
# $time_local:请求时间。
#$request`:客户端请求的原始行(如 `GET /index.HTML HTTP/1.1)
#$status:响应状态码(如 200、404)
#$body_bytes_sent:发送给客户端的字节数(不包括响应头)
#$http_referer:请求来源页面
#$http_user_agent:客户端浏览器标识
#$http_x_forwarded_for:代理链中的客户端 IP(用于反向代理场景)

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;    #启用高效文件传输模式(直接从磁盘发送文件到网络)
    tcp_nopush          on;    #优化 TCP 数据传输(结合使用可减少延迟)
    tcp_nodelay         on;    #优化 TCP 数据传输(结合使用可减少延迟)
    keepalive_timeout   65;    #设置客户端连接保持时间(单位:秒),减少 TCP 握手开销
    types_hash_max_size 2048;  #定义 MIME 类型哈希表的大小,避免哈希冲突

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;   #加载 /etc/nginx/conf.d/ 目录下的所有 .conf文件。通常用于组织多个虚拟主机或模块化配置


#作用:定义监听 80 端口的 HTTP 服务器
    server {
        listen       80 default_server;   #监听 IPv4 的 80 端口,并作为默认服务器(未匹配其他 `server_name` 时使用)
        listen       [::]:80 default_server;  #监听 IPv4 的 80 端口,并作为默认服务器(未匹配其他 `server_name` 时使用)
        server_name  _;   # _ 表示通配符,匹配所有未指定的域名
        root         /usr/share/nginx/html;   #设置网站根目录,静态文件(如 `index.html`)需放在此目录下
        
     
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;   #  加载默认服务器的额外配置文件(通常用于覆盖或扩展默认配置)


#作用:定义根路径 `/` 的处理规则。当前为空,表示使用默认行为(返回 `root` 目录下的文件)。
#扩展建议:可在此添加代理、重定向或静态文件处理逻辑
        location / {
        }


#  定义 404 错误页面为 `/404.html`。`location = /40x.html` 表示精确匹配 `/40x.html` 路径(需确保文件存在)
        error_page 404 /404.html;
            location = /40x.html {
        }
#  定义 5xx 错误页面为 `/50x.html`(如服务器内部错误、网关错误等)。
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

# 启用 HTTPS 服务(注释掉的部分需要取消注释并配置)
#关键配置
#listen 443 ssl http2;  监听 443 端口并启用 SSL/TLS 和 HTTP/2。
#ssl_certificate 和 ssl_certificate_key指定 SSL 证书和私钥路径。
#ssl_ciphers: 定义加密套件(PROFILE=SYSTEM 表示使用系统默认配置)。
#ssl_prefer_server_ciphers on;   优先使用服务器端的加密套件


#TLS 服务器配置(注释部分)
# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}



部分详细参数

https://www.cnblogs.com/hanease/p/15890509.html 参考

upstream backend {
    server 192.168.1.1:80 weight=10;  # 高性能服务器,处理更多请求
    server 192.168.1.2:80 weight=5;   # 低性能服务器,处理较少请求
}
0