用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(密碼:王道長),在此感謝我師傅和亮哥的指導。

相關文章
相關標籤/搜索