Skip to content

负载均衡

sh
upstream demo_server{
	server 192.168.0.2:8001;
  server 192.168.0.3:8001;
  server 192.168.0.4:8001;
}

upstream demo_server {
	server 192.168.0.2:8001 weight=1;
  server 192.168.0.3:8001 weight=2;
  server 192.168.0.4:8001 weight=3;
}

location /balance/ {
	proxy_pass http://demo_server;
}

负载均衡算法

哈希算法

hash

sh
# 上下文:upstream

# 语法
# key一般为一个变量,如$request_uri
hash key [consistent];

示例

sh
upstream demo_server{
	server 192.168.0.2:8001;
  server 192.168.0.3:8001;
  server 192.168.0.4:8001;
}

location /balance/ {
	proxy_pass http://demo_server;
}

ip_hash

根据客户端IP地址进行hash运算

sh
# 上下文:upstream

# 语法
ip_hash;

示例

sh
upstream demo_server{
	ip_hash;
	server 192.168.0.2:8001;
  server 192.168.0.3:8001;
  server 192.168.0.4:8001;
}

location /balance/ {
	proxy_pass http://demo_server;
}

最少连接数算法 least_conn

从上游服务器,挑选一台当前已建立连接数最少的分配请求,极端情形下退化为轮询算法。

sh
# 上下文:upstream

# 语法
least_conn;

zone

夸worker子进程共享内存,用于记录Nginx与上游服务器的连接数。

sh
# 上下文:upstream

# 语法
zone name [size];

示例

sh
upstream demo_server{
	least_conn;
	zone share 10M;
	server 192.168.0.2:8001;
  server 192.168.0.3:8001;
  server 192.168.0.4:8001;
}

location /balance/ {
	proxy_pass http://demo_server;
}

容错机制

一般是只Nginx由于各种原因迟迟未收到上游服务器响应时的处理机制。

proxy_next_upstream

上游服务器出现异常情况时转发。

sh
# 上下文:http server location

# 语法
# 也就是说满足下面任何一种情况就会转发,off禁止转发
proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | noidempotent | off;

# 默认值
proxy_next_upstream error timeout;

可选参数

可选参数含义
error向上游服务器传输请求或读取响应头发生错误
timeout向上游服务器传输请求或读取响应头发生超时
invalid_header上游服务器返回无效的响应
http_500http响应状态码为500时等
non_idempotent非幂等请求失败是是否需要转发下一台上游服务器,幂等请求是指每次请求都返回同意的内容,非幂等就是不一样,一般post请求都是非幂等的。
off禁用请求失败转发功能,直接将上游服务器结果返回给客户端

proxy_next_upstream_timeout

上游服务器出错的时候需要等待多久才层再次转发给别的上游服务器,0代表无限等待。

sh
# 上下文:http server location

# 语法
proxy_next_upstream_timeout times;

# 默认值
proxy_next_upstream_timeout 0;

proxy_next_upstream_tries

上游服务器出错的时候可以转发几次给别的上游服务器,0代表不限制转发次数。

sh
# 上下文:http server location

# 语法
proxy_next_upstream_tries number;

# 默认值
proxy_next_upstream_tries 0;

proxy_read_timeout

一定时间内必须把数据从上游服务器读回来。

sh
# 上下文:http server location

# 语法
proxy_read_timeout time;

# 默认值
proxy_read_timeout 5;

proxy_intercept_errors

上游服务器响应码大于300时,如果是off是直接将上游响应返回给客户端,如果是on按照error_page处理。和proxy_next_upstream不能同时使用。

sh
# 上下文:http server location

# 语法
proxy_intercept_errors on | off;

# 默认值
proxy_intercept_errors on;