0%

Nginx (Engine X)

Nginx

Nginx 是一種非同步框架的網頁伺服器,可以用作反向代理、負載平衡器和 HTTP 快取,通常做為負載平衡器。

Nginx 為軟體負載平衡,硬體負載平衡常見的有 F5、A10

  • 軟體負載平衡的優點是配置簡單、使用靈活、成本低廉、可以滿足一般的負載均衡;缺點是需要在伺服器上安裝軟體運行、會消耗系統資源、軟體的可擴展性不是很好、會受到系統限制。
  • 硬體負載平衡的優點是獨立於作業系統、整體性能得到提高、可以滿足較高的負載均衡;缺點是使用複雜、成本較高。

反向代理(Reverse Proxy)

應用端透過代理伺服器接收 Request,代理伺服器再將 Request 轉送給應用端內部的伺服器。反向代理的詳細介紹請參考 Proxy - 代理伺服器

建立 Nginx

使用 Docker 啟動 Nginx

我們使用 jwilder/nginx-proxy 這個 Image 來啟動 Nginx Container。

1
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

Nginx Container 會自動偵測啟動的 Container,將 Container 的 port 對應到不同的網域名稱。

網域(domain)

網域需要申請註冊,一個網域對應一個 IP 或其他網域,但是很多應用或服務會在同個 Server 上,所以需要透過反向代理幫忙找出對應的應用。例如 :

Server上的其中一個應用假設使用 port 12003,Server IP 為 123.456.78.90,則連結網址為123.456.78.90:12003。

設定一個網域為 sample.comsample.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 設定好的子網域,例如 :

1
docker run -e VIRTUAL_HOST=ws-app.sample.com ...

透過上述的設定後,Nginx Container 就會自動的去 Listen Container 啟動的 port。當有 Container 啟動時就會自動地去寫 Nginx 的設定檔,這樣就不用每次要新增應用時,都要手動的去寫 Nginx 的設定檔做反向代理。

Summary

本篇使用較簡單而且快速的方式架設 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 伺服器建立反向代理