昨天收了一篇好文章 nginx经常使用功能全揭秘,想着今天来按照步骤配置一下nginx代理的,结果在使用docker的时候一直出问题,才诞生了这篇关于docker配置nginx负载均衡。php
首先在宿主机上建立两个两个目录n1,n2,分别做为两台nginx服务器的目录。html
mkdir -p n1 n2
nginx
而后分别在目录里新建一个index.html文件,并输入内容做为nginx集群配置成功的后页面呈现的标识。docker
cd n1 && echo 'this is n1' >> index.html
和 cd n2 && echo 'this is n2' >> index.html
centos
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 nginx
bash
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(密码:王道长),在此感谢我师傅和亮哥的指导。