# Nginx (Engine X) ![Nginx](https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcQ87WGb7P9Mu54gP8PlXB-C5G1kjf0XBksFa4l5V_pEGm37SRti&usqp=CAU) Nginx 是一種非同步框架的網頁伺服器,可以用作反向代理、負載平衡器和 HTTP 快取,通常做為負載平衡器。 Nginx 為軟體負載平衡,硬體負載平衡常見的有 F5、A10 * 軟體負載平衡的優點是配置簡單、使用靈活、成本低廉、可以滿足一般的負載均衡;缺點是需要在伺服器上安裝軟體運行、會消耗系統資源、軟體的可擴展性不是很好、會受到系統限制。 * 硬體負載平衡的優點是獨立於作業系統、整體性能得到提高、可以滿足較高的負載均衡;缺點是使用複雜、成本較高。 <!-- more --> ## 反向代理(Reverse Proxy) 應用端透過代理伺服器接收 Request,代理伺服器再將 Request 轉送給應用端內部的伺服器。反向代理的詳細介紹請參考 [Proxy - 代理伺服器](https://tienyulin.github.io/proxy/)。 ## 建立 Nginx ### 使用 Docker 啟動 Nginx 我們使用 jwilder/nginx-proxy 這個 Image 來啟動 Nginx Container。 ```bash= 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.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 設定好的子網域,例如 : ```bash= 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](https://docs.microsoft.com/zh-tw/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-3.1) [2] [Automated nginx proxy for Docker containers using docker-gen | github](https://github.com/nginx-proxy/nginx-proxy) [3] [用 Nginx 伺服器建立反向代理](https://noob.tw/nginx-reverse-proxy/) ###### tags: `nginx`