nginx+tomcat负载均衡(docker)

需要掌握:nginx docker 反向代理

介绍

nginx 通过 反向代理 实现 负载均衡,所以配置上与反向代理类似,但要更复杂些

反向代理图:

负载均衡策略

  1. 轮询(round robin),默认
  2. weight权重
  3. IP_hash
  4. url_hash(第三方)
  5. fair(第三方)

准备

停止多余的docker容器

修改docker-compose.yml文件

cd /root/docker_nginx

备份该文件

cp docker-compose.yml docker-compose.yml.bak

修改

vim docker-compose.yml

内容如下:

version: '3'
services:
  nginx:
    image: nginx   # 镜像
    container_name: nginx   # 指定容器名称
    networks:
      - mynet
    ports:   # bridge网络模式,指定映射端口
       - "8000:80"
    # network_mode: "host"   # 指定网络模式
    restart: always   # 当docker服务启动时,容器总是跟着启动
    volumes:
      - /root/docker_nginx/conf.d:/etc/nginx/conf.d

  tomcat1:
    image: tomcat   # 镜像
    container_name: tomcat1   # 指定容器名称
    networks:
      - mynet
    ports:   # bridge网络模式,指定映射端口
       - "8080:8080"
    restart: always   # 当docker服务启动时,容器总是跟着启动
    volumes:
      - /root/docker_nginx/webapps1:/usr/local/tomcat/webapps

  tomcat2:
    image: tomcat   # 镜像
    container_name: tomcat2   # 指定容器名称
    networks:
      - mynet
    ports:   # bridge网络模式,指定映射端口
       - "8081:8080"
    restart: always   # 当docker服务启动时,容器总是跟着启动
    volumes:
      - /root/docker_nginx/webapps2:/usr/local/tomcat/webapps

networks:
  mynet:

启动一个nginx、2个tomcat

docker-compose up -d

准备tomcat1工程

在/root/docker_nginx/webapps1创建test文件夹,作为tomcat1工程文件夹

cd /root/docker_nginx/webapps1
mkdir test

在test文件夹创建index.html页面

cd test
vim index.html

内容如下:

tomcat1

准备tomcat2工程

在/root/docker_nginx/webapps2创建test文件夹,作为tomcat2工程文件夹

cd /root/docker_nginx/webapps2
mkdir test

在test文件夹创建index.html页面

cd test
vim index.html

内容如下:

tomcat2

测试

访问 http://106.13.165.100:8080/test/ 能够显示页面,内容是 tomcat1
访问 http://106.13.165.100:8081/test/ 能够显示页面,内容是 tomcat2

表示成功

轮询

轮询(round robin)方式,依次将请求分配到各个后台服务器中,默认的负载均衡方式。

适用于后台机器性能一致的情况。
挂掉的机器可以自动从服务列表中剔除。

修改 default.conf

修改/root/docker_nginx/conf.d/default.conf

vim /root/docker_nginx/conf.d/default.conf

内容如下:

# 增加 upstream 块,配置要负载均衡的服务
upstream tomcats {    # tomcats是名字,可任意起,一般不要有下划线
    server tomcat1:8080 ;   # 由于使用自定义bridge网络,所以可以通过容器名通信
    server tomcat2:8080 ;
}

server{
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://tomcats;
    }
}

重新加载配置文件 或 重启容器

测试

访问 http://106.13.165.100:8000/test/index.html ,能够正常显示页面,页面内容间隔显示 tomcat1、tomcat2

说明轮询负载均衡配置成功

weight权重

根据权重来分发请求到不同的机器中,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

修改 default.conf

修改/root/docker_nginx/conf.d/default.conf

vim /root/docker_nginx/conf.d/default.conf

内容如下:

# 增加 upstream 块,配置要负载均衡的服务
upstream tomcats {    # tomcats是名字,可任意起,一般不要有下划线
    server tomcat1:8080  weight=10;   # 由于使用自定义bridge网络,所以可以通过容器名通信
    server tomcat2:8080  weight=5;
}

server{
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://tomcats;
    }
}

重新加载配置文件 或 重启容器

测试

访问 http://106.13.165.100:8000/test/index.html ,能够正常显示页面,页面内容间隔显示 tomcat1、tomcat2,显示 tomcat1 多一倍的概率

说明权重负载均衡配置成功

upstream块 参数解释

https://www.malaoshi.top/show_1EF5xy8hDHHj.html

ip_hash

根据请求者ip的hash值将请求发送到后台服务器中,可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。

一般很少用这种方式,失去负载均衡意义

修改 default.conf

修改/root/docker_nginx/conf.d/default.conf

vim /root/docker_nginx/conf.d/default.conf

内容如下:

# 增加 upstream 块,配置要负载均衡的服务
upstream tomcats {    # tomcats是名字,可任意起,一般不要有下划线
    ip_hash;
    server tomcat1:8080  ;   # 由于使用自定义bridge网络,所以可以通过容器名通信
    server tomcat2:8080  ;   # 此处有 weight=5 也不受影响
}

server{
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://tomcats;
    }
}

重新加载配置文件 或 重启容器

测试

访问 http://106.13.165.100:8000/test/index.html ,能够正常显示页面,并且永远访问这个页面,因为访问ip和tomcat服务绑定了

说明 ip_hash 负载均衡配置成功

url_hash(第三方)

根据请求的url的hash值将请求分到不同的机器中,当后台服务器为缓存的时候效率高。

例如:

在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream backend {    
    server squid1:3128;    
    server squid2:3128;    
    hash $request_uri;    
    hash_method crc32;    
}
upstream bakend{   #定义负载均衡设备的Ip及设备状态    
    ip_hash;    
    server 127.0.0.1:9090 down;    
    server 127.0.0.1:8080 weight=2;    
    server 127.0.0.1:6060;    
    server 127.0.0.1:7070 backup;    
}

在需要使用负载均衡的server中增加

proxy_pass http://bakend/;

每个设备的状态设置为:

  1. down 表示单前的server暂时不参与负载
  2. weight 默认为1.weight越大,负载的权重就越大。
  3. max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
  4. fail_timeout:max_fails次失败后,暂停的时间。
  5. backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
    nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
    client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug
    client_body_temp_path 设置记录文件的目录 可以设置最多3层目录
    location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

fair(第三方)

根据后台响应时间来分发请求,响应时间短的分发的请求多。

例如:

upstream backend {    
server server1;    
server server2;    
fair;    
}

原文出处:/show_1EF5xyFmZ8xp.html