1. 程式人生 > >寫給小白的 Nginx 文章

寫給小白的 Nginx 文章

![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210131165932211-1745977375.jpg) > 原文地址:[Nginx concepts I wish I knew years ago](https://dev.to/aemiej/nginx-concepts-i-wish-i-knew-years-ago-23o0) > > 原文作者:Aemie Jariwala(已授權) > > 譯者 & 校正:HelloGitHub-小魚乾 & 滷蛋 _Nginx 是一個採用主從架構的 Web 伺服器,可用於反向代理、負載均衡器、郵件代理和 HTTP 快取_。 Emmm,上面的 Nginx 介紹看過去有些複雜而且充滿了不明覺厲的術語。Relax,在這篇文章裡,我(原作者)會先帶你理解 Nginx 的架構和專有術語,最後實踐一把安裝和配置 **Nginx**。 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210131170006851-1069071872.gif) 簡單來說,你只要記住一點:_Nginx 是個神奇的 Web 伺服器_。(注:神奇之處下文會娓娓道來) 那什麼是 Web 伺服器呢?簡而言之,Web 伺服器就是一箇中間人。舉個例子,你要訪問 `hellogithub.com`(注:原文例子為 dev.to),在位址列輸入 `https://hellogithub.com` 時,你的瀏覽器會找到 `https://hellogithub.com` 的網路伺服器地址並將它指向後端伺服器,後端伺服器再返回響應給客戶端。 ## 代理 vs 反向代理 Nginx 的基本特性是代理,所以你一定要明白什麼是**代理**和**反向代理**。 ### 代理 看個小例子,現在我們有 N 個客戶端(N >= 1),一箇中間 Web 伺服器(在本例中,我們稱之為代理)和一個伺服器。這個例子主要的場景是,伺服器不知道哪個客戶端在請求(響應)。是不是有點難以理解?下面讓我用示意圖講解下: ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210131170019501-594817563.jpg) 如圖,_client1_ 和 _client2_ 通過代理伺服器向伺服器傳送請求 _request1_ 和 _request2_,此時後端伺服器不知道 _request1_ 是由 _client1_ 傳送的還是 _client2_ 傳送的,但會執行(響應)操作。 ### 反向代理 簡單來說,反向代理與代理的功能相反。現在我們有一個客戶端、一箇中間 Web 伺服器和 N 個後端伺服器(N >= 1),同樣的來看下示意圖: ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210131170030058-1631727679.png) 如圖,客戶端將通過 Web 伺服器傳送請求。而 Web 伺服器會通過一個演算法,當中最有意思的演算法是輪詢,直接將請求指向許多後端伺服器中的一個,並通過 Web 伺服器將響應返回給客戶端。因此,在上面的例子中,客戶端其實並不知道在與哪個後端伺服器進行互動。 ## 負載均衡 又是枯燥的一個名詞:負載均衡,不過它很好理解,因為負載均衡本身就是**反向代理**的一個例項。 來看看負載均衡和反向代理的本質區別。在負載均衡中,你必須有 2 個或者更多的後端伺服器,但在反向代理中,多臺伺服器不是必需的,甚至一臺後端伺服器也能運作。我們再深入點,如果我們有很多來自客戶端的請求,負載均衡器會檢查每個後端伺服器的狀態,均勻地分配請求,更快地向客戶端傳送響應。 ## 有狀態 vs 無狀態應用 Okay,在我們開始實踐 Nginx 之前,先搞清所有的基本知識! ### 有狀態應用 有狀態應用存了一個額外變數,只用來儲存伺服器中單個例項使用所需的資訊。 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210131170040077-527272436.jpg) 如圖所示,一個後端伺服器 _server1_ 儲存了一些資訊,伺服器 _server2_ 並不儲存此資訊,因此,客戶端 (上圖 Bob) 的互動可能會也可能不會得到想要的結果,因為它可能會與 _server1_ 或 _server2_ 互動。在本例中,_server1_ 允許 Bob 檢視資料檔案,但 _server2_ 不允許。因此,雖然有狀態應用避免對資料庫的多次 API 呼叫,並且(響應)速度更快,但它可能會在不同的伺服器上導致這個(無法得到想要結果)問題。 ### 無狀態應用 無狀態應用有更多的資料庫 API 呼叫,但當客戶端與不同後端伺服器的互動時,無狀態應用卻存在更少的問題。 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210131170049037-370783124.jpg) 沒明白?簡單來說,如果我通過 Web 伺服器從客戶端向後端伺服器 _server1_ 傳送請求,它將向客戶端返回一個令牌,用於任何進一步的訪問請求。客戶端可以使用令牌並向 Web 伺服器傳送請求。此 Web 伺服器將請求連同令牌一起傳送到任意後端伺服器,而每個後端伺服器都能提供相同的所需結果。 ## Nginx 是什麼? Nginx 是網路伺服器,到目前為止,我的整個部落格一直在用這個網路伺服器。老實說,Nginx 這就像個**中間人**。 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210131170058341-154117070.png) 這個圖不難理解,它是目前為止所有概念的一個組合。在這裡,我們有 3 個後端伺服器執行在 3001、3002 和 3003 埠,這些後端伺服器都能訪問同一個執行在 5432 埠的資料庫。 當一個客戶端向 `https://localhost` (預設埠 443)發起一個 `GET /employees` 請求時,Nginx 將基於演算法向任意後端伺服器傳送請求,從資料庫獲取資料並將 JSON 資料返回 Nginx Web 伺服器再發送給客戶端。 如果我們使用一個諸如輪詢這樣的演算法,它讓 _client2_ 向 `https://localhost` 傳送一個請求,然後 Nginx 伺服器會先將請求傳到 3000 埠並將響應返回給客戶端。對另一個請求,Nginx 會把請求傳給 3002 埠,以此類推。 知識儲備完成!到這裡,你對 Nginx 是什麼以及 Nginx 所涉及的術語有了一個清晰的理解。是時候,瞭解安裝和配置技術了。 ## 開始安裝 Nginx 時機到了,如果你瞭解了上面的概念,可以動手開始 Nginx 實踐了。 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210131170106762-1463526826.gif) 嗯,Nginx 的安裝過程對任何系統來說都很簡單。我是一個 Mac OSX 使用者,所以例子的命令是基於 macOS 的, [Ubuntu](https://ubuntu.com/tutorials/install-and-configure-nginx#2-installing-nginx)、[Windows](https://www.maketecheasier.com/install-nginx-server-windows/) 和其他 Linux 發行版操作和例子類似。 ```shell $ brew install Nginx ``` 只要執行上面這步,你的系統就有 Nginx 了!是不是很神奇! ### 執行 Nginx 如此簡單