Appearance
Nginx负载均衡
负载均衡用于从“upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求,一个最基本的upstream模块是这样的,模块内的server是服务器列表:
nginx
upstream dynamicserver {
server 172.16.44.47:9001; #tomcat 1
server 172.16.44.47:9002; #tomcat 2
server 172.16.44.47:9003; #tomcat 3
server 172.16.44.47:9004; #tomcat 4
}在upstream模块配置完成后,要让指定的访问反向代理到服务器列表:
nginx
#其他页面反向代理到tomcat容器
location ~.*$ {
index index.jsp index.html;
proxy_pass http://dynamicserver;
}这就是最基本的负载均衡实例,但这不足以满足实际需求;目前Nginx服务器的upstream模块支持6种方式的分配;
点击展开整理后的配置
nginx
upstream dynamicserver {
server 192.168.64.1:9001; #tomcat 1
server 192.168.64.1:9002; #tomcat 2
server 192.168.64.1:9003; #tomcat 3
server 192.168.64.1:9004; #tomcat 4
}
server {
server_name www.xk857.com;
default_type text/html;
charset utf-8;
location ~ .*$ {
index index.jsp index.html;
proxy_pass http://dynamicserver;
}
}常用参数
| 参数 | 描述 |
|---|---|
| server | 反向服务地址 加端口 |
| weight | 权重 |
| fail_timeout | 与max_fails结合使用。 |
| max_fails | 设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了 |
| max_conns | 允许最大连接数 |
| fail_time | 服务器会被认为停机的时间长度,默认为10s |
| backup | 标记该服务器为备用服务器,当主服务器停止时,请求会被发送到它这里。 |
| down | 标记服务器永久停机了 |
| slow_start | 当节点恢复,不立即加入 |
负载均衡策略
在这里,只详细说明Nginx自带的负载均衡策略,第三方不多描述。
| 负载策略 | 描述 |
|---|---|
| 轮询 | 默认方式 |
| weight | 权重方式 |
| ip_hash | 依据ip分配方式 |
| least_conn | 最少连接方式 |
| fair(第三方) | 响应时间方式 |
| url_hash(第三方) | 依据URL分配方式 |
实战示例
1.轮训:最基本的方法,上文示例的就是轮训
nginx
upstream 随便起名 {
server 192.168.64.1:9001; #tomcat 1
server 192.168.64.1:9002; #tomcat 2
server 192.168.64.1:9003; #tomcat 3
server 192.168.64.1:9004; #tomcat 4
}2.权重:在轮询策略的基础上指定轮询的几率
nginx
upstream 随便起名 {
server 192.168.64.1:9001 weight=2; #tomcat 1
server 192.168.64.1:9002; #tomcat 2
server 192.168.64.1:9003; #tomcat 3
server 192.168.64.1:9004; #tomcat 4
}3.ip_hash:基于客户端IP的分配方式,能确保了相同客户端的请求发送到相同的服务器
nginx
upstream 随便起名 {
ip_hash; #保证每个访客固定访问一个后端服务器
server 192.168.64.1:9001 weight=2; #tomcat 1
server 192.168.64.1:9002; #tomcat 2
server 192.168.64.1:9003; #tomcat 3
server 192.168.64.1:9004; #tomcat 4
}4.least_conn:把请求转发给连接数较少的后端服务器,可以达到更好的负载均衡效果
nginx
upstream 随便起名 {
ip_hash; #保证每个访客固定访问一个后端服务器
server 192.168.64.1:9001 weight=2; #tomcat 1
server 192.168.64.1:9002; #tomcat 2
server 192.168.64.1:9003; #tomcat 3
server 192.168.64.1:9004; #tomcat 4
}重试策略
max_fails=3 fail_timeout=60s代表在60秒内请求某一应用失败3次,认为该应用宕机,后等待60秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的那一台,时间到后再有请求进来继续尝试连接宕机应用且仅尝试1次,如果还是失败,则继续等待60秒...以此循环,直到恢复。
nginx
upstream dynamicserver {
server 192.168.64.1:9001 fail_timeout=60s max_fails=3; #Server A
server 192.168.64.1:9002 fail_timeout=60s max_fails=3; #Server B
}重试配置
有时候我们系统出现500等异常的情况下,希望nginx能够到其他的服务器进行重试,我们可以配置哪些错误码才进行重试,proxy_next_upstream项定义了什么情况下进行重试
nginx
Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
Default: proxy_next_upstream error timeout;
Context: http, server, location默认情况下,当请求服务器发生错误或超时时,会尝试到下一台服务器,还有一些其他的配置项如下:
| 错误状态 | 描述 |
|---|---|
| error | 与服务器建立连接,向其传递请求或读取响应头时发生错误; |
| timeout | 在与服务器建立连接,向其传递请求或读取响应头时发生超时; |
| invalid_header | 服务器返回空的或无效的响应; |
| http_500 | 服务器返回代码为500的响应; |
| http_502 | 服务器返回代码为502的响应; |
| http_503 | 服务器返回代码为503的响应; |
| http_504 | 服务器返回代码504的响应; |
| http_403 | 服务器返回代码为403的响应; |
| http_404 | 服务器返回代码为404的响应; |
| http_429 | 服务器返回代码为429的响应(1.11.13); |
| non_idempotent | 通常,请求与 非幂等 方法(POST,LOCK,PATCH)不传递到请求是否已被发送到上游服务器(1.9.13)的下一个服务器; 启用此选项显式允许重试此类请求; |
| off | 禁用将请求传递给下一个服务器。 |
示例:配置了500等错误的时候会进行重试
nginx
upstream dynamicserver {
server 192.168.64.1:9001 fail_timeout=60s max_fails=3; #tomcat 1
server 192.168.64.1:9002 fail_timeout=60s max_fails=3; #tomcat 2
}
server {
server_name www.xk857.com;
default_type text/html;
charset utf-8;
location ~ .*$ {
index index.jsp index.html;
proxy_pass http://dynamicserver;
#下一节点重试的错误状态
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}备用节点
备用节点在主服务器正常工作时处于待命状态,不处理请求。只有当主服务器故障或不可用时,备用节点才会接管请求。
在 Nginx 的负载均衡配置中,可以通过 backup 参数将某个服务器标记为备用节点。
nginx
http {
upstream backend {
server 192.168.1.101; # 主服务器
server 192.168.1.102; # 主服务器
server 192.168.1.103 backup; # 备用节点
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}