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