【大型網站技術實踐】初級篇:藉助Nginx搭建反向代理伺服器(轉)

来源:http://www.cnblogs.com/wajika/archive/2016/11/20/6082116.html
-Advertisement-
Play Games

【大型網站技術實踐】初級篇:藉助Nginx搭建反向代理伺服器(轉) 出處:http://edisonchou.cnblogs.com/ 一、反向代理:Web伺服器的“經紀人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連接請求,然後將 ...


【大型網站技術實踐】初級篇:藉助Nginx搭建反向代理伺服器(轉)

出處:http://edisonchou.cnblogs.com/

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

1.1 反向代理初印象

  反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連接請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連接的客戶端,此時代理伺服器對外就表現為一個伺服器

lbs

  從上圖可以看出:反向代理伺服器位於網站機房,代理網站Web伺服器接收Http請求,對請求進行轉發。

1.2 反向代理的作用

  ①保護網站安全:任何來自Internet的請求都必須先經過代理伺服器;

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

  ③實現負載均衡:充當負載均衡伺服器均衡地分發請求,平衡集群中各個伺服器的負載壓力;

lb

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

2.1 Nginx是神馬?

  Nginx是一款輕量級的網頁伺服器、反向代理器以及電子郵件代理伺服器。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。

Source:Nginx(發音同engine x),它是由俄羅斯程式員Igor Sysoev所開發的。起初是供俄國大型的門戶網站及搜索引擎Rambler(俄語:Рамблер)使用。此軟體BSD-like協議下發行,可以在UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系統中運行。

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

2.2 Nginx的應用現狀

  Nginx 已經在俄羅斯最大的門戶網站── Rambler Mediawww.rambler.ru)上運行了3年時間,同時俄羅斯超過20%的虛擬主機平臺採用Nginx作為反向代理伺服器。

  在國內,已經有 淘寶、新浪博客、新浪播客、網易新聞、六間房、56.com、Discuz!、水木社區、豆瓣、YUPOO、海內、迅雷線上 等多家網站使用 Nginx 作為Web伺服器或反向代理伺服器。

2.3 Nginx的核心特點

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

  (2)配置異常簡單:非常容易上手。配置風格跟程式開發一樣,神一般的配置;

  (3)非阻塞、高併發連接:數據複製時,磁碟I/O的第一階段是非阻塞的。官方測試能夠支撐5萬併發連接,在實際生產環境中跑到2~3萬併發連接數。(這得益於Nginx使用了最新的epoll模型);

PS:對於一個Web伺服器來說,首先看一個請求的基本過程:建立連接---接收數據---發送數據,在系統底層看來 :上述過程(建立連接---接收數據---發送數據)在系統底層就是讀寫事件

①如果採用阻塞調用的方式,當讀寫事件沒有準備好時,必然不能夠進行讀寫事件,那麼久只好等待,等事件準備好了,才能進行讀寫事件,那麼請求就會被耽擱 。

②既然沒有準備好阻塞調用不行,那麼採用非阻塞調用方式。非阻塞就是:事件馬上返回,告訴你事件還沒準備好呢,你慌什麼,過會再來吧。好吧,你過一會,再來檢查一下事件,直到事件準備好了為止,在這期間,你就可以先去做其它事情,然後再來看看事件好了沒。雖然不阻塞了,但你得不時地過來檢查一下事件的狀態,你可以做更多的事情了,但帶來的開銷也是不小的。

  (4)事件驅動:通信機制採用epoll模型,支持更大的併發連接。

①非阻塞通過不斷檢查事件的狀態來判斷是否進行讀寫操作,這樣帶來的開銷很大,因此就有了非同步非阻塞的事件處理機制。這種機制讓你可以同時監控多個事件,調用他們是阻塞的,但可以設置超時時間,在超時時間之內,如果有事件準備好了,就返回。這種機制解決了上面阻塞調用與非阻塞調用的兩個問題。

②以epoll模型為例:當事件沒有準備好時,就放入epoll(隊列)裡面。如果有事件準備好了,那麼就去處理;如果事件返回的是EAGAIN,那麼繼續將其放入epoll裡面。從而,只要有事件準備好了,我們就去處理它,只有當所有事件都沒有準備好時,才在epoll裡面等著。這樣,我們就可以併發處理大量的併發了,當然,這裡的併發請求,是指未處理完的請求,線程只有一個,所以同時能處理的請求當然只有一個了,只是在請求間進行不斷地切換而已,切換也是因為非同步事件未準備好,而主動讓出的。這裡的切換是沒有任何代價,你可以理解為迴圈處理多個準備好的事件,事實上就是這樣的。

