Nginx之(一)Nginx是什麼

冰河winner發表於2016-12-22

Nginx("engine x")是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器。由俄羅斯的程式設計師Igor Sysoev所開發,供俄國大型的入口網站及搜尋引擎Rambler使用。

Nginx程式碼完全用C語言寫成,其特點是佔有記憶體少,併發能力強。官方測試號稱最多能夠支撐5萬併發連線,在實際生產環境中跑到2~3萬的併發連線數沒什麼壓力。

說到Web伺服器,Apache伺服器和IIS伺服器是兩大巨頭;但是執行速度更快、更靈活的Nginx 正在迎頭趕上。Nginx到底有多火呢?據統計,全球活躍的網站中使用了Nginx的佔比高達12.18%,中國大陸但凡你能說得上名字的網站幾乎都在使用Nginx,比如百度、京東、新浪、網易、騰訊、淘寶等。

 

先來掃一下盲,看看“代理”到底是個什麼玩意兒。


1.1 正向代理

有公就有母,有正就有反,陰陽共濟,相輔相成。瞭解反向代理之前,先來看看什麼是正向代理

我們平常所說的代理伺服器(Proxy Server)提供的就是正向代理服務,其功能是代理網路使用者去取得網路資訊。代理位於Web客戶端和Web伺服器之間,扮演“中間人”的角色。


HTTP的代理伺服器既是Web伺服器又是Web客戶端。一個完整的代理請求過程為:客戶端首先與代理伺服器建立連線,接著根據代理伺服器所使用的代理協議,請求對目標伺服器建立連線、或者獲得目標伺服器的指定資源,然後代理伺服器再將拿到的資源返回給客戶端。

可是,我們的請求為什麼不直來直往,而要多此一舉的通過代理伺服器來轉達呢?代理伺服器的作用大大的,通過它可以實現多種功能:

(1)共享IP地址

比如,某個區域網內有十臺電腦需要上網,但是隻分配了一個IP地址。這時候就可以將唯一的IP地址賦予代理伺服器,通過NAT(Network Address Translation)協議,讓十臺電腦都能與外網連通。傳送至外網的請求一律通過代理伺服器轉發,代理伺服器收到迴應時,再轉發給內網的請求者。


(2)快取記憶體

大部分代理伺服器都具有快取的功能,就好像一個大的Cache,它有很大的儲存空間,它不斷將新取得資料儲存到它本地的儲存器上,如果瀏覽器所請求的資料在它本機的儲存器上已經存在而且是最新的,那麼它就不重新從Web伺服器取資料,而直接將儲存器上的資料傳給使用者的瀏覽器,這樣就能顯著提高瀏覽速度。


(3)過濾器

外面的世界很精彩,外面的世界也很危險。有了代理伺服器,媽媽再也不用擔心我的安全。


如果把天朝的整個網路看做一個超大的區域網,我們只要訪問境外的網站,都會經過一個代理伺服器,就是備受“歡迎”的“長城防火牆”,也稱“中國國家防火牆”,用於自動審查和過濾監控。這麼看來,最擔心我們安全的還得說是祖國母親。

(4)突破自身IP的訪問限制

道高一尺,魔高一丈。代理伺服器是矛是盾,看你怎麼用。

所謂的中國多媒體公眾資訊網和教育網都是獨立的大型國家級區域網,是與國際網際網路隔絕的。出於各種需要,某些集團或個人在兩網之間開設了代理伺服器,藉助這些代理伺服器的地址,就可以利訪問國外網站,俗稱翻牆。


注意,正向代理與Nginx一毛錢關係都沒有,以上內容只是為了引出反向代理的概念。


1.2 反向代理

正向代理是代理客戶端來向Internet傳送請求,而反向代理是代理服務端來接受Internet上的請求。


正向代理中,proxy和client同屬一個LAN,對server透明;反向代理中,proxy和server同屬一個LAN,對client透明。 實際上proxy在兩種代理中做的事都是代為收發請求和響應,不過從結構上來看正好左右互換了下。

再用兩個例子來比較一下正向代理與反向代理的區別。

(1)正向代理

A同學在大眾創業、萬眾創新的大時代背景下開啟他的創業之路,目前他遇到的最大的一個問題就是啟動資金,於是他決定去找馬雲爸爸借錢,可想而知,最後碰一鼻子灰回來了,情急之下,他想到一個辦法,找關係開後門,經過一番訊息打探,原來A同學的大學老師王老師是馬雲的同學,於是A同學找到王老師,託王老師幫忙去馬雲那借500萬過來,當然最後事成了。不過馬雲並不知道這錢是A同學借的,馬雲是借給王老師的,最後由王老師轉交給A同學。這裡的王老師在這個過程中扮演了一個非常關鍵的角色,就是代理,也可以說是正向代理,王老師代替A同學辦這件事,這個過程中,真正借錢的人是誰,馬雲是不知道的,這點非常關鍵。

