借助Nginx搭建反向代理服務器

借助Nginx搭建反向代理服務器

【大型網站技術實踐】初級篇:借助Nginx搭建反向代理服務器

一、反向代理:Web服務器的“經紀人”

1.1 反向代理初印象
反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發(fā)給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個服務器邻吞。

從上圖可以看出:反向代理服務器位于網站機房,代理網站Web服務器接收Http請求,對請求進行轉發(fā)拯杠。

1.2 反向代理的作用
  ①保護網站安全:任何來自Internet的請求都必須先經過代理服務器啃奴;

②通過配置緩存功能加速Web請求:可以緩存真實Web服務器上的某些靜態(tài)資源潭陪,減輕真實Web服務器的負載壓力;

③實現負載均衡:充當負載均衡服務器均衡地分發(fā)請求最蕾,平衡集群中各個服務器的負載壓力依溯;

  

lb

二、初識Nginx:簡單卻不平凡

2.1 Nginx是神馬瘟则?

Nginx是一款輕量級的網頁服務器黎炉、反向代理器以及電子郵件代理服務器。其將源代碼以類BSD許可證的形式發(fā)布醋拧,因它的穩(wěn)定性慷嗜、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名丹壕。

Source:Nginx(發(fā)音同engine x)庆械,它是由俄羅斯程序員Igor Sysoev所開發(fā)的。起初是供俄國大型的門戶網站及搜索引擎Rambler(俄語:Рамблер)使用雀费。此軟件BSD-like協議下發(fā)行干奢,可以在UNIX、GNU/Linux盏袄、BSD忿峻、Mac OS X薄啥、Solaris,以及Microsoft Windows等操作系統(tǒng)中運行逛尚。

說到Web服務器垄惧,Apache服務器和IIS服務器是兩大巨頭;但是運行速度更快绰寞、更靈活的對手:Nginx 正在迎頭趕上到逊。

2.2 Nginx的應用現狀
  Nginx 已經在俄羅斯最大的門戶網站── Rambler Media(www.rambler.ru)上運行了3年時間,同時俄羅斯超過20%的虛擬主機平臺采用Nginx作為反向代理服務器滤钱。

在國內觉壶,已經有 淘寶、新浪博客件缸、新浪播客铜靶、網易新聞、六間房他炊、56.com争剿、Discuz!、水木社區(qū)痊末、豆瓣蚕苇、YUPOO、海內凿叠、迅雷在線 等多家網站使用 Nginx 作為Web服務器或反向代理服務器涩笤。

2.3 Nginx的核心特點
  (1)跨平臺:Nginx 可以在大多數 Unix like OS編譯運行,而且也有Windows的移植版本盒件;

(2)配置異常簡單:非常容易上手辆它。配置風格跟程序開發(fā)一樣,神一般的配置履恩;

(3)非阻塞、高并發(fā)連接:數據復制時呢蔫,磁盤I/O的第一階段是非阻塞的切心。官方測試能夠支撐5萬并發(fā)連接,在實際生產環(huán)境中跑到2~3萬并發(fā)連接數片吊。(這得益于Nginx使用了最新的epoll模型)绽昏;

PS:對于一個Web服務器來說,首先看一個請求的基本過程:建立連接---接收數據---發(fā)送數據俏脊,在系統(tǒng)底層看來 :上述過程(建立連接---接收數據---發(fā)送數據)在系統(tǒng)底層就是讀寫事件全谤。

如果采用阻塞調用的方式,當讀寫事件沒有準備好時爷贫,必然不能夠進行讀寫事件认然,那么久只好等待补憾,等事件準備好了,才能進行讀寫事件卷员,那么請求就會被耽擱 盈匾。

既然沒有準備好阻塞調用不行,那么采用非阻塞調用方式毕骡。非阻塞就是:事件馬上返回削饵,告訴你事件還沒準備好呢,你慌什么未巫,過會再來吧窿撬。好吧,你過一會叙凡,再來檢查一下事件劈伴,直到事件準備好了為止,在這期間狭姨,你就可以先去做其它事情宰啦,然后再來看看事件好了沒。雖然不阻塞了饼拍,但你得不時地過來檢查一下事件的狀態(tài)磕蒲,你可以做更多的事情了,但帶來的開銷也是不小的近她。