③與多線程方式相比,這種事件處理方式是有很大的優勢的,不需要創建線程,每個請求占用的記憶體也很少,沒有上下文切換,事件處理非常的輕量級,併發數再多也不會導致無謂的資源浪費(上下文切換)。對於IIS伺服器,每個請求會獨占一個工作線程,當併發數上到幾千時,就同時有幾千的線程在處理請求了。這對操作系統來說,是個不小的挑戰:因為線程帶來的記憶體占用非常大,線程的上下文切換帶來的cpu開銷很大,自然性能就上不去,從而導致在高併發場景下性能下降嚴重。

總結:通過非同步非阻塞的事件處理機制,Nginx實現由進程迴圈處理多個準備好的事件,從而實現高併發和輕量級。 

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

PS:Master-Worker設計模式核心思想是將原來串列的邏輯並行化,並將邏輯拆分成很多獨立模塊並行執行。其中主要包含兩個主要組件Master和Worker,Master主要將邏輯進行拆分,拆分為互相獨立的部分,同時維護了Worker隊列,將每個獨立部分下發到多個Worker並行執行,Worker主要進行實際邏輯計算,並將結果返回給Master。

問:nginx採用這種進程模型有什麼好處?

答:採用獨立的進程,可以讓互相之間不會影響,一個進程退出後,其它進程還在工作,服務不會中斷,Master進程則很快重新啟動新的Worker進程。當然,Worker進程的異常退出,肯定是程式有bug了,異常退出,會導致當前Worker上的所有請求失敗,不過不會影響到所有請求,所以降低了風險。

  (6)記憶體消耗小:處理大併發的請求記憶體消耗非常小。在3萬併發連接下,開啟的10個Nginx 進程才消耗150M記憶體(15M*10=150M)。

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

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

  (9)穩定性高:用於反向代理,宕機的概率微乎其微。

三、構建實戰:Nginx+IIS構築Web伺服器集群的負載均衡

  這裡我們主要在Windows環境下,通過將同一個Web網站部署到不同伺服器的IIS上,再通過一個統一的Nginx反響代理伺服器對外提供統一訪問接入,實現一個最簡化的反向代理和負載均衡服務。但是,受限於實驗條件,我們這裡主要在一臺電腦上進行反向代理、IIS集群的模擬,具體的實驗環境如下圖所示:我們將nginx服務和web網站都部署在一臺電腦上,nginx監聽http80埠,而web網站分別以不同的埠號(這裡是8050及8060)部署在同一個IIS伺服器上,用戶訪問localhost時,nginx作為反向代理將請求均衡地轉發給兩個IIS中不同埠的Web應用程式進行處理。雖然實驗環境很簡單而且有限,但是對於一個簡單的負載均衡效果而言,本文是可以達到並且展示的。

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)總結:在真實環境中,構建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")

  ③在同一個目錄下創建一個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>
複製代碼 複製代碼

  ④在命令行下執行以下命令,以便將其註冊成Windows服務:nginx-service.exe install

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

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

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

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

    •nginx進程數,建議設置為等於CPU總核心數          •單個進程最大連接數,那麼該伺服器的最大連接數=連接數*進程數

  (2)Nginx的基本配置:

    •監聽埠一般都為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對於靜態文件的緩存配置

  為了提高響應速度,減輕真實伺服器的負載,對於靜態資源我們可以在反向代理伺服器中進行緩存,這也是反向代理伺服器的一個重要的作用。

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

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

  expires 7d:過期時效為7天,靜態文件不怎麼更新,過期時效可以設大一點,如果頻繁更新,則可以設置得小一點;

  TIPS:下麵的樣式、腳本緩存配置同這裡一樣,只是定位的文件夾不一樣而已,不再贅述。

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

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

  (4)在nginx服務文件夾中創建靜態資源文件夾,並要緩存的靜態文件拷貝進去:這裡我主要將Web程式中用到的image、css以及js文件拷貝了進去;

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

