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

环境准备与基础配置
首先需要准备两台应用服务器(假设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支持多种负载均衡策略,需根据业务场景选择:

轮询(默认)
将请求依次分配给上游服务器,适用于服务器性能相近的场景,若配置中未指定策略,默认即为轮询,无需额外参数。
加权轮询
通过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_fails和fail_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; |
测试与优化
配置完成后,需测试负载均衡是否生效:
- 访问测试:多次访问
http://example.com,通过服务器日志或netstat命令检查请求是否分配到两台应用服务器。 - 故障模拟:停用一台应用服务器,观察Nginx是否自动将流量转发至剩余服务器。
- 性能优化:根据服务器负载调整
weight权重,或调整proxy_connect_timeout、proxy_read_timeout等超时参数,避免因超时导致请求失败。
相关问答FAQs
Q1: 如何确保两台服务器的会话一致性?
A: 若应用依赖会话(如用户登录状态),可通过以下方式实现会话保持:
- IP哈希:在
upstream块中使用ip_hash策略,确保同一客户端IP的请求始终访问同一台服务器。 - 会话共享:使用Redis或Memcached等外部存储保存会话数据,两台服务器共享会话信息,即使请求分发到不同服务器也能保持会话一致。
- Cookie绑定:通过
proxy_cookie_path或sticky_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)。