(4)事件驅動:通信機制采用epoll模型湖蜕,支持更大的并發(fā)連接。

①非阻塞通過不斷檢查事件的狀態(tài)來判斷是否進行讀寫操作叨吮,這樣帶來的開銷很大辆布,因此就有了異步非阻塞的事件處理機制。這種機制讓你可以同時監(jiān)控多個事件茶鉴,調用他們是阻塞的锋玲,但可以設置超時時間,在超時時間之內涵叮,如果有事件準備好了惭蹂,就返回。這種機制解決了上面阻塞調用與非阻塞調用的兩個問題割粮。

②以epoll模型為例:當事件沒有準備好時盾碗,就放入epoll(隊列)里面。如果有事件準備好了舀瓢,那么就去處理廷雅;如果事件返回的是EAGAIN,那么繼續(xù)將其放入epoll里面。從而航缀,只要有事件準備好了商架,我們就去處理它,只有當所有事件都沒有準備好時谬盐,才在epoll里面等著甸私。這樣,我們就可以并發(fā)處理大量的并發(fā)了飞傀,當然皇型,這里的并發(fā)請求,是指未處理完的請求砸烦,線程只有一個弃鸦,所以同時能處理的請求當然只有一個了,只是在請求間進行不斷地切換而已幢痘,切換也是因為異步事件未準備好唬格,而主動讓出的。這里的切換是沒有任何代價颜说,你可以理解為循環(huán)處理多個準備好的事件购岗,事實上就是這樣的。

③與多線程方式相比门粪,這種事件處理方式是有很大的優(yōu)勢的喊积,不需要創(chuàng)建線程,每個請求占用的內存也很少玄妈,沒有上下文切換乾吻,事件處理非常的輕量級,并發(fā)數再多也不會導致無謂的資源浪費(上下文切換)拟蜻。對于IIS服務器绎签,每個請求會獨占一個工作線程,當并發(fā)數上到幾千時酝锅,就同時有幾千的線程在處理請求了诡必。這對操作系統(tǒng)來說,是個不小的挑戰(zhàn):因為線程帶來的內存占用非常大搔扁,線程的上下文切換帶來的cpu開銷很大擒权,自然性能就上不去,從而導致在高并發(fā)場景下性能下降嚴重阁谆。

總結:通過異步非阻塞的事件處理機制,Nginx實現由進程循環(huán)處理多個準備好的事件愉老,從而實現高并發(fā)和輕量級场绿。

(5)Master/Worker結構:一個master進程,生成一個或多個worker進程嫉入。

PS:Master-Worker設計模式核心思想是將原來串行的邏輯并行化焰盗,并將邏輯拆分成很多獨立模塊并行執(zhí)行璧尸。其中主要包含兩個主要組件Master和Worker,Master主要將邏輯進行拆分熬拒,拆分為互相獨立的部分爷光,同時維護了Worker隊列,將每個獨立部分下發(fā)到多個Worker并行執(zhí)行澎粟,Worker主要進行實際邏輯計算蛀序,并將結果返回給Master。

:nginx采用這種進程模型有什么好處活烙?

:采用獨立的進程徐裸,可以讓互相之間不會影響,一個進程退出后啸盏,其它進程還在工作重贺,服務不會中斷,Master進程則很快重新啟動新的Worker進程回懦。當然气笙,Worker進程的異常退出,肯定是程序有bug了怯晕,異常退出潜圃,會導致當前Worker上的所有請求失敗,不過不會影響到所有請求贫贝,所以降低了風險秉犹。

(6)內存消耗小:處理大并發(fā)的請求內存消耗非常小。在3萬并發(fā)連接下稚晚,開啟的10個Nginx 進程才消耗150M內存(15M*10=150M)崇堵。

