凌峰创科服务平台

nginx如何配置双服务器实现负载均衡?

在搭建高可用或负载均衡系统时,通过Nginx配置两台服务器是实现服务冗余和流量分发的常见方案,以下将从基础配置、负载均衡策略、健康检查、故障转移等方面详细说明具体操作步骤和注意事项。

nginx如何配置双服务器实现负载均衡?-图1
(图片来源网络,侵删)

环境准备与基础配置

首先需要准备两台应用服务器(假设IP分别为192.168.1.10和192.168.1.11),并在服务器上部署相同的应用服务(如Nginx、Tomcat等),确保两台服务器独立提供服务且内容一致,然后在Nginx服务器(假设IP为192.168.1.100)上编辑配置文件,通常位于/etc/nginx/nginx.conf/etc/nginx/conf.d/load_balancer.conf

定义上游服务器组

在Nginx配置中,使用upstream模块定义两台应用服务器组成的上游组,这是负载均衡的核心,配置示例如下:

upstream backend_servers {
    server 192.168.1.10:8080;  # 第一台应用服务器
    server 192.168.1.11:8080;  # 第二台应用服务器
}

这里8080为应用服务的监听端口,需根据实际服务修改,若需为服务器设置权重(例如根据性能分配流量),可在server指令后添加weight参数,如weight=3表示权重为1的三倍。

配置负载均衡策略

Nginx支持多种负载均衡策略,需根据业务场景选择:

nginx如何配置双服务器实现负载均衡?-图2
(图片来源网络,侵删)

轮询(默认)

将请求依次分配给上游服务器,适用于服务器性能相近的场景,若配置中未指定策略,默认即为轮询,无需额外参数。

加权轮询

通过weight参数分配权重,性能更强的服务器可处理更多请求。

upstream backend_servers {
    server 192.168.1.10:8080 weight=2;  # 处理2/3流量
    server 192.168.1.11:8080 weight=1;  # 处理1/3流量
}

IP哈希

根据客户端IP的哈希值分配请求,确保同一客户端的请求始终访问同一台服务器,适用于需要会话保持的场景,配置如下:

upstream backend_servers {
    ip_hash;  # 启用IP哈希
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

注意:IP哈希可能导致流量分配不均,若某台服务器故障,其流量会集中到剩余服务器。

最少连接(least_conn)

将请求分配给当前连接数最少的服务器,适用于长连接场景(如WebSocket),需安装nginx-upstream-module模块,配置如下:

upstream backend_servers {
    least_conn;  # 启用最少连接策略
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

健康检查与故障转移

为确保流量不会转发到故障服务器,需配置健康检查,Nginx可通过max_failsfail_timeout参数实现基础健康检测:

  • max_fails:允许服务器失败的次数,默认为1。
  • fail_timeout:失败后暂停分配请求的时间,默认为10秒。

配置服务器在3次失败后暂停30秒:

upstream backend_servers {
    server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
}

若需更高级的健康检查(如HTTP状态码检测),可结合nginx_upstream_check_module模块,实现主动探测服务可用性。

配置代理服务器

server块中配置代理,将客户端请求转发至上游服务器组。

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://backend_servers;  # 转发至上游组
        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_pass指定上游组名称,proxy_set_header用于传递客户端真实IP等信息,避免应用服务器获取到Nginx的IP。

配置示例与参数说明

以下为完整配置示例,包含负载均衡、健康检查和代理设置:

# 定义上游服务器组
upstream backend_servers {
    server 192.168.1.10:8080 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 weight=1 max_fails=3 fail_timeout=30s;
    least_conn;  # 使用最少连接策略
}
# 配置代理服务器
server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://backend_servers;
        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_connect_timeout 5s;  # 连接超时时间
        proxy_read_timeout 10s;    # 读取超时时间
    }
}

关键参数说明:

参数 作用 示例
proxy_pass 指定上游服务器组或地址 proxy_pass http://backend_servers;
weight 服务器权重,默认为1 weight=2
max_fails 最大失败次数,超过则标记为不可用 max_fails=3
fail_timeout 失败后暂停时间 fail_timeout=30s
least_conn 最少连接策略,优先分配给连接数少的服务器 least_conn;
proxy_connect_timeout 代理服务器连接后端超时时间 proxy_connect_timeout 5s;

测试与优化

配置完成后,需测试负载均衡是否生效:

  1. 访问测试:多次访问http://example.com,通过服务器日志或netstat命令检查请求是否分配到两台应用服务器。
  2. 故障模拟:停用一台应用服务器,观察Nginx是否自动将流量转发至剩余服务器。
  3. 性能优化:根据服务器负载调整weight权重,或调整proxy_connect_timeoutproxy_read_timeout等超时参数,避免因超时导致请求失败。

相关问答FAQs

Q1: 如何确保两台服务器的会话一致性?
A: 若应用依赖会话(如用户登录状态),可通过以下方式实现会话保持:

  • IP哈希:在upstream块中使用ip_hash策略,确保同一客户端IP的请求始终访问同一台服务器。
  • 会话共享:使用Redis或Memcached等外部存储保存会话数据,两台服务器共享会话信息,即使请求分发到不同服务器也能保持会话一致。
  • Cookie绑定:通过proxy_cookie_pathsticky_cookie指令,将用户ID绑定到Cookie中,Nginx根据Cookie将请求转发至对应服务器。

Q2: Nginx负载均衡时如何实现HTTPS配置?**
A: 若应用服务器使用HTTP,而Nginx需要处理HTTPS,可在代理服务器上配置SSL证书,并将请求转发至上游HTTP服务器,配置示例如下:

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/cert.pem;    # SSL证书路径
    ssl_certificate_key /path/to/key.pem;  # 私钥路径
    location / {
        proxy_pass http://backend_servers;  # 转发至HTTP上游服务器
        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_set_header X-Forwarded-Proto $scheme;  # 传递协议类型
    }
}

若应用服务器本身支持HTTPS,可将proxy_pass修改为https://backend_servers,并配置上游服务器的SSL证书验证参数(如proxy_ssl_server_name on)。

分享:
扫描分享到社交APP
上一篇
下一篇