Nginx初探

一、 概念

Nginx——Ngine X,是一款自由的、開源的、高性能HTTP服務器和反向代理服務器;也是一個IMAP、POP3、SMTP代理服務器;也就是說Nginx本身就可以託管網站(類似於Tomcat一樣),進行Http服務處理,也可以作爲反向代理服務器使用。

Nginx 解決了服務器的C10K(就是在一秒之內連接客戶端的數目爲10k即1萬)問題。它的設計不像傳統的服務器那樣使用線程處理請求,而是一個更加高級的機制—事件驅動機制,是一種異步事件驅動結構。

雖然目前Nginx的份額在市場上只佔很少部分,但是其高性能和低消耗內存的結構,使得其越來越普遍,典型的一個應用就是我們可以使用Nginx作爲反向代理進行網站的負載均衡器。例如:Wordpress、GitHub等知名的網站都使用到了Nginx。

注:C10K問題可以參考: 
http://segmentfault.com/a/1190000000343620

http://www.csdn.net/article/2013-05-16/2815317-The-Secret-to-10M-Concurrent-Connections

二、 正向代理和反向代理

首先,代理服務器一般指局域網內部的機器通過代理服務器發送請求到互聯網上的服務器,代理服務器一般作用在客戶端。例如:GoAgent翻牆軟件。我們的客戶端在進行翻牆操作的時候,我們使用的正是正向代理,通過正向代理的方式,在我們的客戶端運行一個軟件,將我們的HTTP請求轉發到其他不同的服務器端,實現請求的分發。

這裏寫圖片描述

反向代理服務器作用在服務器端,它在服務器端接收客戶端的請求,然後將請求分發給具體的服務器進行處理,然後再將服務器的相應結果反饋給客戶端。Nginx就是一個反向代理服務器軟件。

這裏寫圖片描述

從上圖可以看出:客戶端必須設置正向代理服務器,當然前提是要知道正向代理服務器的IP地址,還有代理程序的端口。 
反向代理正好與正向代理相反,對於客戶端而言代理服務器就像是原始服務器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將獲得的內容返回給客戶端。

這裏寫圖片描述

三、服務器的類型:

1、Web服務器:提供Http的訪問,例如Nginx、Apache、IIS等,雖然Tomcat也能夠實現,但這並不是他的主要功能,而且性能也遠不如專門的Web服務器; 
2、應用程序服務器:能夠用於應用程序的運行; 
3、代理服務器:代理服務器通常是客戶端訪問的一種行爲,在整個客戶端訪問服務器的過程中有着重要的作用; 
4、反向代理 
5、後臺服務器 
6、CDN緩存服務器:它是緩存服務器的角色,而且是反向代理的應用,在網站部署的時候,他算是一種策略,對於遠距離訪問的解決方案。

四、 Nginx的特點

  Ø 跨平臺:可以在大多數Unix like 系統編譯運行。而且也有Windows的移植版本。 
  Ø 配置異常簡單:非常的簡單,易上手。 
  Ø 非阻塞、高併發連接:數據複製時,磁盤I/O的第一階段是非阻塞的。官方測試能支持5萬併發連接,實際生產中能跑2~3萬併發連接數(得益於Nginx採用了最新的epoll事件處理模型(消息隊列)。 
  Ø Nginx代理和後端Web服務器間無需長連接; 
  Ø Nginx接收用戶請求是異步的,即先將用戶請求全部接收下來,再一次性發送到後端Web服務器,極大減輕後端Web服務器的壓力。 
  Ø 發送響應報文時,是邊接收來自後端Web服務器的數據,邊發送給客戶端。 
  Ø 網絡依賴性低,理論上只要能夠ping通就可以實施負載均衡,而且可以有效區分內網、外網流量。 
  Ø 支持內置服務器檢測。Nginx能夠根據應用服務器處理頁面返回的狀態碼、超時信息等檢測服務器是否出現故障,並及時返回錯誤的請求重新提交到其它節點上。 
  Ø 採用Master/worker多進程工作模式 
  Ø 此外還有內存消耗小、成本低廉(比F5硬件負載均衡器廉價太多)、節省帶寬、穩定性高等特點。

五、Nginx的基本功能

Nginx的功能包括基本HTTP功能和擴展功能。和Apache服務器一樣,Nginx服務器爲了提供更多的功能並且能夠有效地擴展這些功能。每一個模塊都提供了一個功能,通過編譯這些功能模塊來實現功能的擴展。

1、基本HTTP功能

a)提供靜態文件和index文件,處理靜態文件,索引文件以及自動索引,打開文件描述符緩存;
b)使用緩存加速反向代理,反向代理加速(無緩存),簡單的負載均衡和容錯;
c)使用緩存機制加速遠程FastCGI,簡單的負載均衡和容錯;
d)模塊化的結構。過濾器包括gzipping,byte ranges,chunked responses,以及 SSI-filter。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求併發處理;
e)支持SSL 和 TLS SNI 支持;
f)IMAP/POP3代理服務功能;
g)使用外部 HTTP 認證服務器重定向用戶到 IMAP/POP3 後端;
h)使用外部 HTTP 認證服務器認證用戶後連接重定向到內部的 SMTP 後端;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2、其他HTTP功能

