nginx+tomcat负载均衡(docker) 作者:马育民 • 2020-07-27 19:16 • 阅读:10159 需要掌握:[nginx docker 反向代理](https://www.malaoshi.top/show_1EF5xcIRyEtY.html "nginx docker 反向代理") # 介绍 nginx 通过 反向代理 实现 负载均衡,所以配置上与反向代理类似,但要更复杂些 反向代理图: [![](https://www.malaoshi.top/upload/pic/nginx/QQ20200723-231256.png)](https://www.malaoshi.top/upload/pic/nginx/QQ20200723-231256.png) # 负载均衡策略 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; } ``` 原文出处:http://malaoshi.top/show_1EF5xyFmZ8xp.html