[学习笔记_nginx_场景篇_6] No.11 负载均衡

[学习笔记_nginx_场景篇_6] No.11 负载均衡_第1张图片
image.png

1、配置负载均衡

配置语法

syntax: upstream name{...}
default: -
context:http

2、 小 demo

将 ip 为 192.168.43.101 主机上的 nginx 修改 default.conf 如下

upstream centos113 {
    server 192.168.43.113:8001;
    server 192.168.43.113:8002;
    server 192.168.43.113:8003;
}

server {

    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
    proxy_pass http://centos113;
    include proxy_params;
    }


    #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   /usr/share/nginx/html;
    }

}

在 ip 为 192.168.43.113 的主机上 启动 监听 3 个不同端口的服务,分别是 8001,8002,8003,作为 被代理的服务

server1.conf 配置如下,监听 8001

server {
    listen       8001;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /opt/nginx/app/code;
        index 1.html;
    }

    #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   /usr/share/nginx/html;
    }
}

server2.conf 配置如下,监听 8002

server {
    listen       8002;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /opt/nginx/app/code;
        index 2.html;
    }

    #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   /usr/share/nginx/html;
    }

}

server3.conf 配置如下,监听 8003

server {
    listen       8003;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /opt/nginx/app/code;
        index 3.html;
    }

    #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   /usr/share/nginx/html;
    }
}

下面在浏览器地址栏中,输入 http://192.168.43.101
连续刷新几次,你会发现页面出现不同的变化


image.png

image.png
[学习笔记_nginx_场景篇_6] No.11 负载均衡_第2张图片
image.png

3、模拟某个服务 down 掉

通过 防火墙 拦截,编写对应的 iptables 规则

[root@CentOS6 conf.d]# iptables -I INPUT -p tcp --dport 8002 -j DROP
[root@CentOS6 conf.d]# 

这时刷新 http://192.168.43.101,只会显示 1.html 和 3.html,因为 8002 被防火墙拦截,请求超时后,nginx 会认为它已经 down 掉了。


image.png
image.png

如果通过 iptables 规则,放开 8002 端口拦截,nginx 检测到 8002 端口能够正常访问后,又恢复了 1.html ,2.html 和 3.html 轮询加载

[root@CentOS6 conf.d]# iptables -I INPUT -p tcp --dport 8002 -j ACCEPT
[root@CentOS6 conf.d]# 

[学习笔记_nginx_场景篇_6] No.11 负载均衡_第3张图片
image.png
[学习笔记_nginx_场景篇_6] No.11 负载均衡_第4张图片
image.png
image.png

4、upstream 配置项详解

upstream backend {
    server backend1.example.com weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;
    
    server backup1.exmple.com:8080 backup;
    server backup2.example.com:8080 backup;
}
  • backend:跟在 upstream 后面,表示一组虚拟服务的名字,这个名字是自定义的 如 ‘cenos113’ ,它的大括号中,加的是每一个 server,
  • 每个 server 的配置: 不仅支持域名(如: backup1.exmple.com:8080 ),也支持 ip (如:192.168.43.113:8001 ),也支持 socket 方式(如:unix:/tmp/backend3 )
  • weight:用于配置该 server 对应的 权重,对应轮询方式而言,权重越大,请求分配到这个 server 的机率越高。
  • backup:表示这个 server 是预留的 备份服务器,在其他成员存活的情况下,这个 backup 节点不对外提供服务,当同组的其他所有节点无法提供服务时,backup 节点就会被利用起来提供服务。
后端服务器在负载均衡调度中的状态
[学习笔记_nginx_场景篇_6] No.11 负载均衡_第5张图片
image.png

修改 ip 为 192.168.43.101 主机上的 nginx 修改 default.conf 如下

upstream centos113 {
    server 192.168.43.113:8001 down;
    server 192.168.43.113:8002 weight=3;
    server 192.168.43.113:8003 max_fails=1 fail_timeout=10s;
    server 192.168.43.113:8004 backup;
}

5、nginx 调度算法

[学习笔记_nginx_场景篇_6] No.11 负载均衡_第6张图片
image.png
5.1、权重 weight
upstream centos113 {
    server 192.168.43.113:8001 down;
    server 192.168.43.113:8002 weight=3;
    server 192.168.43.113:8003 weight=2 max_fails=1 fail_timeout=10s;
    server 192.168.43.113:8004 backup;
}

5.2、ip_hash,注意:得要 去掉 backup,去掉 weight
upstream centos113 {
    ip_hash;
    server 192.168.43.113:8001 down;
    server 192.168.43.113:8002;
    server 192.168.43.113:8003 max_fails=1 fail_timeout=10s;
    server 192.168.43.113:8004 backup;
}

5.3、least_conn 最小连接,哪台 server 的连接数最小,则分发给该 server

upstream centos113 {
    least_conn;
    server 192.168.43.113:8001 down;
    server 192.168.43.113:8002;
    server 192.168.43.113:8003 max_fails=1 fail_timeout=10s;
    server 192.168.43.113:8004 backup;
}


5.4、通过 hash key 的方式配置 url_hash ,注意:此时 upstream 中 不支持 backup 配置

配置语法

syntax: hash key [consistent];
default:-
context:upstream
this directive appeared in version 1.7.2
  • key:表示用于进行 hash 变量,如 $request_uri

upstream centos113 {
        hash $request_uri;
        server 192.168.43.113:8001 weight=5;
        server 192.168.43.113:8002;
        server 192.168.43.113:8003 max_fails=1 fail_timeout=10s;
        server 192.168.43.113:8004;
}

这里配置的时,当每一次请求的 uri 相同时,会代理到同一台 server 上。

同理,我们也可以 通过 正则表达式,提取 $request_uri 上的某一个参数或者值 来进行 hash。

你可能感兴趣的:([学习笔记_nginx_场景篇_6] No.11 负载均衡)