内容纲要

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 同时使用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注