Nginx是什麼?
Nginx ("engine x") 是一個高效能的 HTTP 和反向代理伺服器,特點是佔有記憶體少,併發能力強,事實上 nginx 的併發能力確實在同型別的網頁伺服器中表現較好,有報告表明能支援高 達 50,000 個併發連線數。國內京東,淘寶,阿里,新浪皆有使用Nginx。
Nginx通常被用來實現正向代理,反向代理,負載均衡,以及動靜分離這四個功能。
本篇文章作為基礎篇,將主要講解這四個Nginx應用中最基礎的概念,幫助大家更好的理解,從而為下一章的程式碼配置做準備:
不廢話,直接上乾貨。
正向代理:
在說什麼是反向代理之前,我們需要先了解一下什麼是正向代理,正如大家所知,由於某些不可抗拒的因素,我們沒有辦法在中國大陸直接訪問Google等網站,或者說訪問GitHub這些國外網站網速比較慢,不論是正向代理還是反向代理,都其實可以看作是代理模式的衍生版本。下面我們通過一個小栗子來理解正向代理在這裡面起的作用:
阿呆這幾天愁眉苦臉的,工作中某些業務需要用到谷歌郵箱,可是現在別說谷歌郵箱了,谷歌都打不開,這可急壞了阿呆,正當阿呆一籌莫展之際,突然想到二呆剛被公司派去俄羅斯北極圈推銷冰箱了,自己上不了谷歌,但是二呆能上啊,而且二呆的電腦並沒有被限制訪問,於是阿呆就想出了一個天才的辦法,阿呆在公司遠端控制二呆的電腦訪問Google郵箱,這麼一來問題便得到了完美解決。
而這個例子中的請求路徑是這樣的,我們先傳送請求到我們的代理伺服器,然後代理伺服器再去請求Google的伺服器,最後將請求到的內容返回給我們本機。而這樣一種模式呢,我們就稱之為正向代理。如圖所示(圖畫的醜,下次還醜):
反向代理:
在瞭解了什麼是正向代理之後,反向代理就容易理解多了。正向代理中我們的代理伺服器是作為一個消費者存在的,而反向代理中我們則對外提供服務,我們來看下面這個例子:
二呆從俄羅斯回來之後,業績上是一無所獲,好在公司不至於太過絕情,於是給了二呆一次將功補過的機會。工作內容也很簡單,要求二呆去組織一個暖氣事業部為將來非洲的暖氣業務做準備,這當然沒問題,剛開始的時候,二呆感覺還好,因為公司部門不多,所以可以很方便叫某個人的編號去安排工作,比如8080,你去處理這個請求,8081你去處理這個,8082你去問問非洲人民的意見怎麼樣,可是慢慢隨著公司在此專案上投入的越來越多,部門員工也排到了10000多,這下二呆還要記住每個人的編號就不太現實了,**於是二呆設立了一臺代理伺服器,讓代理伺服器去記住這些人的編號和功能,而二呆只需要記住代理伺服器的編號就行了,於是整個部門在二呆眼裡慢慢變成了一個整體,而具體有多少人二呆則是完全不關心了,甚至二呆都不需要知道部門中都有哪些員工,**如圖所示:
而反向代理和正向代理最大的區別就是客戶端完全感知不到代理的存在,比如我們正向代理訪問Google,可能需要在本地軟體比如小飛機上設定相應的代理伺服器的地址和埠,而反向代理則完全不需要設定,比如淘寶,當客戶端去訪問淘寶的時候,可完全不知道淘寶開了多少臺伺服器,每個伺服器的地址是多少,只需要像往常一樣在瀏覽器中輸入:taobao.com就行,至於雙十一將至,阿里又額外開了多少臺伺服器,客戶端則是完全感知不到的,所有的請求則是通過代理伺服器通過負載均衡的方式分發到不同的伺服器中了。
一句話總結:
反向代理伺服器和目標伺服器對外就是一個伺服器,暴露的是代理伺服器 地址,隱藏了真實伺服器 IP 地址。
負載均衡:
負載均衡,其實不算是一個新的概念,負載均衡其實是在反向代理基礎之上實現的,如果說反向代理的目的是為了隱藏真實伺服器的IP地址的話,負載均衡則是提供了一組策略來將請求從代理伺服器上分發到這些真實的伺服器上去。
在Nginx中,一共提供了三種負載均衡策略供開發者靈活選擇:
- 輪詢(預設方式): 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器 down 掉,能自動剔除。
- 權重(weight): weight 代表權重,預設為 1,權重越高被分配的客戶端越多,權重越大,能力越大,責任越大,處理的請求就越多。
- ip_hash:每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決 session 的問題。
一句話總結:
增加伺服器的數量,然後將請求分發到各個伺服器上,將原先請求集中到單個伺服器上的情況改為將請求分發到多個伺服器上,將負載分發到不同的伺服器,也就是我們所說的負載均衡
動靜分離:
當我們的應用初具規模,伺服器後端需要面對大量請求的話,原來的動靜混合打包釋出的方式就不再那麼適用了,因為我們伺服器一邊需要去處理客戶端發過來的動態請求,比如資料庫的查詢,計算等,又同時要處理客戶端發過來的靜態請求,比如圖片,css樣式等靜態檔案,大量的請求毫無疑問會增加我們後端的壓力,擠佔我們用於處理動態請求的效能,為了解決這個問題呢,於是就有了動靜分離這種部署的方式。
動靜分離就是把很少會發生修改的諸如影像,視訊,css樣式等靜態資原始檔放置在單獨的伺服器上,而動態請求則由另外一臺伺服器上進行,這樣一來,負責動態請求的伺服器則可以專注在動態請求的處理上,從而提高了我們程式的執行效率,與此同時,我們也可以針對我們的靜態資源伺服器做專屬的優化,增加我們靜態請求的響應速度。
Nginx 動靜分離簡單來說就是把動態跟靜態請求分開,不能理解成只是單純的把動態頁面和靜態頁面物理分離。嚴格意義上說應該是動態請求跟靜態請求分開,可以理解成使用 Nginx 處理靜態頁面,Tomcat 處理動態頁面。動靜分離從目前實現角度來講大致分為兩種,
一種是純粹把靜態檔案獨立成單獨的域名,放在獨立的伺服器上,也是目前主流推崇的方案;
另外一種方法就是動態跟靜態檔案混合在一起釋出,通過 nginx 來分開,具體如何配置,後期Nginx實戰會詳細說明。
如下圖所示:
總結:
本篇文章作為Nginx的第一篇,主要側重講了以下Nginx的四個基本概念,也是我們日常開發中遇到的最為頻繁的四個功能,下一節呢,我們則從實際的程式碼入手,通過編寫相應的程式碼,一步一步的完成反向代理,負載均衡,動靜分離的配置。而正向代理呢,如果有興趣的小夥伴可以自行查閱相關資料(狗頭保命)。
相關筆記已經同步開源至本人github,歡迎star:
最後,歡迎點贊,關注我,有你好果子吃(滑稽)