用docker搭建nginx负载均衡测试环境

昨天收了一篇好文章 nginx经常使用功能全揭秘,想着今天来按照步骤配置一下nginx代理的,结果在使用docker的时候一直出问题,才诞生了这篇关于docker配置nginx负载均衡。php

首先在宿主机上建立两个两个目录n1,n2,分别做为两台nginx服务器的目录。html

mkdir -p n1 n2nginx

而后分别在目录里新建一个index.html文件,并输入内容做为nginx集群配置成功的后页面呈现的标识。docker

cd n1 && echo 'this is n1' >> index.htmlcd n2 && echo 'this is n2' >> index.htmlcentos

3.按照教程预先在集群中部署两台nginx的目标服务器d的容器tomcat

docker run --name nginx1 -d -p 8081:80 -v /Users/道长/Desktop/wwwphp/nginx/n1:/usr/share/nginx/html --link nginx:nginx nginxbash

docker run --name nginx2 -d -p 8081:80 -v /Users/道长/Desktop/wwwphp/nginx/n2:/usr/share/nginx/html --link nginx:nginx nginx服务器

4.而后咱们再建立一个nginx的代理服务器
docker run --name nginx -d -p 8080:80 nginx网络

5.修改咱们nginx的配置文件,分别在upstream和server里配置好咱们的两个目标服务器,结果你会发现页面直接呈现的是 “502 Bad Gateway”,当处理到这里的时候,我是直接蒙圈了,明明配置的是对的,为啥会出现这种没法访问的状况呢,而后咱们用 docker logs nginx 查看nginx代理容器的的日志,你会发现有以下提示:负载均衡

"1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: 127.0.0.1, request: "GET / HTTP/1.1", upstream: "http://172.17.0.3:8082/", host: "localhost:8080"
2018/11/24 10:10:10 [warn] 6#6:
1 upstream server temporarily disabled while connecting to upstream, client: 172.17.0.1, server: 127.0.0.1, request: "GET / HTTP/1.1", upstream: "http://172.17.0.3:8082/", host: "localhost:8080"
2018/11/24 10:10:11 [error] 6#6: 1 no live upstreams while connecting to upstream, client: 172.17.0.1, server: 127.0.0.1, request: "GET /favicon.ico HTTP/1.1", upstream: "http://tomcatserver1/favicon.ico", host: "localhost:8080", referrer: "http://localhost:8080/"
172.17.0.1 - - [24/Nov/2018:10:10:11 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" "-"
2018/11/24 10:10:11 [error] 6#6:
1 no live upstreams while connecting to upstream, client: 172.17.0.1, server: 127.0.0.1, request: "GET / HTTP/1.1", upstream: "http://tomcatserver1/", host: "localhost:8080"

咱们初步怀疑是网络不通的缘由,用 docker exec -it nginx /bin/bash 进入到nginx代理容器里,去试着ping一下nginx是否通畅,这个时候你就会发现神奇的一幕,咱们的nginx容器里竟然没有 ping 的命令,在用yum来安装一下吧,纳尼?yum命令也没有。是否是有些崩溃,有些想卸载docker了,请施主稍安勿躁,既然nginx的容器这么干净,那么咱们就建立一个centos的容器来用centos容器ping来ping nginx 的容器,结果你回发现如咱们猜测的同样,果真是容器间通讯形成的。

此时咱们的解决办法以下(原理方法请参考 Docker容器学习梳理--容器间网络通讯设置):

1.搭建一个网桥 docker network create bri1

2.删除原docker容器,而后从新建立新的nginx容器,命令以下

docker run --name nginx-test1 -d -p 8081:80 --network bri1 -v /Users/amber/Desktop/wwwphp/nginx/n1:/usr/share/nginx/html --link nginx:nginx nginx

docker run --name nginx-test2 -d -p 8082:80 --network bri1 -v /Users/amber/Desktop/wwwphp/nginx/n2:/usr/share/nginx/html --link nginx:nginx nginx

docker run --name nginx -d -p 8080:80 --network bri1 -v /Users/amber/Desktop/wwwphp/nginx:/etc/nginx/conf.d nginx

docker run --name nginx -d -p 8080:80 --network bri1 nginx
docker run --name centos -itd --network bri1 centos

3.建立完成以后,咱们 docker inspect nginx|grep IPAdress 来查看咱们的nginx代理的ip地址,而后 docker exec -it centos /bin/bash 进入到centos容器里用ping命令来来ping咱们nginx代理的ip地址 我本机nginx容器的ip为172.12.0.2 因此咱们 ping 172.12.0.2 此时咱们发现能够ping通,此刻咱们已经距离成功不远了。

而后咱们再修改nginx的配置文件

upstream tomcatserver1 {
    ip_hash
    server 172.20.0.2:8081;
    server 172.20.0.3:8082;
 }
server {
    listen       80;
    server_name  127.0.0.1;
    #charset koi8-r;
    #access_log  logs/host.access.log  main;
    location / {
        proxy_pass   http://tomcatserver1;
        index  index.html index.htm;
    }
}

此刻咱们重启nginx代理,会发现依旧不成功,为何呢?配置是ok的,而后容器间也能够相互通讯了,难道是端口??? 此刻咱们进入到centos容器里而后用 curl 172.12.0.2:8081curl 172.12.0.2 来获取咱们目标服务器的内容,咱们会发现没有加端口号的竟然成功了,原来咱们再建立容器的时候设置了 "-p 8081:80"里面的8081只是咱们的docker在监听咱们本机的端口,你在宿主机上用 lsof -i:8081就会发现监听的进程,而咱们容器间的通讯走的是bri1的网桥,并无通过咱们的宿主机端口,因此咱们只须要把代理服务器的upstream里的主机修改为

upstream nginx_proxy{
ip_hash
server 172.12.0.2;
server 172.12.0.3;
}

最后再重启咱们的代理服务器,大功告成,每刷新一次,就会切切换集群中的nginx服务器。期间发现了另外一篇好文负载均衡器技术Nginx和F5的优缺点对比,有兴趣的朋友能够看一看,欢迎感兴趣的朋友一块儿切磋交流 QQ:591382275(密码:王道长),在此感谢我师傅和亮哥的指导。

相关文章
相关标签/搜索