Nginx负载均衡实践,描述了Nginx在不同的负载均衡下的配置和实现方法
HTTP 负载均衡
需求
你需要将请求分配到两台或者更多的 HTTP 服务器
解决方法
在 HTTP 模块中使用
Nginx
的upstram
语法来实现 HTTP 的服务负载均衡
upstream backend_name {
server 127.0.0.1:7881 weight=1;
server 127.0.0.1:7880 weight=2;
}
server {
location / {
proxy_pass http://backend_name;
}
}
- 默认请求下
weight
值都为 1 - 当一台后端服务器不能提供服务时候,该次请求还是能切到能提供服务的服务器上面;但是在error.log 中可以看到一条错误信息
[error] 11618#0: *199 connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:7880/", host: "127.0.0.1"
- 以上配置需要放到
http
节点中才能生效
这就是一个非常简单的负载均衡配置,是不是so easy 啊~
TCP 负载均衡
需求
你需要将请求分配到两台或者更多的 TCP 服务器
解决方法
在 stream 模块中使用
Nginx
的upstram
语法来实现 TCP 的服务负载均衡
stream {
upstream mysql_read{
server 127.0.0.1:3306;
server 127.0.0.1:3307;
}
server {
listen 3305;
proxy_pass mysql_read;
}
}
stream
模块类似于http
模块, 允许你设置upstream
连接池upstream
可以定义为 Unix socket,IP
,FQDN
负载均衡策略
需求
使用负载均衡不单单是轮询请求,可以使用特定的策略来分配到不同的代理服务器上面
Round robin
轮询
轮询是默认的负载均衡策略,在使用轮询负载策略的时候,可以添加 weight
权重,权重值越大,分配的请求量就越多。
upstream backend {
server 127.0.0.1:7881 weight=1;
server 127.0.0.1:7880 weight=2;
server 127.0.0.1:7882;
}
Least connections
连接最少
最少连接是按照当前 Nginx 服务器对应的代理请求数量决定的,新请求会代理到连接最少的服务器上面;该策略还是可以配置 weight
权重。
upstream backend {
least_conn;
server backend.example.com weight=3;
server backend1.example.com;
}
Least time
Nginx Plus 平均最少请求时间
该功能只有 Nginx Plus
才支持;新的请求会代理到平均响应时间最少的服务器上面。
upstream backend {
least_time;
server backend.example.com;
server backend1.example.com;
}
Generic hash
通过配置来将请求hash到后端代理服务器上面;hash
后面必须添加参数, 可以是变量,也可以是变量和consistent
的组合。
upstream backend {
#hash consistent;
#hash "test";
hash $request_uri consistent;
server backend.example.com;
server backend1.example.com;
}
IP hash
只支持 HTTP 负载均衡,通过请求客户端的 IP 地址 前 3字节(IPv4),或者全部(IPv6) 的地址获取 hash 值;如果你要使用一般的会话一致性保证,这是一个不错的选择;该策略还是可以配置 weight
权重。
upstream backend {
ip_hash;
server backend.example.com weight=8;
server backend1.example.com weight=2;
}
连接数量限制
该功能只有 Nginx Plus
中使用
使用 max_conns
参数来限制 upstream servers
的请求数量;使用 queue
指令来设置同时在队列中的请求数量,参赛 timeout
参数限制队列中请求的超时时间;zone
指令用来设置 每个工作线程共享的信息,多少个在队列中的连接数量~
upstream backend {
zone backends 64k;
queue 750 timeout=30s;
server webserver1.example.com max_conns=25;
server webserver2.example.com max_conns=15;
}