一. 介绍
这篇文章是介绍如何配置nginx的负载均衡以及几种负载均衡策略的用法,其实实现起来非常之简单,使用upstream
块就能做到,不多说,我们直接上配置。
二. 负载均衡配置
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
# 设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#设定负载均衡的服务器列表
upstream backend1 {
#weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.8.101:8080 weight=5;
server 192.168.8.102:8080 weight=1;
server 192.168.8.103:8080 weight=6;
}
upstream backend2 {
#weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.8.201:8080 weight=1;
server 192.168.8.202:8080 weight=6;
}
# 设定虚拟主机配置
server {
# 侦听80端口
listen 80;
# 定义使用什么虚拟主机地址访问,可以填写多个值,使用空格分开,支持通配符和正则
server_name localhost;
# 定义服务器的默认网站根目录位置,支持相对路径和绝对路径,此处html为相对路径,等同于${NGINX_HOME}/html
root html;
# 定义首页索引文件的名称
index index.php index.html index.htm;
# 设定本虚拟主机的访问日志
access_log logs/nginx.access.log main;
error_log logs/quancha.error.log;
#对以/static/开始的uri请求进行负载均衡
location ^~ /static/ {
#请求转向backend1定义的服务器列表
proxy_pass http://backend1;
# 省略一些反向代理的配置
# ...
}
# 对通用请求进行负载均衡
location / {
#请求转向backend2定义的服务器列表
proxy_pass http:/backend2;
# 省略一些反向代理的配置
# ...
}
}
}
三. 负载均衡策略
Nginx的负载均衡策略可以分为两大类:内置策略和扩展策略。
在最新的Nginx版本中,常见的几种内置策略包含轮询
、加权轮询weight
、ip_hash
、least_conn
、least_time
和普通hash和一致性hash
,在默认的情况下这两种策略是编译进nginx内核中的,只需在nginx配置中指明即可启用。
扩展策略有很多类,fair
、url_hash
。
- 轮询(默认)
每个请求按顺序逐一分配到不同的后端服务器处理,如果服务器down掉,会自动剔除。 - 加权轮询weight
指定轮询到的几率,访问比率和weight成正比,这种策略适用于后端服务器性能不均的场景,为性能更优的服务器设置更大的权重weight。 - ip_hash
根据每个请求的来源IP信息做hash处理后的结果分配服务器,这种策略可以将同一个IP来源的请求固定分配到同一台机器,可以用于解决session一致性问题。upstream backend { # 可选项:ip_hash、least_conn、least_time... ip_hash; server 192.168.8.101:8080; server 192.168.8.102:8080; # ... }
- least_conn
将请求分配给活跃连接数最小的后端服务器,如果存在多个这样的节点,将按照加权轮询算法处理。 - least_time
将请求分配给平均响应时间最短和活跃连接数最小的后端服务器,如果存在多个这样的节点,将按照加权轮询算法处理。 - 普通hash和一致性hash
语法:hash key [consistent];
- 普通hash
不指定consistent
参数,采用普通hash,使用这种策略时,nginx会基于key
值通过内部算法计算出客户机-服务器映射表,key可以包含文本、变量及其组合。注意,从服务器列表中添加或删除节点可能会导致大多数的keys值需要重新映射到不同的服务器。upstream backend { # key设为$request_uri,将按照请求uri映射到具体某个服务器。 hash $request_uri; server 192.168.8.101:8080; server 192.168.8.102:8080; # ... }
- 一致性hash
如果指定了consistent
参数,则采用ketama一致哈希算法
(点击这里了解)。该算法确保了在从服务器列表中添加或删除节点时,只有少数keys需要重新映射到不同的服务器。这有助于为缓存服务器实现更高的缓存命中率。
- 普通hash
- fair
根据每个后端服务器的响应时间判断负载情况,将请求分配到响应时间最短的服务器,也就是负载最小的节点。 - url_hash
通过将请求url做hash处理后的结果分配后端服务器,这种策略可以将相同的url分配到同一个服务器处理,经常用于做静态资源缓存。
四. upstream相关参数
- server:负载均衡的后端服务器地址加端口号。
upstream backend {
# server host:port
server 192.168.8.101:8080;
server 192.168.8.102:8080;
# ...
}
- weight:设置服务器权重,默认值为1。
upstream backend {
# server host:port
server 192.168.8.101:8080 weight=5;
server 192.168.8.102:8080 weight=10;
# ...
}
- max_fails:判断后端服务器访问失败多少次后认为已经down掉,主动剔除。
upstream backend {
# server host:port
server 192.168.8.101:8080 max_fails=3;
server 192.168.8.102:8080 max_fails=5;
# ...
}
- fail_timeout:后端服务器被剔除后重新探测的时间。
upstream backend {
# server host:port
server 192.168.8.101:8080 max_fails=3 fail_timeout=30s;
server 192.168.8.102:8080 max_fails=5;
# ...
}
- backup:将服务器标记为备份服务器。当主服务器不可用时,它将会处理请求。
upstream backend {
# server host:port
server 192.168.8.101:8080;
server 192.168.8.102:8080;
# 在其他主服务器可用时,192.168.8.103服务器不参与负载均衡。
server 192.168.8.103:8080 backup;
# ...
}
-
max_conns:允许后端服务器的最大并发连接数,默认值为0表示没有限制。
如果启用了idle keepalive connections、多个工作进程(multiple worker)和共享内存(shared memory),代理服务器活跃和空闲连接的总数可能会超出max_conns的值。
-
slow_start:当节点恢复,不立即加入,而是等待slow_start后加入服务对列。
The parameter cannot be used along with the hash and ip_hash load balancing methods.
该参数不能在hash和ip_hash策略下使用。 -
down:将服务器标记为永久不可用。
upstream backend {
# server host:port
server 192.168.8.101:8080;
server 192.168.8.102:8080;
# 192.168.8.103服务器不参与负载均衡。
server 192.168.8.103:8080 down;
# ...
}
参考
- 解析 Nginx 负载均衡策略
这篇文章写的非常好,着重分析了内置策略的源码,并且对各种负载均衡策略做了对比测试,很有参考价值。 - 官方文档:Module ngx_http_upstream_module