a)基於名稱和基於IP的虛擬服務器;
b)支持Keep-alive和管道連接;
c)靈活的配置和重新配置、在線升級的時候不用中斷客戶訪問的處理;
d)訪問日誌的格式,緩存日誌寫入和快速日誌輪循;
e)3xx-5xx錯誤代碼重定向;
f)速度限制
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

六、Nginx的基本模塊

Nginx的核心模塊包括內核模塊和事件驅動模塊,即:CoreModule和EventsModule;另外還有第三方模塊 HTTP內核模塊,HttpCoreModule,它是Nginx服務器的核心模塊。

CoreModule和EventsModule模塊的配置相對於HttpCoreModule會少一些,但是它們的配置將會影響系統的性能,而非功能上的差異。

1、CoreModule用於控制Nginx服務器的基本功能; 
2、EventsModule用於控制Nginx如何處理連接。該模塊的指令的一些參數會對應用系統的性能產生重要的影響; 
3、HttpCoreModule提供HTTP訪問Nginx服務器,該模塊是不能缺少的。

七、 內部進程模型

這裏寫圖片描述

Nginx是以多進程的方式來工作的,當然Nginx也是支持多線程的方式的,只是我們主流的方式還是多進程的方式,也是Nginx的默認方式。Nginx採用多進程的方式有諸多好處。

Nginx在啓動後,會有一個master進程和多個worker進程。master進程主要用來管理worker進程,包含:接收來自外界的信號,向各worker進程發送信號,監控 worker進程的運行狀態,當worker進程退出後(異常情況下),會自動重新啓動新的worker進程。而基本的網絡事件,則是放在worker進程中來處理了。多個worker進程之間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的。一個請求,只可能在一個worker進程中處理,一個worker進程,不可能處理其它進程的請求。worker進程的個數是可以設置的,一般我們會設置與機器CPU核數一致,這裏面的原因與Nginx的進程模型以及事件處理模型是分不開的。

八、 處理請求

  首先,Nginx在啓動時,會解析配置文件,得到需要監聽的端口與IP地址,然後在Nginx的master進程裏面,先初始化好這個監控的socket(創建socket,設置addrreuse等選項,綁定到指定的IP地址端口,再listen),然後再fork(一個現有進程可以調用fork函數創建一個新進程。由fork創建的新進程被稱爲子進程 )出多個子進程出來,然後子進程會競爭accept新的連接。 
  此時,客戶端就可以向Nginx發起連接了。當客戶端與Nginx進行三次握手,與Nginx建立好一個連接後,某一個子進程會accept成功,得到這個建立好的連接的socket,然後創建Nginx對連接的封裝,即ngx_connection_t結構體。 
  接着,設置讀寫事件處理函數並添加讀寫事件來與客戶端進行數據的交換。最後,Nginx或客戶端來主動關掉連接,到此,一個連接就壽終正寢了。

九、 實際應用

由於Nginx是由俄羅斯人寫的,所以,Nginx 已經在俄羅斯最大的門戶網站── Rambler Media(www.rambler.ru)上運行了3年時間,同時俄羅斯超過20%的虛擬主機平臺採用Nginx作爲反向代理服務器。

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

這裏寫圖片描述

在近期一些項目的開發過程中,主要是使用Nginx和Tomcat來搭建高性能負載均衡集羣,即使用Nginx的反向代理功能來實現請求的分發,關於Nginx和Tomcat的組合使用,不在這裏重複造輪子,請參考免費文檔: 
http://download.csdn.net/detail/u010870518/9261395

發佈了6 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章