如何使用 Weave 以及 Docker 搭建 Nginx 反向代理/負載均衡伺服器

linux.cn發表於2015-09-06

Hi, 今天我們將會學習如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/負載均衡伺服器。Weave 可以建立一個虛擬網路將 Docker 容器彼此連線在一起,支援跨主機部署及自動發現。它可以讓我們更加專注於應用的開發,而不是基礎架構。Weave 提供了一個如此棒的環境,彷彿它的所有容器都屬於同個網路,不需要埠/對映/連線等的配置。容器中的應用提供的服務在 weave 網路中可以輕易地被外部世界訪問,不論你的容器執行在哪裡。在這個教程裡我們將會使用 weave 快速並且簡單地將 nginx web 伺服器部署為一個負載均衡器,反向代理一個執行在 Amazon Web Services 裡面多個節點上的 docker 容器中的簡單 php 應用。這裡我們將會介紹 WeaveDNS,它提供一個不需要改變程式碼就可以讓容器利用主機名找到的簡單方式,並且能夠讓其他容器通過主機名連線彼此。

在這篇教程裡,我們將使用 nginx 來將負載均衡分配到一個執行 Apache 的容器集合。最簡單輕鬆的方法就是使用 Weave 來把執行在 ubuntu 上的 docker 容器中的 nginx 配置成負載均衡伺服器。

如何使用 Weave 以及 Docker 搭建 Nginx 反向代理/負載均衡伺服器

1. 搭建 AWS 例項

首先,我們需要搭建 Amzaon Web Service 例項,這樣才能在 ubuntu 下用 weave 跑 docker 容器。我們將會使用AWS 命令列 來搭建和配置兩個 AWS EC2 例項。在這裡,我們使用最小的可用例項,t1.micro。我們需要一個有效的Amazon Web Services 賬戶使用 AWS 命令列介面來搭建和配置。我們先在 AWS 命令列介面下使用下面的命令將 github 上的 weave 倉庫克隆下來。

$ git clone https://github.com/weaveworks/guides
$ cd weave-gs/aws-nginx-ubuntu-simple

在克隆完倉庫之後,我們執行下面的指令碼,這個指令碼將會部署兩個 t1.micro 例項,每個例項中都是 ubuntu 作為作業系統並用 weave 跑著 docker 容器。

$ sudo ./demo-aws-setup.sh

在這裡,我們將會在以後用到這些例項的 IP 地址。這些地址儲存在一個 weavedemo.env 檔案中,這個檔案建立於執行 demo-aws-setup.sh 指令碼期間。為了獲取這些 IP 地址,我們需要執行下面的命令,命令輸出類似下面的資訊。

$ cat weavedemo.env

export WEAVE_AWS_DEMO_HOST1=52.26.175.175
export WEAVE_AWS_DEMO_HOST2=52.26.83.141
export WEAVE_AWS_DEMO_HOSTCOUNT=2
export WEAVE_AWS_DEMO_HOSTS=(52.26.175.175 52.26.83.141)

請注意這些不是固定的 IP 地址,AWS 會為我們的例項動態地分配 IP 地址。

我們在 bash 下執行下面的命令使環境變數生效。

 . ./weavedemo.env

2. 啟動 Weave 和 WeaveDNS

在安裝完例項之後,我們將會在每臺主機上啟動 weave 以及 weavedns。Weave 以及 weavedns 使得我們能夠輕易地將容器部署到一個全新的基礎架構以及配置中, 不需要改變程式碼,也不需要去理解像 Ambassador 容器以及 Link 機制之類的概念。下面是在第一臺主機上啟動 weave 以及 weavedns 的命令。

ssh -i weavedemo-key.pem ubuntu@$WEAVE_AWS_DEMO_HOST1
$ sudo weave launch
$ sudo weave launch-dns 10.2.1.1/24

下一步,我也準備在第二臺主機上啟動 weave 以及 weavedns。

ssh -i weavedemo-key.pem ubuntu@$WEAVE_AWS_DEMO_HOST2
$ sudo weave launch $WEAVE_AWS_DEMO_HOST1
$ sudo weave launch-dns 10.2.1.2/24

3. 啟動應用容器