我們常說的代理也就是隻正向代理,正向代理的過程,它隱藏了真實的請求客戶端,服務端不知道真實的客戶端是誰,客戶端請求的服務都被代理伺服器代替來請求,某些上網工具扮演的就是典型的正向代理角色。用瀏覽器訪問 http://www.google.com 時,被殘忍的block,於是你可以在國外搭建一臺代理伺服器,讓代理幫我去請求google.com,代理把請求返回的相應結構再返回給我。


(2)反向代理

大家都有過這樣的經歷,撥打10086客服電話,可能一個地區的10086客服有幾個或者幾十個,你永遠都不需要關心在電話那頭的是哪一個,叫什麼,男的,還是女的,漂亮的還是帥氣的,你都不關心,你關心的是你的問題能不能得到專業的解答,你只需要撥通了10086的總機號碼,電話那頭總會有人會回答你,只是有時慢有時快而已。那麼這裡的10086總機號碼就是我們說的反向代理。客戶不知道真正提供服務人的是誰。

反向代理隱藏了真實的服務端,當我們請求 www.baidu.com 的時候,就像撥打10086一樣,背後可能有成千上萬臺伺服器為我們服務,但具體是哪一臺,你不知道,也不需要知道,你只需要知道反向代理伺服器是誰就好了,www.baidu.com 就是我們的反向代理伺服器,反向代理伺服器會幫我們把請求轉發到真實的伺服器那裡去。

使用反向代理的優勢有很多,比如,隱藏和保護伺服器資源、負載均衡,快取靜態內容,加密和SSL加速等。


1.3 Nginx的功能

Nginx的啟動特別簡單,並且幾乎可以做到7*24不間斷執行,即使執行數個月也不需要重新啟動。還能夠不間斷服務的情況下進行軟體版本的升級。

Nginx在做反向代理時,能夠提供效能穩定並且靈活配置的轉發功能。Nginx可以根據不同的正則匹配,採取不同的轉發策略,比如圖片檔案結尾的走檔案伺服器,動態頁面走web伺服器。Nginx還對可以對返回結果進行異常判斷,如果被分發的伺服器存在異常,會將請求重新轉發給另外一臺伺服器,然後自動去除異常伺服器。

1.3.1 保護伺服器

當客戶機向站點提出請求時,請求將轉到代理伺服器。然後,代理伺服器通過防火牆中的特定通路,將客戶機的請求傳送到內容伺服器。內容伺服器再通過該通道將結果回傳給代理伺服器。代理伺服器將檢索到的資訊傳送給客戶機,好像代理伺服器就是實際的內容伺服器。如果內容伺服器返回錯誤訊息,代理伺服器會先行擷取該訊息並更改標頭中列出的任何 URL,然後再將訊息傳送給客戶機。如此可防止外部客戶機獲取內部內容伺服器的重定向URL。

這樣,代理伺服器就在安全資料庫和可能的惡意攻擊之間提供了又一道屏障。與有權訪問整個資料庫的情況相對比,就算是僥倖攻擊成功,作惡者充其量也僅限於訪問單個事務中所涉及的資訊。未經授權的使用者無法訪問到真正的內容伺服器,因為防火牆通路只允許代理伺服器有權進行訪問。

1.3.2負載均衡

負載均衡伺服器的作用是平衡叢集中各個伺服器的負載壓力。

Nginx內建的負載均衡策略有3種:輪詢加權輪詢IP hash。同時支援擴充套件策略,完全可以自己寫一套規則交給Nginx去執行。

(1)輪詢


這種策略簡單易行,將請求平均的分配給每個伺服器去處理。

(2)加權輪詢


升級版的輪詢策略,權重越大的伺服器會被分配越多的請求數量。

(3)IP hash


對客戶端請求的IP進行hash操作,然後根據hash結果將同一個客戶端IP的請求分發給同一臺伺服器進行處理,可以解決session不共享的問題。

1.3.3 web快取

Nginx可以對不同的檔案做不同的快取處理,配置靈活,並且支援FastCGI_Cache,主要用於對FastCGI的動態程式進行快取。配合著第三方的ngx_cache_purge,對制定的URL快取內容可以的進行增刪管理。


相關文章