Skip to content

Nginx 负载均衡

Nginx 七层负载均衡

Example Configuration

upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}
upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

示例:

# 在http配置段中
http {
...
    upstream backend-server {
        server 192.168.174.141 weight=1;
        server 192.168.174.142 weight=2;
        server 192.168.174.99 backup;	# 备份服务器,当主服务器宕机无法接收请求时将会被启用,可用于sorry server
        # server 192.168.174.100 down;		# 手动标记主机永久不可用 
        # server 192.168.174.101 max_conns=[NUMBER] max_fails=[NUMBER] fail_timeout=[NUMBER];		# 从左往右参数分别是:最大并发连接数,用于健康状态检测的最多失败次数,失败的时间 
        
        # --- 调度算法 ---
        # least_conn;   # 最少连接
        # fair;         # 按后端服务器的响应时间来分配请求,响应时间短的优先分配
        # ip_hash;      # 每个访客固定访问一个后端服务,此外还可以通过hash来按照键值来绑定请求,↓↓↓如下所示↓↓↓
        
        # * 语法:	hash key [consistent];	例如: `hash $remote_addr`效果和ip_hash算法效果一致,[consistent]参数参考` /扩展(一致性哈希算法)/ `
        
        # --- 其他 ---
        # keepalive 32;		# 激活连接上游服务器的缓存,数字32表示nginx的每个work进程最大的连接数,当超过该数字时,最近最少使用的连接将会被关闭,该参数常用在后端缓存服务器上
	}       
...
}
# 在server配置段中
server {
        listen 80;
        server_name agou-ops.com;

        location / {
        proxy_pass http://backend-server;
        }
}

# ----------- 设置负载均衡所调用的proxy参数

5.准备Nginx负载均衡调度使用的proxy_params
$ vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
 
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

# -=------------------
# 在http配置段中
http {
...
    upstream backend-server {
        server 192.168.174.141 weight=1;
        server 192.168.174.142 weight=2;
        server 192.168.174.99 backup;	# 备份服务器,当主服务器宕机无法接收请求时将会被启用,可用于sorry server
        # server 192.168.174.100 down;		# 手动标记主机永久不可用 
        # server 192.168.174.101 max_conns=[NUMBER] max_fails=[NUMBER] fail_timeout=[NUMBER];		# 从左往右参数分别是:最大并发连接数,用于健康状态检测的最多失败次数,失败的时间 
        
        # --- 调度算法 ---
        # least_conn;   # 最少连接
        # fair;         # 按后端服务器的响应时间来分配请求,响应时间短的优先分配
        # ip_hash;      # 每个访客固定访问一个后端服务,此外还可以通过hash来按照键值来绑定请求,↓↓↓如下所示↓↓↓
        
        # * 语法:	hash key [consistent];	例如: `hash $remote_addr`效果和ip_hash算法效果一致,[consistent]参数参考` /扩展(一致性哈希算法)/ `
        
        # --- 其他 ---
        # keepalive 32;		# 激活连接上游服务器的缓存,数字32表示nginx的每个work进程最大的连接数,当超过该数字时,最近最少使用的连接将会被关闭,该参数常用在后端缓存服务器上
	}       
...
}
# 在server配置段中
server {
        listen 80;
        server_name agou-ops.com;

        location / {
        proxy_pass http://backend-server;
        }
}

# ----------- 设置负载均衡所调用的proxy参数

5.准备Nginx负载均衡调度使用的proxy_params
$ vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
 
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

# -=------------------

Nginx 四层负载均衡

Example Configuration

worker_processes auto;

error_log /var/log/nginx/error.log info;

events {
    worker_connections  1024;
}

stream {
    upstream backend {
        hash $remote_addr consistent;

        server backend1.example.com:12345 weight=5;
        server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;
        server unix:/tmp/backend3;
    }

    upstream dns {
       server 192.168.0.1:53535;
       server dns.example.com:53;
    }

    server {
        listen 12345;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }

    server {
        listen 127.0.0.1:53 udp reuseport;
        proxy_timeout 20s;
        proxy_pass dns;
    }

    server {
        listen [::1]:12345;
        proxy_pass unix:/tmp/stream.socket;
    }
}
worker_processes auto;

error_log /var/log/nginx/error.log info;

events {
    worker_connections  1024;
}

stream {
    upstream backend {
        hash $remote_addr consistent;

        server backend1.example.com:12345 weight=5;
        server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;
        server unix:/tmp/backend3;
    }

    upstream dns {
       server 192.168.0.1:53535;
       server dns.example.com:53;
    }

    server {
        listen 12345;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }

    server {
        listen 127.0.0.1:53 udp reuseport;
        proxy_timeout 20s;
        proxy_pass dns;
    }

    server {
        listen [::1]:12345;
        proxy_pass unix:/tmp/stream.socket;
    }
}

