1. 关于Nginx的负载均衡

(1) 在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理) (2) 为了避免单独一个服务器压力过大, 将来自用户的请求转发给不同的服务器

2. 语法结构

2.1 upstream语法结构

语法:

# name不能有下横杠等特殊符号,定义规则等同于域名定义规则
upstream name {...}

所属模块:

http

示例:

# 负载均衡服务集群,定义一个本机域名"my-website"(不能有下横杠等符号,因为url中不允许存在)
upstream my-website {
    server 192.168.88.11:8080;  #tomcat01
    server 192.168.88.22:8080;  #tomcat02
    server localhost:8080;      #tomcat03
    server localhost:8081;      #tomcat04
}

配置完upstream模块后,需要让指定的访问反向代理到服务器列表

# 反向代理到tomcat容器
location / {
    # 请求转发到指定的负载均衡服务集群:my_website
    proxy_pass http://my_website;
}

2.2 server语法结构

upstream中server指令语法如下:

server address [parameters]

语法详解

# server 必选
# address 必选,可以是主机名、域名、ip或unix socket,也可以指定端口号
# parameters 可选参数,可以是如下参数:
#  down 表示当前server已停用
#  backup 表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求
#  weight 表示当前server负载权重,权重越大被请求几率越大,默认是1
#  max_fails和fail_timeout 一般关联使用,如果某台server在fail_timeout时间内出现了max_fails次连接失败,则认为
#   该server已经宕机;fail_timeout秒后(这fail_timeout秒内不会有新的请求到达刚刚挂掉的节点上)会再有新请求
#   尝试连接挂掉的server,如果还是失败,重复上一过程,直到恢复;fail_timeout默认是10s,max_fails默认是1,即默认
#   只要发生错误就认为服务器挂掉了,如果将max_fails设置为0,则表示取消这项检查。

配置示例

# 负载均衡配置"website-01",定义一个本机域名"website-01"(不能有下横杠等符号,因为url中不允许存在)
upstream website-01 {
	# 标记服务节点是备用机,仅在其他服务器都宕机以后,才会加入到集群中,被用户访问到
	server 192.168.66.1:8080 backup;
	# 标记服务节点不可用
	server 192.168.66.2:8080 down;   
	# 表示单个服务器的最大连接数,防止服务器超载,默认0,表示没有限制        
	server 192.168.66.3:8080 max_conns=500; 
	# 表示失败几次,则标记server已宕机,剔出集群服务,默认1,设置为0则表示取消检查 
	server 192.168.66.4:8080 max_fails=2;   
	# 表示失败的重试时间默认10秒 
	server 192.168.66.5:8080 fail_timeout=20;
	# 表示在15秒内请求失败达到3次后,则认为该server已经宕机;15秒后(这15秒内不会有新的请求到达
	# 刚刚挂掉的节点上)会再有新请求尝试连接挂掉的server,如果还是失败,重复上一过程,直到恢复
	server 192.168.66.6:8080 max_fails=3 fail_timeout=15;
}

# 负载均衡配置"website-02",定义一个本机域名"website-02"(不能有下横杠等符号,因为url中不允许存在)
upstream website-02 {
	# 当前server负载权重,权重越大接收请求越多,默认为1
	server 192.168.66.6:8080 weight=3; 
	# 当前server负载权重,权重越大接收请求越多,默认为1
	server 192.168.66.7:8080 weight=1; 
}

3. 轮询策略

3.1 策略列表

负载均衡用于从“upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求

负载均衡策略列表:

参数名称			含义
---------------------------------
weight			# 权重方式
ip_hash			# 依据ip分配方式
least_conn		# 最少连接方式
fair(第三方)		# 响应时间方式
url_hash(第三方)	# 依据URL分配方式

3.2 策略详解

这里仅对Nginx自带策略做了解

3.2.1 轮询(默认策略)

以下的例子就是最基本的配置方法,是upstream模块默认的负载均衡默认策略 每个请求会按时间顺序逐一分配到不同的后端服务器

