Nginx 负载均衡详解
提示
核心:将客户端请求均匀分配到多个后端服务器(比如:nodejs、php、java 等后端服务器),以此提升系统吞吐量、可靠性和容灾能力 本质:在 Nginx 服务器(作为反向代理)和后端业务服务器(如 Tomcat、Node.js)之间,建立一层请求分发机制,避免单台服务器过载,并实现故障自动切换。
实现原理
通过 http 块中的 upstream 模块定义后端服务器集群,再在 server 块的 location 中通过 proxy_pass 指向该集群,即可开启负载均衡。
shell
http {
# 1. 定义后端服务器集群(名称可自定义,如 my_server_group)
upstream my_server_group {
# 后端服务器地址+端口,weight 为权重(默认1,值越大分配到的请求越多)
server 192.168.1.101:8080 weight=5;
server 192.168.1.102:8080 weight=3;
server 192.168.1.103:8080; # 权重默认为1
}
# 2. 定义前端监听(客户端请求入口)
server {
listen 80; # Nginx 监听端口
server_name localhost; # 访问域名
# 3. 匹配请求并转发到后端集群
location / {
proxy_pass http://my_server_group; # 指向 upstream 定义的集群名称
# 可选:设置反向代理的基础头信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}策略一:默认的轮询
将每个请求按照请求的先后顺序平均分配到不同的服务器上
shell
http {
upstream mypros {
server 192.168.76.100:80;
server 192.168.76.129:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://mypros;
proxy_set_header Host $proxy_host;
}
}
}策略二:权重轮询
设置轮询的访问几率,当接受到四个请求时,会分配给 101 服务器1个请求,分配给 102 服务器3个请求
shell
upstream my_server_group {
server 192.168.1.101:8080 weight=1;
server 192.168.1.102:8080 weight=3;
}策略三:ip哈希轮询
按照客户端IP进行分配,同一个ip只能访问同一台终端服务器,解决 session 跨域不共享的问题
shell
upstream my_server_group {
ip_hash; # 开启IP哈希策略
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}策略四:最少连接轮询
将请求转发给连接数较少的服务器上
shell
upstream my_server_group {
least_conn; # 开启最少连接策略
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}策略五:最短时间轮询
按照服务器端的响应时间来分配请求,响应时间短的优先分配。
shell
upstream my_server_group {
fair; # 开启最短时间轮询
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}策略六:url 哈希轮询
按照访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,需要配合缓存用
shell
upstream my_server_group {
hash $request_uri; # 开启 url 哈希
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}高级特性:健康检查与容错
为避免将请求转发到故障服务器,Nginx 提供健康检查机制,自动剔除故障节点,恢复后重新加入集群。
shell
upstream my_server_group {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
# 健康检查核心参数
max_fails 3; # 允许请求失败的最大次数(默认1),超过则服务器被标记为 “不可用”。
fail_timeout 10s; # 服务器被标记为 “不可用” 后,将在该时间内不再接收请求,过了这个时间重新尝试(默认10s)
proxy_next_upstream error timeout invalid_header; # 定义哪些情况会触发 “放弃当前服务器,转发到下一台”,常见值包括 error(连接错误)、timeout(请求超时)、invalid_header(响应头无效)。
}注意
- 后端服务需无状态:除 IP 哈希场景外,后端服务器不能存储会话信息(如登录态),否则请求分配到不同服务器会导致会话丢失。建议使用 Redis 等工具统一存储会话。
- 权重配置需合理:根据服务器性能(CPU、内存、带宽)调整 weight,避免性能差的服务器承担过高负载。
- 监控与日志:开启 Nginx 访问日志(access_log)和错误日志(error_log),便于排查负载不均衡或后端故障问题。
- 动静分离结合:可将静态资源(图片、CSS、JS)由 Nginx 直接处理,动态请求(如接口)转发到后端服务器,进一步提升性能。