現在,我們準備跨兩臺主機啟動六個容器,這兩臺主機都用 Apache2 Web 服務例項跑著簡單的 php 網站。為了在第一個 Apache2 Web 伺服器例項跑三個容器, 我們將會使用下面的命令。

ssh -i weavedemo-key.pem ubuntu@$WEAVE_AWS_DEMO_HOST1
$ sudo weave run --with-dns 10.3.1.1/24 -h ws1.weave.local fintanr/weave-gs-nginx-apache
$ sudo weave run --with-dns 10.3.1.2/24 -h ws2.weave.local fintanr/weave-gs-nginx-apache
$ sudo weave run --with-dns 10.3.1.3/24 -h ws3.weave.local fintanr/weave-gs-nginx-apache

在那之後,我們將會在第二個例項上啟動另外三個容器,請使用下面的命令。

ssh -i weavedemo-key.pem ubuntu@$WEAVE_AWS_DEMO_HOST2
$ sudo weave run --with-dns 10.3.1.4/24 -h ws4.weave.local fintanr/weave-gs-nginx-apache
$ sudo weave run --with-dns 10.3.1.5/24 -h ws5.weave.local fintanr/weave-gs-nginx-apache
$ sudo weave run --with-dns 10.3.1.6/24 -h ws6.weave.local fintanr/weave-gs-nginx-apache

注意: 在這裡,–with-dns 選項告訴容器使用 weavedns 來解析主機名,-h x.weave.local 則使得 weavedns 能夠解析該主機。

4. 啟動 Nginx 容器

在應用容器如預期的執行後,我們將會啟動 nginx 容器,它將會在六個應用容器服務之間輪詢並提供反向代理或者負載均衡。 為了啟動 nginx 容器,請使用下面的命令。

ssh -i weavedemo-key.pem ubuntu@$WEAVE_AWS_DEMO_HOST1
$ sudo weave run --with-dns 10.3.1.7/24 -ti -h nginx.weave.local -d -p 80:80 fintanr/weave-gs-nginx-simple

因此,我們的 nginx 容器在 $WEAVEAWSDEMO_HOST1 上公開地暴露成為一個 http 伺服器。

5. 測試負載均衡伺服器

為了測試我們的負載均衡伺服器是否可以工作,我們執行一段可以傳送 http 請求給 nginx 容器的指令碼。我們將會傳送6個請求,這樣我們就能看到 nginx 在一次的輪詢中服務於每臺 web 伺服器之間。

$ ./access-aws-hosts.sh

{
"message" : "Hello Weave - nginx example",
"hostname" : "ws1.weave.local",
"date" : "2015-06-26 12:24:23"
}
{
"message" : "Hello Weave - nginx example",
"hostname" : "ws2.weave.local",
"date" : "2015-06-26 12:24:23"
}
{
"message" : "Hello Weave - nginx example",
"hostname" : "ws3.weave.local",
"date" : "2015-06-26 12:24:23"
}
{
"message" : "Hello Weave - nginx example",
"hostname" : "ws4.weave.local",
"date" : "2015-06-26 12:24:23"
}
{
"message" : "Hello Weave - nginx example",
"hostname" : "ws5.weave.local",
"date" : "2015-06-26 12:24:23"
}
{
"message" : "Hello Weave - nginx example",
"hostname" : "ws6.weave.local",
"date" : "2015-06-26 12:24:23"
}

結束語

我們最終成功地將 nginx 配置成一個反向代理/負載均衡伺服器,通過使用 weave 以及執行在 AWS(Amazon Web Service)EC2 裡面的 ubuntu 伺服器中的 docker。從上面的步驟輸出可以清楚的看到我們已經成功地配置了 nginx。我們可以看到請求在一次輪詢中被髮送到6個應用容器,這些容器在 Apache2 Web 伺服器中跑著 PHP 應用。在這裡,我們部署了一個容器化的 PHP 應用,使用 nginx 橫跨多臺在 AWS EC2 上的主機而不需要改變程式碼,利用 weavedns 使得每個容器連線在一起,只需要主機名就夠了,眼前的這些便捷, 都要歸功於 weave 以及 weavedns。

如果你有任何的問題、建議、反饋,請在評論中註明,這樣我們才能夠做得更好,謝謝!

相關文章