# 负载均衡服务集群,定义一个本机域名"my-website02"(不能有下横杠等符号,因为url中不允许存在)
upstream my-website02 {
    server 192.168.66.11:8080;  # tomcat01
    server 192.168.66.22:8080;  # tomcat02
    server localhost:8080;      # tomcat03
    server localhost:8081;      # tomcat04
}

参数列表,请参照 2.2 server语法结构

# 表示当前server已停用
down

# 表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求
backup

# 表示当前server负载权重,权重越大被请求几率越大,默认是1
weight

# 一般关联使用,如果某台server在fail_timeout时间内出现了max_fails次连接失败,则认为该server已经宕机;
# fail_timeout秒后(这fail_timeout秒内不会有新的请求到达刚刚挂掉的节点上)会再有新请求尝试连接挂掉的server

# 如果还是失败,重复上一过程,直到恢复;fail_timeout默认是10s,max_fails默认是1,
# 即默认只要发生错误就认为服务器挂掉了,如果将max_fails设置为0,则表示取消这项检查
max_fails和fail_timeout

注意:

  • 在轮询中,如果服务器down掉了,会自动剔除该服务器
  • 缺省配置就是轮询策略
  • 此策略适合服务器配置相当,无状态且短平快的服务使用

3.2.2 weight

权重方式,在轮询策略的基础上指定轮询的几率

# 负载均衡服务集群,定义一个本机域名"my-website03"(不能有下横杠等符号,因为url中不允许存在)
upstream my-website03 {
    server localhost:8080 weight=2;  					# tomcat01
    server localhost:8081 backup;  					# tomcat02
    server localhost:8082 max_fails=3 fail_timeout=20s;	# tomcat03
    server localhost:8083 down;						# tomcat04
}

例子中,weight参数指定轮询几率,weight的默认值为1;weight的数值与访问比率成正比.比如tomcat01被访问的几率为其他服务器的两倍

注意:

  • 权重越高分配到需要处理的请求越多
  • 此策略可以与least_conn和ip_hash结合使用
  • 此策略比较适合服务器的硬件配置差别比较大的情况

3.2.3 ip_hash

指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器, 以保证session会话.这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题

# 负载均衡服务集群,定义一个本机域名"my-website04"(不能有下横杠等符号,因为url中不允许存在)
upstream my-website04 {
    ip_hash;					#保证每个访客固定访问一个后端服务器
    server localhost:8080;  	# tomcat01
    server localhost:8081;  	# tomcat02
    server localhost:8082;	# tomcat03
    server localhost:8083;	# tomcat04
}

注意:

  • Nginx1.3.1之前,不能在ip_hash中使用权重(weight)
  • ip_hash不能与backup同时使用
  • 此策略适合有状态服务,比如session
  • 当有服务器需要剔除,必须手动down掉

3.2.4 least_conn

轮询算法会把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长, 导致其所在的后端负载较高.这种情况下,least_conn这种方式就可以达到更好的负载均衡效果, 他会把请求转发给连接数较少的后端服务器.

# 负载均衡服务集群,定义一个本机域名"my-website05"(不能有下横杠等符号,因为url中不允许存在)
upstream my-website05 {
    least_conn;    		#把请求转发给连接数较少的后端服务器
    server localhost:8080;  	# tomcat01
    server localhost:8081;  	# tomcat02
    server localhost:8082;	# tomcat03
    server localhost:8083;	# tomcat04
}

注意:

  • 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况

4. 监听映射

server {
    # 监听的端口号,可同时监听多个端口号
    listen 83;
    listen 84;
    # 监听的IP地址或域名,多个域名之间用空格分开,支持通配符 *.baidu.com、www.baidu.*
    server_name localhost;

    # 匹配网页位置
    location / {
        # 转发到负载均衡集群,"my-website05"是负载均衡配置的本地域名
        proxy_pass http://my-website05;
    }
}

设置完毕

5. 完整示例

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    
    # 负载均衡服务集群,定义一个本机域名"nacos-cluster"(不能有下横杠等符号,因为url中不允许存在)
    upstream nacos-cluster {
        server 127.0.0.1:8849;
        server 127.0.0.1:8850;
        server 127.0.0.1:8851;
    }

    server {
        listen       8848;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /nacos/ {
            proxy_pass http://nacos-cluster;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

图片.png