需要掌握:nginx docker 反向代理
介绍
nginx 通过 反向代理 实现 负载均衡,所以配置上与反向代理类似,但要更复杂些
反向代理图:
负载均衡策略
- 轮询(round robin),默认
- weight权重
- IP_hash
- url_hash(第三方)
- 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/;
每个设备的状态设置为:
- down 表示单前的server暂时不参与负载
- weight 默认为1.weight越大,负载的权重就越大。
- max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
- fail_timeout:max_fails次失败后,暂停的时间。
- 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;
}