示例:

stream {
    upstream ssh_servers {
        server node01:22;		# 同七层负载均衡,可指定权重weight,是否为备用节点backup,此外还有fail_timeout
        server node02:22;
    }
	upsteam web_servers {
		server node01:80;
		server node02:80;
	}
    server {
        listen 9922;
        proxy_pass ssh_servers;
        proxy_timeout 10m;		# 客户端两次请求之前的间隔,默认为10min
        proxy_connect_timeout 60s;		# nginx与被反代服务器舱室连接的超时时长,默认为60s
    }
    server {
    	listen 80;
    	proxy_pass web_servers;
    }
}

stream {
    upstream ssh_servers {
        server node01:22;		# 同七层负载均衡,可指定权重weight,是否为备用节点backup,此外还有fail_timeout
        server node02:22;
    }
	upsteam web_servers {
		server node01:80;
		server node02:80;
	}
    server {
        listen 9922;
        proxy_pass ssh_servers;
        proxy_timeout 10m;		# 客户端两次请求之前的间隔,默认为10min
        proxy_connect_timeout 60s;		# nginx与被反代服务器舱室连接的超时时长,默认为60s
    }
    server {
    	listen 80;
    	proxy_pass web_servers;
    }
}

四七层负载均衡对比

  • 四层负载均衡仅能转发TCP/IP协议、UDP协议、通常用来转发端口,如:tcp/22、udp/53;
  • 四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用65535个端口号)
  • 四层负载均衡可以解决七层负载均衡高可用问题;(多台后端七层负载均衡能同事的使用)
  • 四层的转发效率比七层的高得多,但仅支持tcp/ip协议,不支持http和https协议;
  • 通常大并发场景通常会选择使用在七层负载前面增加四层负载均衡。

Nginx负载均衡调度算法

详情参考:http://nginx.org/en/docs/http/ngx_http_upstream_module.html

调度算法概述简称
轮询按时间顺序逐一分配到不同的后端服务器(默认)不考虑实际负载或实际配置,所有服务器都是平等,平均负载请求rr
weight加权轮询,weight值越大,分配到的访问几率越高wrr
ip_hash每个请求按访问IP的hash结果分配,这样来自同一IP的客户端固定会访问同一个后端服务器-
url_hash按照访问URL的hash结果来分配请求,每次相同的URL都会定向到同一个后端服务器-
consistent_hash一致性哈希算法,需要额外的模块包-
least_conn最少连接数,那个机器连接数少就分发lc
wlc加权最小连接wlc

部分配置示例:

# rr 与 wrr
upstream web_lb {
        server 172.16.1.20:80 weight=5;
        server 172.16.1.30:80;
        server 172.16.1.40:80;
}
# ip_hash,注意ip_hash不能与轮询或者加权轮询共同使用
upstream web_lb {
        ip_hash;
        server 172.16.1.20:80;
        server 172.16.1.30:80;
        server 172.16.1.40:80;
}
# consistent_hash
upstream somestream {
  consistent_hash $request_uri;
  server 10.50.1.3:11211;
  server 10.50.1.4:11211;
  server 10.50.1.5:11211;
}
# rr 与 wrr
upstream web_lb {
        server 172.16.1.20:80 weight=5;
        server 172.16.1.30:80;
        server 172.16.1.40:80;
}
# ip_hash,注意ip_hash不能与轮询或者加权轮询共同使用
upstream web_lb {
        ip_hash;
        server 172.16.1.20:80;
        server 172.16.1.30:80;
        server 172.16.1.40:80;
}
# consistent_hash
upstream somestream {
  consistent_hash $request_uri;
  server 10.50.1.3:11211;
  server 10.50.1.4:11211;
  server 10.50.1.5:11211;
}

扩展(一致性哈希算法)

​ 一致性hash用于对hash算法的改进,后端服务器在配置的server的数量发生变化后,同一个upstream server接收到的请求会的数量和server数量变化之间会有变化。尤其是在负载均衡配置的upstream server数量发生增长后,造成产生的请求可能会在后端的upstream server中并不均匀,有的upstream server负载很低,有的upstream server负载较高,这样的负载均衡的效果比较差,可能对upstream server造成不良的影响。由此,产生了一致性hash算法来均衡。

ℹ️ 详细介绍参考:https://baike.baidu.com/item/%E4%B8%80%E8%87%B4%E6%80%A7%E5%93%88%E5%B8%8C/2460889?fr=aladdin

在 nginx 中的应用:

upstream backend_server {
...
hash $request_uri consistent;		# 增加`consistent`即可
...
}
upstream backend_server {
...
hash $request_uri consistent;		# 增加`consistent`即可
...
}

参考链接