Nginx负载均衡配置策略
2010-10-13 13:55:14 阿炯
Nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态、静态页面的分离,可以按照轮询、ip哈希、URL哈希、权重等多种方式对后端服务器做负载均衡,同时还支持后端服务器的健康检查。
在负载反向代理的算法上,共有六种:轮询、ip_hash、weight、fair(第三方)、url_hash(第三方)、cookie。
轮询是默认的,每一个请求按顺序逐一分配到不同的后端服务器,如果后端服务器down掉了,则能自动剔除。Nginx默认采用round_robin加权算法。如果要选择其他的负载均衡算法,必须在upstream的配置上下文中通过配置指令ip_hash明确指定(该配置项最好放在其他server指令等的前面,以便检查server的配置选项是否合理)。
weight是设置权重,用于后端服务器性能不均的情况,访问比率约等于权重之比。
upstream freeoa {
server 172.18.0.5:81 weight=1;
servse 172.18.0.3:80 weight=5;
}
ip_hash 解决了session问题:每个请求按访问IP的hash结果分配,这样每个访客可以固定一个后端服务器。
upstream freeoa {
ip_hash;
server 172.18.0.5:81;
servse 172.18.0.3:80;
}
fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream freeoa {
server 172.18.0.5:81;
servse 172.18.0.3:80;
fair;
}
url_hash (第三方)按访问URL的hash结果来分配请求,使每个URL定向到同一个后端服务器,后端服务器为缓存时比较适用。另外,在upstream中加入hash语句后,server语句不能写入weight等其他参数。
upstream freeoa {
server squid_ip1:3128;
servse squid_ip2:3128;
hash $request_uri;
hash_method crc32;
}
upstream freeoa {
ip_hash;
server 172.18.0.5:81;down
servse 172.18.0.4:80 weight=2 max_fails=2 fail_timeout=30s;
servse 172.18.0.3:80 backup;
}
其它相关指令介绍
down 暂时不参与负载
weight 权重
max_fail 允许请求失败的次数,默认为1
fail_timeout max_fail次失败后,暂停的时间
backup 所有其他非backup机器down或者忙的时候,才请求backup,所以这台机器压力最轻。
nginx负载均衡模块ngx_http_upstream_module允许定义一组服务器,这组服务器可以被proxy_pass,fastcgi_pass和memcached_pass这些指令引用。
设置一个nginx负载均衡服务器的地址和其他参数。一个地址可以被指定为域名或IP地址,和一个可选的端口,或者被定为UNIX-domain套接字文件的路径,使用"unix:"作为前缀。如果端口没指定,则使用80端口。一个被解析到多个IP地址的域名本质上指定了多个服务器。
upstream name {...}
default:-
所属指令:http
定义一组用于实现nginx负载均衡的服务器,它们可以侦听在不同的端口。另外,可以混合使用侦听TCP与UNIX-domain套接字文件。默认情况下,请求被分散在使用加权轮询的nginx负载均衡服务器上。
语法:server 地址 [参数];
default:-
所属指令:upstream
可以定义下面的参数:
weight=number
设置服务器的权限,默认是1
max_fails=number
设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了,停机时间是fail_timeout设置的时间。默认情况下,不成功连接数被设置为1。被设置为零则表示不进行链接数统计。那些连接被认为是不成功的可以通过proxy_next_upstream, fastcgi_next_upstream,和memcached_next_upstream指令配置。http_404状态不会被认为是不成功的尝试。
fail_time=time
设置多长时间内失败次数达到最大失败次数会被认为服务器停机了服务器会被认为停机的时间长度,默认情况下,超时时间被设置为10S。
max_fails 的默认值为 1,fail_timeout 的默认值是 10s。传输失败的情形,由 proxy_next_upstream 或 fastcgi_next_upstream 指定。而且可以使用 proxy_connect_timeout 和 proxy_read_timeout 控制 upstream 响应时间。
backup
标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。当所有的非备机(non-backup)都宕机(down)或者繁忙(busy)的时候,就只使用由 backup 标注的备机。必须要注意的是,backup 不能和 ip_hash 关键字一起使用。
down
标记服务器永久停机了;与指令ip_hash一起使用。
语法:ip_hash;
default:-
所属指令:upstream
指定nginx负载均衡器组使用基于客户端ip的负载均衡算法。IPV4的前3个八进制位和所有的IPV6地址被用作一个hash key。这个方法确保了相同客户端的请求一直发送到相同的服务器上除非这个服务器被认为是停机。这种情况下,请求会被发送到其他主机上,然后可能会一直发送到这个主机上。如果nginx负载均衡器组里面的一个服务器要临时移除,它应该用参数down标记,来防止之前的客户端IP还往这个服务器上发请求。
注意:在版本1.3.2中开始支持IPV6地址,在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
语法:keepalive 连接数;
default:-
所属模块:upstream
这个指令在版本1.1.4中出现
nginx负载均衡器的活动链接数缓存。
连接数(keepalive的值)指定了每个工作进程中保留的持续连接到nginx负载均衡器缓存的最大值。如果超过这个设置值的闲置进程想链接到nginx负载均衡器组,最先连接的将被关闭。
nginx负载均衡器内置变量(Embedded Variables)
nginx负载均衡模块ngx_http_upstream_module支持下列内置变量:
$upstream_addr
保存一个服务器的IP地址和端口号或者UNIX-domain套接字文件的路径。如果在处理请求过程中使用了多个服务器,那么它们的地址将以逗号分割,例如 :“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”。如果一个内置的从一个服务器组到另一个服务器组的重定向使用X-Accel-Redirect” or error_page ,那么那些服务器组以冒号隔开,例如“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”。
$upstream_response_time
保存nginx负载均衡服务器响应时间,以毫秒计。多个响应也以逗号和冒号隔开。
$upstream_status
保存nginx负载均衡服务器响应代码。多个响应代码也以逗号或冒号隔开。
$upstream_http_
保存nginx负载均衡服务器响应头字段。例如,the “Server” response header field is made available through the $upstream_http_server variable.注意,只有最后一个服务器响应头字段被保存。
后面介绍一种基于cookie的负载均衡模块-sticky
像一个局域网的客户同时访问服务器,导致出现服务器分配不均衡,以及不能保证每次访问都粘滞在同一台服务器。如果基于cookie的, 每台电脑都会有不同的cookie,在保持长连接的同时还保证了服务器的压力均衡,nginx sticky值得推荐。
如果浏览器不支持cookie,那么sticky不生效,毕竟整个模块是给予cookie实现的。
配置nginx sticky
nginx 的upstream使用sticky,如下
upstream freeoa{
sticky;
server 192.168.100.209:80;
server 192.168.100.225:80;
}
sticky其它语法
sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];
name: 可以为任何的string字符,默认是route
domain:哪些域名下可以使用这个cookie
path:哪些路径对启用sticky,例如path/test,那么只有test这个目录才会使用sticky做负载均衡
expires:cookie过期时间,默认浏览器关闭就过期,也就是会话方式。
no_fallbackup:如果设置了这个,cookie对应的服务器宕机了,那么将会返回502(bad gateway 或者 proxy error),建议不启用
sticky expires用法
upstream freeoa {
sticky expires=1h;
server 172.18.0.209:80;
server 172.18.0.225:80;
}
注意:sticky模块不能与ip_hash同时使用。
参考链接:
Nginx学习之十二-负载均衡-加权轮询策略剖析
HttpUpstreamModule
在负载反向代理的算法上,共有六种:轮询、ip_hash、weight、fair(第三方)、url_hash(第三方)、cookie。
轮询是默认的,每一个请求按顺序逐一分配到不同的后端服务器,如果后端服务器down掉了,则能自动剔除。Nginx默认采用round_robin加权算法。如果要选择其他的负载均衡算法,必须在upstream的配置上下文中通过配置指令ip_hash明确指定(该配置项最好放在其他server指令等的前面,以便检查server的配置选项是否合理)。
weight是设置权重,用于后端服务器性能不均的情况,访问比率约等于权重之比。
upstream freeoa {
server 172.18.0.5:81 weight=1;
servse 172.18.0.3:80 weight=5;
}
ip_hash 解决了session问题:每个请求按访问IP的hash结果分配,这样每个访客可以固定一个后端服务器。
upstream freeoa {
ip_hash;
server 172.18.0.5:81;
servse 172.18.0.3:80;
}
fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream freeoa {
server 172.18.0.5:81;
servse 172.18.0.3:80;
fair;
}
url_hash (第三方)按访问URL的hash结果来分配请求,使每个URL定向到同一个后端服务器,后端服务器为缓存时比较适用。另外,在upstream中加入hash语句后,server语句不能写入weight等其他参数。
upstream freeoa {
server squid_ip1:3128;
servse squid_ip2:3128;
hash $request_uri;
hash_method crc32;
}
upstream freeoa {
ip_hash;
server 172.18.0.5:81;down
servse 172.18.0.4:80 weight=2 max_fails=2 fail_timeout=30s;
servse 172.18.0.3:80 backup;
}
其它相关指令介绍
down 暂时不参与负载
weight 权重
max_fail 允许请求失败的次数,默认为1
fail_timeout max_fail次失败后,暂停的时间
backup 所有其他非backup机器down或者忙的时候,才请求backup,所以这台机器压力最轻。
nginx负载均衡模块ngx_http_upstream_module允许定义一组服务器,这组服务器可以被proxy_pass,fastcgi_pass和memcached_pass这些指令引用。
设置一个nginx负载均衡服务器的地址和其他参数。一个地址可以被指定为域名或IP地址,和一个可选的端口,或者被定为UNIX-domain套接字文件的路径,使用"unix:"作为前缀。如果端口没指定,则使用80端口。一个被解析到多个IP地址的域名本质上指定了多个服务器。
upstream name {...}
default:-
所属指令:http
定义一组用于实现nginx负载均衡的服务器,它们可以侦听在不同的端口。另外,可以混合使用侦听TCP与UNIX-domain套接字文件。默认情况下,请求被分散在使用加权轮询的nginx负载均衡服务器上。
语法:server 地址 [参数];
default:-
所属指令:upstream
可以定义下面的参数:
weight=number
设置服务器的权限,默认是1
max_fails=number
设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了,停机时间是fail_timeout设置的时间。默认情况下,不成功连接数被设置为1。被设置为零则表示不进行链接数统计。那些连接被认为是不成功的可以通过proxy_next_upstream, fastcgi_next_upstream,和memcached_next_upstream指令配置。http_404状态不会被认为是不成功的尝试。
fail_time=time
设置多长时间内失败次数达到最大失败次数会被认为服务器停机了服务器会被认为停机的时间长度,默认情况下,超时时间被设置为10S。
max_fails 的默认值为 1,fail_timeout 的默认值是 10s。传输失败的情形,由 proxy_next_upstream 或 fastcgi_next_upstream 指定。而且可以使用 proxy_connect_timeout 和 proxy_read_timeout 控制 upstream 响应时间。
backup
标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。当所有的非备机(non-backup)都宕机(down)或者繁忙(busy)的时候,就只使用由 backup 标注的备机。必须要注意的是,backup 不能和 ip_hash 关键字一起使用。
down
标记服务器永久停机了;与指令ip_hash一起使用。
语法:ip_hash;
default:-
所属指令:upstream
指定nginx负载均衡器组使用基于客户端ip的负载均衡算法。IPV4的前3个八进制位和所有的IPV6地址被用作一个hash key。这个方法确保了相同客户端的请求一直发送到相同的服务器上除非这个服务器被认为是停机。这种情况下,请求会被发送到其他主机上,然后可能会一直发送到这个主机上。如果nginx负载均衡器组里面的一个服务器要临时移除,它应该用参数down标记,来防止之前的客户端IP还往这个服务器上发请求。
注意:在版本1.3.2中开始支持IPV6地址,在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
语法:keepalive 连接数;
default:-
所属模块:upstream
这个指令在版本1.1.4中出现
nginx负载均衡器的活动链接数缓存。
连接数(keepalive的值)指定了每个工作进程中保留的持续连接到nginx负载均衡器缓存的最大值。如果超过这个设置值的闲置进程想链接到nginx负载均衡器组,最先连接的将被关闭。
nginx负载均衡器内置变量(Embedded Variables)
nginx负载均衡模块ngx_http_upstream_module支持下列内置变量:
$upstream_addr
保存一个服务器的IP地址和端口号或者UNIX-domain套接字文件的路径。如果在处理请求过程中使用了多个服务器,那么它们的地址将以逗号分割,例如 :“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”。如果一个内置的从一个服务器组到另一个服务器组的重定向使用X-Accel-Redirect” or error_page ,那么那些服务器组以冒号隔开,例如“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”。
$upstream_response_time
保存nginx负载均衡服务器响应时间,以毫秒计。多个响应也以逗号和冒号隔开。
$upstream_status
保存nginx负载均衡服务器响应代码。多个响应代码也以逗号或冒号隔开。
$upstream_http_
保存nginx负载均衡服务器响应头字段。例如,the “Server” response header field is made available through the $upstream_http_server variable.注意,只有最后一个服务器响应头字段被保存。
后面介绍一种基于cookie的负载均衡模块-sticky
像一个局域网的客户同时访问服务器,导致出现服务器分配不均衡,以及不能保证每次访问都粘滞在同一台服务器。如果基于cookie的, 每台电脑都会有不同的cookie,在保持长连接的同时还保证了服务器的压力均衡,nginx sticky值得推荐。
如果浏览器不支持cookie,那么sticky不生效,毕竟整个模块是给予cookie实现的。
配置nginx sticky
nginx 的upstream使用sticky,如下
upstream freeoa{
sticky;
server 192.168.100.209:80;
server 192.168.100.225:80;
}
sticky其它语法
sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];
name: 可以为任何的string字符,默认是route
domain:哪些域名下可以使用这个cookie
path:哪些路径对启用sticky,例如path/test,那么只有test这个目录才会使用sticky做负载均衡
expires:cookie过期时间,默认浏览器关闭就过期,也就是会话方式。
no_fallbackup:如果设置了这个,cookie对应的服务器宕机了,那么将会返回502(bad gateway 或者 proxy error),建议不启用
sticky expires用法
upstream freeoa {
sticky expires=1h;
server 172.18.0.209:80;
server 172.18.0.225:80;
}
注意:sticky模块不能与ip_hash同时使用。
参考链接:
Nginx学习之十二-负载均衡-加权轮询策略剖析
HttpUpstreamModule
该文章最后由 阿炯 于 2022-05-25 09:26:46 更新,目前是第 2 版。