3.5 簡單測試Nginx反向代理實現負載均衡效果

  (1)第一次訪問http://localhost/Default.aspx時從127.0.0.1:8050處理響應返回結果

  (2)第二次訪問http://localhost/Default.aspx時從127.0.0.1:8060處理響應返回結果

  (3)多次訪問http://localhost/Default.aspx時的截屏:

學習小結

  在本文中,藉助了Nginx這個神器簡單地在Windows環境下搭建了一個反向代理服務,並模擬了一個IIS伺服器集群的負載均衡效果。從這個DEMO中,我們可以簡單地感受到反向代理為我們所做的事情,並體會負載均衡是怎麼一回事。但是,在目前大多數的應用中,都會將Nginx部署在Linux伺服器中,並且會做一些針對負載均衡的優化配置,這裡我們所做的僅僅就是一個小小的使用而已(just修改一下配置文件)。不過,萬丈高樓平地起,前期的小小體會,也會幫助我們向後期的深入學習奠定一點點的基礎。

  突然在QQ空間里看到了朋友送的禮物,猛然發現今天居然是我的陽曆生日,好吧,我祝我自己生日快樂,希望自己在未來的日子中能夠做更多的實踐,分享更多的內容。當然,如果你覺得本文還可以,那也麻煩點個贊,不要吝嗇你的滑鼠左鍵喲。

參考資料

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

(2)特種兵-AK47,《正向代理與反向代理的區別》: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,《處理大併發之對非同步非阻塞的理解》: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://edisonchou.cnblogs.com/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝Linux時一般會自動識別windows系統並添加引導項,而 CentOS 預設不支持 NTFS 分區,CentOS7採用了Grub2,與CentOS6有區別。手動引導windows分區修改配置稍不一樣。 一、自動尋找分區 網上不少使用命令: grub2-mkconfig -o /boot/gr ...
  • 1.帶緩存和不帶緩存 系統調用是不帶緩存的,使用它編寫程式,需要程式員設置緩存;庫函數是帶緩存的,不需設置緩存。 2.三個位元組流 程式執行時自動打開三個位元組流,標準輸入、標準輸入和標準錯誤。 3.標準輸出重定向 4.標準輸入重定向 5.標準錯誤重定向 6.管道 可以將一個命令的位元組流輸出導向另一個命 ...
  • top 幾個磁碟fdisk -l 磁碟空間 df -lhdf -al 查看進程:ps -ef“grep java殺死進程:kill -9 進程號 more中過濾 more xxx |grep www.makaidong.com 安裝linux後配置ip Vim /etc/sysconfig/netw ...
  • 1.進入vi的命令 vi filename :打開或新建文件,並將游標置於第一行首 【新建文件】vi +n filename :打開文件,並將游標置於第n行首 【比如:某個shell報錯的行數時使用】vi + filename :打開文件,並將游標置於最後一行首 【追加功能】vi +/pattern ...
  • 命令是一種可執行文件,包括:關鍵字 參數。 1.顯示目錄中的文件 2.查詢工作目錄 3.改變文件許可權mask 4.以root身份執行命令 5.查看幫助 6.創建文件 7.複製文件 8.移動文件 9.刪除文件 10.創建目錄 11.刪除空目錄 12.改變文件訪問許可權 13.改變文件的擁有者 14.改變 ...
  • 新的2016MBP終於發佈了,作為把蘋果電腦裝WIN使用的人,等候很久之後,終於可以行動了。 1、之前的2013款Macbook Air 2013年之前一直用的是DELL電腦,由於DELL鍵盤左下角的Fn鍵在Ctrl鍵的右側,已經慣了多年,所以一直對於ThinkPad和Apple這樣Fn和Ctrl鍵... ...
  • spi子系統之驅動SSD1306 OLED 接觸Linux之前,曾以為讀源碼可以更快的學習軟體,於是前幾個博客都是一邊讀源碼一邊添加註釋,甚至精讀到每一行代碼,實際上效果並不理想,看過之後就忘記了。主要原因是沒理解透程式架構,各個模塊之間的關係,如何聯繫在一起,再加上沒有實例驗證。後來逐漸發現,理解 ...
  • 情況描述: 當安裝某些軟體後,磁碟根目錄中多出了msdia80.dll文件,該文件顯示為2006年12月1日,884KB。 原因: 當使用64位操作系統時,在電腦上安裝 Microsoft Visual C++ 2005 可再發行組件時, Msdia80.dll文件被安裝在啟動驅動器的根文件夾中。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...