1. 程式人生 > >用docker搭建nginx負載均衡測試環境

用docker搭建nginx負載均衡測試環境

昨天收了一篇好文章 nginx常用功能全揭祕,想著今天來按照步驟配置一下nginx代理的,結果在使用docker的時候一直出問題,才誕生了這篇關於docker配置nginx負載均衡。

首先在宿主機上建立兩個兩個目錄n1,n2,分別作為兩臺nginx伺服器的目錄。

mkdir -p n1 n2

然後分別在目錄裡新建一個index.html檔案,並輸入內容作為nginx叢集配置成功的後頁面呈現的標識。

cd n1 && echo 'this is n1' >> index.htmlcd 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: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(密碼:王道長),在此感謝我師傅和亮哥的指導。