(7)內置的健康檢查功能:如果 Nginx 代理的后端的某臺 Web 服務器宕機了,不會影響前端訪問客燕。

(8)節(jié)省帶寬:支持 GZIP 壓縮鸳劳,可以添加瀏覽器本地緩存的 Header 頭。

(9)穩(wěn)定性高:用于反向代理也搓,宕機的概率微乎其微赏廓。

三、構建實戰(zhàn):Nginx+IIS構筑Web服務器集群的負載均衡

這里我們主要在Windows環(huán)境下傍妒,通過將同一個Web網站部署到不同服務器的IIS上幔摸,再通過一個統(tǒng)一的Nginx反響代理服務器對外提供統(tǒng)一訪問接入,實現一個最簡化的反向代理和負載均衡服務颤练。但是既忆,受限于實驗條件,我們這里主要在一臺計算機上進行反向代理、IIS集群的模擬患雇,具體的實驗環(huán)境如下圖所示:我們將nginx服務和web網站都部署在一臺計算機上跃脊,nginx監(jiān)聽http80端口,而web網站分別以不同的端口號(這里是8050及8060)部署在同一個IIS服務器上苛吱,用戶訪問localhost時酪术,nginx作為反向代理將請求均衡地轉發(fā)給兩個IIS中不同端口的Web應用程序進行處理。雖然實驗環(huán)境很簡單而且有限翠储,但是對于一個簡單的負載均衡效果而言绘雁,本文是可以達到并且展示的。

 

3.1 準備一個ASP.NET網站部署到IIS服務器集群中
 ≌煤ァ(1)在VS中新建一個ASP.NET Web應用程序咧七,但是為了在一臺計算機上展示效果,我們將這個Web程序復制一份任斋,并修改兩個Web程序的Default.aspx继阻,讓其的首頁顯示不同的一點信息。這里Web1展示的是“The First Web:”废酷,而Web2展示的則是“The Second Web”瘟檩。

(2)調試運行,看看兩個網站的效果如何澈蟆?

①Web1的展示效果:


②Web2的展示效果:

③部署到IIS中墨辛,分配不同的端口號:這里我選擇了Web1:8050,Web2:8060

(3)總結:在真實環(huán)境中趴俘,構建Web應用服務器集群的實現是將同一個Web應用程序部署到Web服務器集群中的多個Web服務器上睹簇。

3.2 下載Nginx并部署到服務器中作為自啟動的Windows服務
  (1)到Nginx官網下載Nginx的Windows版本:http://nginx.org/en/download.html(這里我們使用nginx/Windows-1.4.7版本進行實驗寥闪,本文底部有下載地址)

(2)解壓到磁盤任意目錄太惠,例如這里我解壓到了:D:\Servers\nginx-1.4.7

(3)啟動、停止和重新加載服務:通過cmd以守護進程方式啟動nginx.exe:start nginx.exe疲憋,停止服務:nginx -s stop凿渊,重新加載配置:nginx -s reload

(4)每次以cmd方式啟動Nginx服務不符合實際要求缚柳,于是我們想到將其注冊為Windows服務埃脏,并設置為自動啟動模式。這里秋忙,我們使用一個不錯的小程序:“Windows Service Wrapper”彩掐,將nginx.exe注冊為Windows服務,具體的步湊如下:

①下載最新版的 Windows Service Wrapper 程序灰追,比如我下載的名稱是 "winsw-1.8-bin.exe"(本文底部有下載地址)堵幽,然后把它命名成你想要的名字(比如: "nginx-service.exe"旁壮,當然,你也可以不改名)

②將重命名后的 nginx-service.exe 復制到 nginx 的安裝目錄(比如谐檀,我這里是 "D:\Servers\nginx-1.4.7")

