Nginx 是一種非同步框架的網頁伺服器,可以用作反向代理、負載平衡器和 HTTP 快取,通常做為負載平衡器。
Nginx 為軟體負載平衡,硬體負載平衡常見的有 F5、A10
應用端透過代理伺服器接收 Request,代理伺服器再將 Request 轉送給應用端內部的伺服器。反向代理的詳細介紹請參考 Proxy - 代理伺服器。
我們使用 jwilder/nginx-proxy 這個 Image 來啟動 Nginx Container。
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
Nginx Container 會自動偵測啟動的 Container,將 Container 的 port 對應到不同的網域名稱。
網域需要申請註冊,一個網域對應一個 IP 或其他網域,但是很多應用或服務會在同個 Server 上,所以需要透過反向代理幫忙找出對應的應用。例如 :
Server上的其中一個應用假設使用 port 12003,Server IP 為 123.456.78.90,則連結網址為123.456.78.90:12003。
設定一個網域為 sample.com,sample.com 對應到的 IP 為 123.456.78.90。而當有很多應用在同一台 Server 上時,這時就會需要使用 DNS 設定子網域(subdomain)來區分出不同網址,子網域即為網域前面加上不同的名稱,例如 : ws-app.sample.com。
接著透過反向代理設定讓一個或多個 port 對應到這個子網域,多個 port 對應同一個子網域代表同一台 Server 上部署了好幾個相同的應用,且這些相同的應用使用不同 port,為的就是可以透過反向代理的設定做分流。
透過子網域和反向代理的設定後,則每個應用就會有其專屬的網址了。
docker run 啟動應用的 Container 時加上 -e VIRTUAL_HOST=xxx.xxx.com,VIRTUAL_HOST即為 DNS 設定好的子網域,例如 :
docker run -e VIRTUAL_HOST=ws-app.sample.com ...
透過上述的設定後,Nginx Container 就會自動的去 Listen Container 啟動的 port。當有 Container 啟動時就會自動地去寫 Nginx 的設定檔,這樣就不用每次要新增應用時,都要手動的去寫 Nginx 的設定檔做反向代理。
本篇使用較簡單而且快速的方式架設 Nginx,jwilder/nginx-proxy
這個 Image 已經將許多設定都寫好,如果想知道他的實作方式請見參考2。
[1] 在 Linux 上使用 Nginx 裝載 ASP.NET Core
[2] Automated nginx proxy for Docker containers using docker-gen | github
[3] 用 Nginx 伺服器建立反向代理
nginx