快速理解Nginx和代理技術

在這裏插入圖片描述

卑微小吳勵志寫博客第7天。
前段時間一個同事想要跳槽,結果面試的時候被面試官問到Nginx相關的知識點,沒能答上來。回來後跟我分享,我說你出去面試這方面都不準備怎麼能行。所以今天簡單記錄一下關於nginx相關的知識點。

Nginx

什麼是Nginx

在這裏插入圖片描述

這是在網上copy下來的關於nginx的描述,簡單歸結爲一句話就是:一款高性能的反向代理的服務器,國內很多大型門戶都在使用。

爲什麼使用Nginx

背景:
互聯網飛速發展的今天,大用戶量高併發已經成爲互聯網的主體.怎樣能讓一個網站能夠承載幾萬個或幾十萬個用戶的持續訪問呢?這是一些中小網站急需解決的問題。用單機tomcat搭建的網站,在比較理想的狀態下能夠承受的併發訪問量在150到200左右。按照併發訪問量佔總用戶數量的5%到10%這樣計算,單點tomcat網站的用戶人數在1500到4000左右。對於一個爲全國範圍提供服務的網站顯然是不夠用的,爲了解決這個問題引入了負載均衡方法。負載均衡就是一個web服務器解決不了的問題可以通過多個web服務器來平均分擔壓力來解決,並發過來的請求被平均分配到多個後臺web服務器來處理,這樣壓力就被分解開來。
負載均衡服務器分爲兩種一種是通過硬件實現的負載均衡服務器,簡稱硬負載例如:f5。另一種是通過軟件來實現的負載均衡,簡稱軟負載:例如apache和nginx。硬負載和軟負載相比前者作用的網絡層次比較多可以作用到socket接口的數據鏈路層對發出的請求進行分組轉發但是價格成本比較貴,而軟負載作用的層次在http協議層之上可以對http請求進行分組轉發並且因爲是開源的所以幾乎是0成本,並且阿里巴巴,京東等電商網站使用的都是Nginx服務器。

主要是爲了解決高併發問題,用的是負載均衡的策略。

代理技術

因爲Nginx是反向代理的模式,但是對於初學者來說,代理是啥都不知道,還反向代理,更加懵逼。所以這裏談談代理技術,這樣才能知道爲什麼用Nginx,以及代理技術是怎樣工作的。

正向代理

一、正向代理(Forward Proxy)

一般情況下,如果沒有特別說明,代理技術默認說的是正向代理技術。關於正向代理的概念如下: 正 向代理(forward)是一個位於客戶端【用戶A】和原始服務器(origin server)【服務器B】之間的服務器【代理服務器Z】,爲了從原始服務器取得內容,用戶A向代理服務器Z發送一個請求並指定目標(服務器B),然後代 理服務器Z向服務器B轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。
在這裏插入圖片描述

從上面的概念中,我們看出,文中所謂的正向代理就是代理服務器替代訪問方【用戶A】去訪問目標服務器【服務器B】
這就是正向代理的意義所在。而爲什麼要用代理服務器去代替訪問方【用戶A】去訪問服務器B呢?這就要從代理服務器使用的意義說起。

使用正向代理服務器作用主要有以下幾點:

  1. 訪問本無法訪問的服務器B,如下圖
    在這裏插入圖片描述
    我們拋除複雜的網絡路由情節來看圖,假設圖中路由器從左到右命名爲R1,R2,假設最初用戶A要訪問服務器B需要經過R1和R2路由器這樣一個路由節點,如果路由器R1或者路由器R2發生故障,那麼就無法訪問服務器B了。
    但是如果用戶A讓代理服務器Z去代替自己訪問服務器B,由於代理服務器Z沒有在路由器R1或R2節點中,而是通過其它的路由節點訪問服務器B,那麼用戶A就可以得到服務器B的數據了。

  2. 加速訪問服務器B

    這種說法目前不像以前那麼流行了,主要是帶寬流量的飛速發展。早期的正向代理中,很多人使用正向代理就是提速。
    還是如上圖,假設用戶A到服務器B,經過R1路由器和R2路由器,而R1到R2路由器的鏈路是一個低帶寬鏈路。而用戶A到代理服務器Z,從代理服務器Z到服務器B都是高帶寬鏈路。那麼很顯然就可以加速訪問服務器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因爲授權,可以通過代理服務器訪問到服務器B,而用戶B因爲沒有被代理服務器Z授權,所以訪問服務器B時,數據包會被直接丟棄。

  5. 隱藏訪問者的行蹤

    如下圖
    在這裏插入圖片描述
    我們可以看出服務器B並不知道訪問自己的實際是用戶A,因爲代理服務器Z代替用戶A去直接與服務器B進行交互。如果代理服務器Z被用戶A完全控制(或不完全控制),會慣以“肉雞”術語稱呼。
    我 們總結一下 正向代理是一個位於客戶端和原始服務器(origin
    server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),然後代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須設置正向代理服務器,當然前提是要知道正向代理服務器的IP地址,還有代理程序的端口。

