设为首页 收藏本站
查看: 1067|回复: 0

[经验分享] 用docker搭建nginx负载均衡测试环境

[复制链接]

尚未签到

发表于 2019-2-20 10:20:16 | 显示全部楼层 |阅读模式
  昨天收了一篇好文章 nginx常用功能全揭秘,想着今天来按照步骤配置一下nginx代理的,结果在使用docker的时候一直出问题,才诞生了这篇关于docker配置nginx负载均衡。
  首先在宿主机上创建两个两个目录n1,n2,分别作为两台nginx服务器的目录。

  mkdir -p n1 n2

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

  cd n1 && echo 'this is n1' >> index.html 和 cd n2 && echo 'this is n2' >> index.html

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

  docker run --name nginx1 -d -p 8081:80 -v /Users/道长/Desktop/wwwphp/nginx/n1:/usr/share/nginx/html --link nginx:nginx nginx
  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:8081 和 curl 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(密码:王道长),在此感谢我师傅和亮哥的指导。





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-674760-1-1.html 上篇帖子: 配置docker静态IP地址 下篇帖子: docker无法启动报错问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表