Nginx官方網站:http://nginx.org/
一、概述
Nginx是C語言開發的一款輕量級的Web服務器、反向代理服務器以及電子郵件(IMAP/POP3)代理服務器。
特點:占用內存少,資源消耗低,並發能力強。(官方測試nginx能夠支撐5萬並發鏈接)
為什么使用Nginx?(實現負載均衡)
互聯網飛速發展的今天,大用戶量高並發已經成為互聯網的主體。怎樣能讓一個網站能夠承載幾萬個或幾十萬個用戶的持續訪問呢?這是一些中小網站急需解決的問題。用單機tomcat搭建的網站,在比較理想的狀態下能夠承受的並發訪問量在150到200左右。對於一個為全國范圍提供服務的網站顯然是不夠用的,為了解決這個問題引入了負載均衡方法。負載均衡就是一個web服務器解決不了的問題可以通過多個web服務器來平均分擔壓力來解決,並發過來的請求被平均分配到多個后台web服務器來處理,這樣壓力就被分解開來。
負載均衡服務器分為兩種:
一種是通過硬件實現的負載均衡服務器,簡稱硬負載。例如:f5。
另一種是通過軟件來實現的負載均衡,簡稱軟負載。例如:apache和nginx。
硬負載和軟負載相比,前者作用的網絡層次比較多,可以作用到socket接口的數據鏈路層對發出的請求進行分組轉發,但是價格成本比較貴;而軟負載作用的層次在http協議層之上可以對http請求進行分組轉發,並且因為是開源的所以幾乎是零成本,並且占用內存少,資源消耗低,並發能力強。
二、代理概述
2.1 正向代理(Forward Proxy)
一般情況下,如果沒有特別說明,代理技術默認說的是正向代理技術。
客戶端必須要進行一些特別的設置才能使用正向代理,當然前提是要知道正向代理服務器的IP地址,還有代理程序的端口。
- 關於正向代理的概念如下:正向代理(forward)是一個位於客戶端【用戶A】和原始服務器(origin server)【服務器B】之間的服務器【代理服務器Z】,為了從原始服務器取得內容,用戶A向代理服務器Z發送一個請求並指定目標(服務器B),然后代理服務器Z向服務器B轉交請求並將獲得的內容返回給客戶端。簡單點說,正向代理就是代理服務器Z替代用戶A去訪問服務器B。
那為什么要用代理服務器去代替訪問方【用戶A】去訪問服務器B呢?這就要從代理服務器使用的作用說起。
1. 訪問本無法訪問的服務器B
我們拋除復雜的網絡路由情節來看上圖,假設圖中路由器從左到右命名為R1,R2,假設最初用戶A要訪問服務器B需要經過R1和R2路由器這樣一個路由節點,如果路由器R1或者路由器R2發生故障,那么就無法訪問服務器B了。但是如果用戶A讓代理服務器Z去代替自己訪問服務器B,由於代理服務器Z沒有在路由器R1或R2節點中,而是通過其它的路由節點訪問服務器B,那么用戶A就可以得到服務器B的數據。
現實中的例子就是“FQ”。不過自從VPN技術被廣泛應用,“FQ”不但使用了傳統的正向代理技術,有的還使用了VPN技術。
2. 加速訪問服務器B
這種說法目前不像以前那么流行了,主要是帶寬流量的飛速發展。早期的正向代理中,很多人使用正向代理就是提速。
還是如上圖 假設用戶A到服務器B,經過R1路由器和R2路由器,而R1到R2路由器的鏈路是一個低帶寬鏈路。而用戶A到代理服務器Z,從代理服務器Z到服務器B都是高帶寬鏈路。那么很顯然從代理服務器Z的訪問方式就可以加速訪問服務器B了。
3. Cache(緩存)作用
Cache(緩存)技術和代理服務技術是緊密聯系的(不光是正向代理,反向代理也使用了Cache(緩存)技術。
還如上圖所示,如果在用戶A訪問服務器B某數據J之前,已經有人通過代理服務器Z訪問過服務器B上得數據J,那么代理服務器Z會把數據J保存一段時間,如果有人正好取該數據J,那么代理服務器Z不再訪問服務器B,而把緩存的數據J直接發給用戶A。這一技術在Cache中術語就叫Cache命中。如果有更多的像用戶A的用戶來訪問代理服務器Z,那么這些用戶都可以直接從代理服務器Z中取得數據J,而不用千里迢迢的去服務器B獲取數據了。
4. 客戶端訪問授權
這方面的內容現今使用的還是比較多的,例如一些公司采用ISA SERVER做為正向代理服務器來授權用戶是否有權限訪問互聯網。
上圖防火牆作為網關,用來過濾外網對其的訪問。
假設用戶A和用戶B都設置了代理服務器,用戶A允許訪問互聯網,而用戶B不允許訪問互聯網(這個在代理服務器Z上做限制)。這樣用戶A因為授權,可以通過代理服務器Z訪問到服務器B,而用戶B因為沒有被代理服務器Z授權,所以訪問服務器B時,數據包會被直接丟棄。
5. 隱藏訪問者的行蹤
如圖,我們可以看出服務器B並不知道訪問自己的實際是用戶A,因為代理服務器Z代替用戶A去直接與服務器B進行交互。如果代理服務器Z被用戶A完全控制(或不完全控制),會慣以“肉雞”術語稱呼。
2.2 反向代理(reverse proxy)
反向代理正好與正向代理相反,對於客戶端而言,代理服務器就像是原始服務器,並且客戶端不需要進行任何特別的設置。
- 客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將獲得的內容返回給客戶端。
使用反向代理服務器的作用:
1. 保護和隱藏原始資源服務器
用戶A始終認為它訪問的是原始服務器B而不是代理服務器Z,但實用際上反向代理服務器接受用戶A的應答,從原始資源服務器B中取得用戶A的需求資源,然后發送給用戶A。
由於防火牆的作用,只允許代理服務器Z訪問原始資源服務器B。盡管在這個虛擬的環境下,防火牆和反向代理的共同作用保護了原始資源服務器B,但用戶A並不知情。
2. 負載均衡
當反向代理服務器不止一個的時候,我們甚至可以把它們做成集群,當更多的用戶訪問資源服務器B的時候,讓不同的代理服務器Z(x)去應答不同的用戶,然后發送不同用戶需要的資源。
當然反向代理服務器像正向代理服務器一樣擁有Cache(緩存)的作用,它可以緩存原始資源服務器B的資源,而不是每次都要向原始資源服務器B請求數據,特別是一些靜態的數據,比如圖片和文件。
如果這些反向代理服務器能夠做到和用戶X來自同一個網絡,那么用戶X訪問反向代理服務器X,就會得到很高質量的速度。這正是CDN技術的核心。(了解)
綜上:
基本上,網上做正反向代理的程序很多,能做正向代理的軟件大部分也可以做反向代理。
開源軟件中最流行的就是squid,既可以做正向代理,也有很多人用來做反向代理的前端服務器。
另外MS ISA也可以用來在WINDOWS平台下做正向代理。反向代理中最主要的實踐就是WEB服務,近些年來最火的就是Nginx了。網上有人說NGINX不能做正向代理,其實是不對的。NGINX也可以做正向代理,不過用的人比較少了。
2.3 透明代理
如果把正向代理、反向代理和透明代理按照人類血緣關系來划分的話。那么正向代理和透明代理是很明顯堂親關系,而正向代理和反向代理就是表親關系了 。
透明代理的意思是客戶端根本不需要知道有代理服務器的存在,它改編你的request fields(報文),並會傳送真實IP。
注意,加密的透明代理則是屬於匿名代理,意思是不用設置使用代理了。透明代理實踐的例子就是時下很多公司使用的行為管理軟件。
用戶A和用戶B並不知道行為管理設備充當透明代理行為,當用戶A或用戶B向服務器A或服務器B提交請求的時候,透明代理設備根據自身策略攔截並修改用戶A或B的報文,並作為實際的請求方,向服務器A或B發送請求,當接收信息回傳,透明代理再根據自身的設置把允許的報文發回至用戶A或B,如上圖,如果透明代理設置不允許訪問服務器B,那么用戶A或者用戶B就不會得到服務器B的數據。
深入了解學習