反向代理(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技術的核心。如下圖
在這裏插入圖片描述
我們並不是講解CDN,所以去掉了CDN最關鍵的核心技術智能DNS。只是展示CDN技術實際上利用的正是反向代理原理這塊。

反向代理結論與正向代理正好相反,對於客戶端而言它就像是原始服務器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將獲得的內容返回給客戶端,就像這些內容原本就是它自己的一樣。

基本上,網上做正反向代理的程序很多,能做正向代理的軟件大部分也可以做反向代理。開源軟件中最流行的就是squid,既可以做正向代理,也有很多人用來做反向代理的前端服務器。另外MS ISA也可以用來在WINDOWS平臺下做正向代理。反向代理中最主要的實踐就是WEB服務,近些年來最火的就是Nginx了。網上有人說NGINX不能做正向代理,其實是不對的。NGINX也可以做正向代理,不過用的人比較少了。

透明代理

如果把正向代理、反向代理和透明代理按照人類血緣關係來劃分的話。那麼正向代理和透明代理是很明顯堂親關係,而正向代理和反向代理就是表親關係了 。
透明代理的意思是客戶端根本不需要知道有代理服務器的存在,它改編你的request fields(報文),並會傳送真實IP。注意,加密的透明代理則是屬於匿名代理,意思是不用設置使用代理了。 透明代理實踐的例子就是時下很多公司使用的行爲管理軟件。如下圖
在這裏插入圖片描述
用戶A和用戶B並不知道行爲管理設備充當透明代理行爲,當用戶A或用戶B向服務器A或服務器B提交請求的時候,透明代理設備根據自身策略攔截並修改用戶A或B的報文,並作爲實際的請求方,向服務器A或B發送請求,當接收信息回傳,透明代理再根據自身的設置把允許的報文發回至用戶A或B,如上圖,如果透明代理設置不允許訪問服務器B,那麼用戶A或者用戶B就不會得到服務器B的數據。

使用Nginx完成負載均衡

完成Nginx負載均衡,那麼需要先來介紹Tomcat的安裝和配置,我們首先要來配置Tomcat完成集羣的配置.因爲我們沒有多臺服務器運行Tomcat.那麼我們可以模擬在一臺服務器上運行多個Tomcat程序。

使用Tomcat配置Tomcat集羣:

  • 步驟一:下載Tomcat: http://tomcat.apache.org/download-70.cgi
    在這裏插入圖片描述
  • 步驟二:安裝和配置Tomcat: 直接將下載後的Tomcat解壓在本地磁盤:解壓兩個分別命名爲tomcat1和tomcat2.
    在這裏插入圖片描述
    分別完成如下配置:(需要將tomcat帶有端口號的地方改成不同的端口即可.)分別打開兩個tomcat的conf下的server.xml
    tomcat1/conf/server.xml在這裏插入圖片描述
    tomcat2/conf/server.xml
    在這裏插入圖片描述

Nginx的安裝和部署:

Nginx的安裝:
將nginx-1.8.0.zip解壓包某個盤符下運行:目錄結構如下:
在這裏插入圖片描述

雙擊nginx.exe即可運行:打開瀏覽器http://localhost:80顯示如下頁面:
在這裏插入圖片描述
說明安裝成功!!!

  • 關閉nginx需要使用: 相當於找到nginx進程kill。 nginx -s stop
  • 重新加載配置文件: nginx -s reload 可以不關閉nginx的情況下更新配置文件.

Nginx的負載均衡的配置:

打開C:\nginx-1.8.0\conf\nginx.conf這個文件:
在這裏插入圖片描述

***** 通過以上的配置我們已經可以通過訪問www.taoge.com訪問到不同的tomcat來分擔服務器端的壓力.請求負載過程中會話信息不能丟失.那麼需要在多個tomcat中session需要共享.

  • 配置Tomcat的session共享可以有三種解決方案:
  • 第一種是以負載均衡服務器本身提供的session共享策略,每種服務期的配置是不一樣的並且nginx本身是沒有的。
  • 第二種是利用web容器本身的session共享策略來配置共享。針對於weblogic這種方式還是靠普的。但是針對於tomcat這種方式存在很大的缺陷,主要因爲是依靠廣播方式來實現的session複製,會浪費很多帶寬導致整個網絡反映緩慢。官網也建議這種方式最好不要超過4臺tomcat,具體的內容可參考/webapps/docs/cluster-howto.html裏面有詳細的說明。下面是具體的配置過程。
  • 第三種是Tomcat集羣+redis的Session共享配置方法。

在這裏我們以第二種方式爲例:

配置Tomcat中session的共享:

**步驟一:**修改server.xml文件,最簡單的集羣配置只需要將節點中註釋掉的下面這句取消註釋即可:
Xml代碼:

 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>  

使用這樣方法配置的集羣會將Session同步到所在網段上的所有配置了集羣屬性的實例上(此處講所在網段可能不準確,是使用Membership 的address和port來區分的。tomcat集羣的實例如果在Membership配置中有相同的address和port值的tomcat被分到同一個集羣裏邊。他們的session是相互共享的,同一個session的集羣被稱爲一個cluster。可以配置多個cluster,但是cluster和cluster之間的session是不共享的)。也就是說如果該廣播地址下的所有Tomcat實例都會共享Session,那麼假如有幾個互不相關的集羣,就可能造成Session複製浪費,所以爲了避免浪費就需要對節點多做點設置了,如下:
Xml代碼

 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">    
        <Channel className="org.apache.catalina.tribes.group.GroupChannel">    
            <Membership className="org.apache.catalina.tribes.membership.McastService"    
                address="228.0.0.4"    
                port="45564"    
                frequency="500"    
                dropTime="3000"/>    
        </Channel>    
    </Cluster>  

加了一個Channel,裏面包了個Membership,咱們要關注的就是membership的port屬性和address屬性,不同的集羣設置不同的port值或address值,從目前的使用來看,基本上是隔離開了。

**步驟二:**修改項目的web.xml文件:
web.xml文件的修改很簡單:只需要在節點中添加這個節點就可以了。
OK,有了這二步就實現了Tomcat的集羣和Session的共享了。

在這裏插入圖片描述

希望對讀到的小夥伴有用,對於這種高併發,高性能,高可用的相關知識,想要進入大廠是必須要掌握的。所以我對自己的要求也是每天能有一定進步,小夥伴們一起加油哦!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章