③在同一個目錄下創(chuàng)建一個Windows Service Wrapper 的XML配置文件,名稱必須與第一步重命名時使用的名稱一致(比如我這里是 "nginx-service.xml", 如果裁奇,你沒有重命名桐猬,則應該是 "winsw-1.8-bin.xml"),這個XML的內容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<service>
<id>nginx</id>
<name>Nginx Service</name>
<description>High Performance Nginx Service</description>
<executable>D:\Servers\nginx-1.4.7\nginx.exe</executable>
<logpath>D:\Servers\nginx-1.4.7\</logpath>
<logmode>roll</logmode>
<depend></depend>
<startargument>-p D:\Servers\nginx-1.4.7</startargument>
<stopargument>-p D:\Servers\nginx-1.4.7 -s stop</stopargument>
</service>

④在命令行下執(zhí)行以下命令刽肠,以便將其注冊成Windows服務:nginx-service.exe install

⑤接下來就可以在Windows服務列表看到Nginx服務了溃肪,這里我們可以將其設置為自動啟動了:

(5)總結:在Windows環(huán)境中,要對外提供的Windows服務一般都要將其啟動類型設置為自動音五。

3.3 修改Nginx核心配置文件nginx.conf

(1)進程數與每個進程的最大連接數:

?nginx進程數惫撰,建議設置為等于CPU總核心數
    
    ?單個進程最大連接數,那么該服務器的最大連接數=連接數*進程數

(2)Nginx的基本配置:

?監(jiān)聽端口一般都為http端口:80;
    ?域名可以有多個躺涝,用空格隔開:例如 server_name www.ha97.com ha97.com;


 〕辍(3)負載均衡列表基本配置:

?location / {}:對aspx后綴的進行負載均衡請求,假如我們要對所有的aspx后綴的文件進行負載均衡時坚嗜,可以這樣寫:location ~ .*.aspx$ {}

?proxy_pass:請求轉向自定義的服務器列表夯膀,這里我們將請求都轉向標識為http://cuitccol.com的負載均衡服務器列表;


    ?在負載均衡服務器列表的配置中苍蔬,weight是權重诱建,可以根據機器配置定義權重(如果某臺服務器的硬件配置十分好,可以處理更多的請求碟绑,那么可以為其設置一個比較高的weight俺猿;而有一臺的服務器的硬件配置比較差,那么可以將前一臺的weight配置為weight=2格仲,后一臺差的配置為weight=1)押袍。weigth參數表示權值,權值越高被分配到的幾率越大抓狭;

(4)總結:最基本的Nginx配置差不多就是上面這些內容伯病,當然僅僅是最基礎的配置。(詳細的配置內容請下載底部的nginx-1.4.7詳細查看)

3.4 添加Nginx對于靜態(tài)文件的緩存配置
  為了提高響應速度否过,減輕真實服務器的負載午笛,對于靜態(tài)資源我們可以在反向代理服務器中進行緩存,這也是反向代理服務器的一個重要的作用苗桂。

(1)緩存靜態(tài)資源之圖片文件

root /nginx-1.4.7/staticresources/image:對于配置中提到的jpg/png等文件均定為到/nginx-1.4.7/staticresources/image文件夾中進行尋找匹配并將文件返回药磺;

expires 7d:過期時效為7天,靜態(tài)文件不怎么更新煤伟,過期時效可以設大一點癌佩,如果頻繁更新木缝,則可以設置得小一點;

TIPS:下面的樣式围辙、腳本緩存配置同這里一樣我碟,只是定位的文件夾不一樣而已,不再贅述姚建。

(2)緩存靜態(tài)資源之樣式文件

(3)緩存靜態(tài)資源之腳本文件

(4)在nginx服務文件夾中創(chuàng)建靜態(tài)資源文件夾矫俺,并要緩存的靜態(tài)文件拷貝進去:這里我主要將Web程序中用到的image、css以及js文件拷貝了進去掸冤;

(5)總結:通過配置靜態(tài)文件的緩存設置厘托,對于這些靜態(tài)文件的請求可以直接從反向代理服務器中直接返回,而無需再將這些靜態(tài)資源請求轉發(fā)到具體的Web服務器進行處理了稿湿,可以提高響應速度铅匹,減輕真實Web服務器的負載壓力。

學習小結

在本文中饺藤,借助了Nginx這個神器簡單地在Windows環(huán)境下搭建了一個反向代理服務包斑,并模擬了一個IIS服務器集群的負載均衡效果。從這個DEMO中策精,我們可以簡單地感受到反向代理為我們所做的事情舰始,并體會負載均衡是怎么一回事。但是咽袜,在目前大多數的應用中丸卷,都會將Nginx部署在Linux服務器中,并且會做一些針對負載均衡的優(yōu)化配置询刹,這里我們所做的僅僅就是一個小小的使用而已(just修改一下配置文件)谜嫉。不過,萬丈高樓平地起凹联,前期的小小體會沐兰,也會幫助我們向后期的深入學習奠定一點點的基礎。

參考資料

(1)丁胖胖蔽挠,《圖解正向代理住闯、反向代理與透明代理》:http://z00w00.blog.51cto.com/515114/1031287

(2)特種兵-AK47,《正向代理與反向代理的區(qū)別》:http://blog.csdn.net/m13666368773/article/details/8060481

(3)百度百科澳淑,Nginx:http://baike.baidu.com/view/926025.htm?fr=aladdin

(4)51CTO比原,《Nginx安裝配置與服務搭建專題》:http://os.51cto.com/art/201111/304611.htm

(5)紅黑聯盟,《Nginx配置文件nginx.conf中文詳解總結》:http://www.2cto.com/os/201212/176520.html

(6)360doc杠巡,《Linux下同步模式量窘、異步模式、阻塞調用與非阻塞調用總結》:http://www.360doc.com/content/13/0117/12/5073814_260691714.shtml (好文一篇氢拥,值得閱讀)

(7)e路相扶蚌铜,《同步锨侯、異步、阻塞與非阻塞》:http://www.cnblogs.com/zhangjun516/archive/2013/04/17/3025902.html

(8)feitianxuxue冬殃,《處理大并發(fā)之對異步非阻塞的理解》:http://blog.csdn.net/feitianxuxue/article/details/8936802

附件下載

(1)nginx-1.4.7:http://pan.baidu.com/s/1dD2C2zB

(2)winsw-1.8-bin.exe:http://pan.baidu.com/s/1kTihzk7

(3)SimpleNginxDemo:http://pan.baidu.com/s/1bnq5oYz

原文鏈接

http://www.cnblogs.com/edisonchou/p/4126742.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末囚痴,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子审葬,更是在濱河造成了極大的恐慌渡讼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耳璧,死亡現場離奇詭異,居然都是意外死亡展箱,警方通過查閱死者的電腦和手機旨枯,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來混驰,“玉大人攀隔,你說我怎么就攤上這事∑苷ィ” “怎么了昆汹?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長婴栽。 經常有香客問我满粗,道長,這世上最難降的妖魔是什么愚争? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任映皆,我火速辦了婚禮,結果婚禮上轰枝,老公的妹妹穿的比我還像新娘捅彻。我一直安慰自己,他們只是感情好鞍陨,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布步淹。 她就那樣靜靜地躺著,像睡著了一般诚撵。 火紅的嫁衣襯著肌膚如雪缭裆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天砾脑,我揣著相機與錄音幼驶,去河邊找鬼。 笑死韧衣,一個胖子當著我的面吹牛盅藻,可吹牛的內容都是我干的购桑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼氏淑,長吁一口氣:“原來是場噩夢啊……” “哼勃蜘!你這毒婦竟也來了?” 一聲冷哼從身側響起假残,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缭贡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辉懒,有當地人在樹林里發(fā)現了一具尸體阳惹,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年眶俩,在試婚紗的時候發(fā)現自己被綠了莹汤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡颠印,死狀恐怖纲岭,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情线罕,我是刑警寧澤止潮,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站钞楼,受9級特大地震影響喇闸,放射性物質發(fā)生泄漏。R本人自食惡果不足惜询件,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一仅偎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雳殊,春花似錦橘沥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仓洼,卻和暖如春介陶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背色建。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工哺呜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箕戳。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓某残,卻偏偏與公主長得像国撵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子玻墅,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容