...

Nginx 詳解:Nginx 是(shì)什麽? 能幹嘛?

2022-01-16

Nginx的(de)産生

沒有聽過Nginx?那麽一(yī / yì /yí)定聽過它的(de)"同行"Apache吧!Nginx同Apache一(yī / yì /yí)樣都是(shì)一(yī / yì /yí)種WEB服務器。基于(yú)REST架構風格,以(yǐ)統一(yī / yì /yí)資源描述符(Uniform Resources Identifier)URI或者統一(yī / yì /yí)資源定位符(Uniform Resources Locator)URL作爲(wéi / wèi)溝通依據,通過HTTP協議提供各種網絡服務。

然而(ér),這(zhè)些服務器在(zài)設計之(zhī)初受到(dào)當時(shí)環境的(de)局限,例如當時(shí)的(de)用戶規模,網絡帶寬,産品特點等局限并且各自的(de)定位和(hé / huò)發展都不(bù)盡相同。這(zhè)也(yě)使得各個(gè)WEB服務器有着各自鮮明的(de)特點。

Apache的(de)發展時(shí)期很長,而(ér)且是(shì)毫無争議的(de)世界第一(yī / yì /yí)大(dà)服務器。它有着很多優點:穩定、開源、跨平台等等。它出(chū)現的(de)時(shí)間太長了(le/liǎo),它興起的(de)年代,互聯網産業遠遠比不(bù)上(shàng)現在(zài)。所以(yǐ)它被設計爲(wéi / wèi)一(yī / yì /yí)個(gè)重量級的(de)。它不(bù)支持高并發的(de)服務器。在(zài)Apache上(shàng)運行數以(yǐ)萬計的(de)并發訪問,會導緻服務器消耗大(dà)量内存。操作系統對其進行進程或線程間的(de)切換也(yě)消耗了(le/liǎo)大(dà)量的(de)CPU資源,導緻HTTP請求的(de)平均響應速度降低。

這(zhè)些都決定了(le/liǎo)Apache不(bù)可能成爲(wéi / wèi)高性能WEB服務器,輕量級高并發服務器Nginx就(jiù)應運而(ér)生了(le/liǎo)。

俄羅斯的(de)工程師Igor Sysoev,他(tā)在(zài)爲(wéi / wèi)Rambler Media工作期間,使用C語言開發了(le/liǎo)Nginx。Nginx作爲(wéi / wèi)WEB服務器一(yī / yì /yí)直爲(wéi / wèi)Rambler Media提供出(chū)色而(ér)又穩定的(de)服務。

然後呢,Igor Sysoev将Nginx代碼開源,并且賦予自由軟件許可證。

由于(yú):

  • Nginx使用基于(yú)事件驅動架構,使得其可以(yǐ)支持數以(yǐ)百萬級别的(de)TCP連接

  • 高度的(de)模塊化和(hé / huò)自由軟件許可證使得第三方模塊層出(chū)不(bù)窮(這(zhè)是(shì)個(gè)開源的(de)時(shí)代啊~)

  • Nginx是(shì)一(yī / yì /yí)個(gè)跨平台服務器,可以(yǐ)運行在(zài)Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系統上(shàng)

  • 這(zhè)些優秀的(de)設計帶來(lái)的(de)是(shì)極大(dà)的(de)穩定性

所以(yǐ),Nginx火了(le/liǎo)!

Nginx的(de)用武之(zhī)地(dì / de)

Nginx是(shì)一(yī / yì /yí)款自由的(de)、開源的(de)、高性能的(de)HTTP服務器和(hé / huò)反向代理服務器;同時(shí)也(yě)是(shì)一(yī / yì /yí)個(gè)IMAP、POP3、SMTP代理服務器;Nginx可以(yǐ)作爲(wéi / wèi)一(yī / yì /yí)個(gè)HTTP服務器進行網站的(de)發布處理,另外Nginx可以(yǐ)作爲(wéi / wèi)反向代理進行負載均衡的(de)實現。

關于(yú)代理

說(shuō)到(dào)代理,首先我們要(yào / yāo)明确一(yī / yì /yí)個(gè)概念,所謂代理就(jiù)是(shì)一(yī / yì /yí)個(gè)代表、一(yī / yì /yí)個(gè)渠道(dào);

此時(shí)就(jiù)涉及到(dào)兩個(gè)角色,一(yī / yì /yí)個(gè)是(shì)被代理角色,一(yī / yì /yí)個(gè)是(shì)目标角色,被代理角色通過這(zhè)個(gè)代理訪問目标角色完成一(yī / yì /yí)些任務的(de)過程稱爲(wéi / wèi)代理操作過程;如同生活中的(de)專賣店~客人(rén)到(dào)adidas專賣店買了(le/liǎo)一(yī / yì /yí)雙鞋,這(zhè)個(gè)專賣店就(jiù)是(shì)代理,被代理角色就(jiù)是(shì)adidas廠家,目标角色就(jiù)是(shì)用戶。

正向代理

說(shuō)反向代理之(zhī)前,我們先看看正向代理,正向代理也(yě)是(shì)大(dà)家最常接觸的(de)到(dào)的(de)代理模式,我們會從兩個(gè)方面來(lái)說(shuō)關于(yú)正向代理的(de)處理模式,分别從軟件方面和(hé / huò)生活方面來(lái)解釋一(yī / yì /yí)下什麽叫正向代理。

在(zài)如今的(de)網絡環境下,我們如果由于(yú)技術需要(yào / yāo)要(yào / yāo)去訪問國(guó)外的(de)某些網站,此時(shí)你會發現位于(yú)國(guó)外的(de)某網站我們通過浏覽器是(shì)沒有辦法訪問的(de),此時(shí)大(dà)家可能都會用一(yī / yì /yí)個(gè)操作FQ進行訪問,FQ的(de)方式主要(yào / yāo)是(shì)找到(dào)一(yī / yì /yí)個(gè)可以(yǐ)訪問國(guó)外網站的(de)代理服務器,我們将請求發送給代理服務器,代理服務器去訪問國(guó)外的(de)網站,然後将訪問到(dào)的(de)數據傳遞給我們!

上(shàng)述這(zhè)樣的(de)代理模式稱爲(wéi / wèi)正向代理,正向代理最大(dà)的(de)特點是(shì)客戶端非常明确要(yào / yāo)訪問的(de)服務器地(dì / de)址;服務器隻清楚請求來(lái)自哪個(gè)代理服務器,而(ér)不(bù)清楚來(lái)自哪個(gè)具體的(de)客戶端;正向代理模式屏蔽或者隐藏了(le/liǎo)真實客戶端信息。來(lái)看個(gè)示意圖(我把客戶端和(hé / huò)正向代理框在(zài)一(yī / yì /yí)塊,同屬于(yú)一(yī / yì /yí)個(gè)環境,後面我有介紹):

客戶端必須設置正向代理服務器,當然前提是(shì)要(yào / yāo)知道(dào)正向代理服務器的(de)IP地(dì / de)址,還有代理程序的(de)端口。如圖。

總結來(lái)說(shuō):正向代理,"它代理的(de)是(shì)客戶端,代客戶端發出(chū)請求",是(shì)一(yī / yì /yí)個(gè)位于(yú)客戶端和(hé / huò)原始服務器(origin server)之(zhī)間的(de)服務器,爲(wéi / wèi)了(le/liǎo)從原始服務器取得内容,客戶端向代理發送一(yī / yì /yí)個(gè)請求并指定目标(原始服務器),然後代理向原始服務器轉交請求并将獲得的(de)内容返回給客戶端。客戶端必須要(yào / yāo)進行一(yī / yì /yí)些特别的(de)設置才能使用正向代理。

正向代理的(de)用途:
(1)訪問原來(lái)無法訪問的(de)資源,如Google
(2) 可以(yǐ)做緩存,加速訪問資源
(3)對客戶端訪問授權,上(shàng)網進行認證
(4)代理可以(yǐ)記錄用戶訪問記錄(上(shàng)網行爲(wéi / wèi)管理),對外隐藏用戶信息

反向代理

明白了(le/liǎo)什麽是(shì)正向代理,我們繼續看關于(yú)反向代理的(de)處理方式,舉例如我大(dà)天朝的(de)某寶網站,每天同時(shí)連接到(dào)網站的(de)訪問人(rén)數已經爆表,單個(gè)服務器遠遠不(bù)能滿足人(rén)民日益增長的(de)購買欲望了(le/liǎo),此時(shí)就(jiù)出(chū)現了(le/liǎo)一(yī / yì /yí)個(gè)大(dà)家耳熟能詳的(de)名詞:分布式部署;也(yě)就(jiù)是(shì)通過部署多台服務器來(lái)解決訪問人(rén)數限制的(de)問題;某寶網站中大(dà)部分功能也(yě)是(shì)直接使用Nginx進行反向代理實現的(de),并且通過封裝Nginx和(hé / huò)其他(tā)的(de)組件之(zhī)後起了(le/liǎo)個(gè)高大(dà)上(shàng)的(de)名字:Tengine,有興趣的(de)童鞋可以(yǐ)訪問Tengine的(de)官網查看具體的(de)信息:http://tengine.taobao.org/。那麽反向代理具體是(shì)通過什麽樣的(de)方式實現的(de)分布式的(de)集群操作呢,我們先看一(yī / yì /yí)個(gè)示意圖(我把服務器和(hé / huò)反向代理框在(zài)一(yī / yì /yí)塊,同屬于(yú)一(yī / yì /yí)個(gè)環境,後面我有介紹):

通過上(shàng)述的(de)圖解大(dà)家就(jiù)可以(yǐ)看清楚了(le/liǎo),多個(gè)客戶端給服務器發送的(de)請求,Nginx服務器接收到(dào)之(zhī)後,按照一(yī / yì /yí)定的(de)規則分發給了(le/liǎo)後端的(de)業務處理服務器進行處理了(le/liǎo)。此時(shí)~請求的(de)來(lái)源也(yě)就(jiù)是(shì)客戶端是(shì)明确的(de),但是(shì)請求具體由哪台服務器處理的(de)并不(bù)明确了(le/liǎo),Nginx扮演的(de)就(jiù)是(shì)一(yī / yì /yí)個(gè)反向代理角色。

客戶端是(shì)無感知代理的(de)存在(zài)的(de),反向代理對外都是(shì)透明的(de),訪問者并不(bù)知道(dào)自己訪問的(de)是(shì)一(yī / yì /yí)個(gè)代理。因爲(wéi / wèi)客戶端不(bù)需要(yào / yāo)任何配置就(jiù)可以(yǐ)訪問。

反向代理,"它代理的(de)是(shì)服務端,代服務端接收請求",主要(yào / yāo)用于(yú)服務器集群分布式部署的(de)情況下,反向代理隐藏了(le/liǎo)服務器的(de)信息。

反向代理的(de)作用:
(1)保證内網的(de)安全,通常将反向代理作爲(wéi / wèi)公網訪問地(dì / de)址,Web服務器是(shì)内網
(2)負載均衡,通過反向代理服務器來(lái)優化網站的(de)負載

項目場景

通常情況下,我們在(zài)實際項目操作時(shí),正向代理和(hé / huò)反向代理很有可能會存在(zài)在(zài)一(yī / yì /yí)個(gè)應用場景中,正向代理代理客戶端的(de)請求去訪問目标服務器,目标服務器是(shì)一(yī / yì /yí)個(gè)反向單利服務器,反向代理了(le/liǎo)多台真實的(de)業務處理服務器。具體的(de)拓撲圖如下:

二者區别

截了(le/liǎo)一(yī / yì /yí)張圖來(lái)說(shuō)明正向代理和(hé / huò)反向代理二者之(zhī)間的(de)區别,如圖。

圖解:

在(zài)正向代理中,Proxy和(hé / huò)Client同屬于(yú)一(yī / yì /yí)個(gè)LAN(圖中方框内),隐藏了(le/liǎo)客戶端信息;

在(zài)反向代理中,Proxy和(hé / huò)Server同屬于(yú)一(yī / yì /yí)個(gè)LAN(圖中方框内),隐藏了(le/liǎo)服務端信息;

實際上(shàng),Proxy在(zài)兩種代理中做的(de)事情都是(shì)替服務器代爲(wéi / wèi)收發請求和(hé / huò)響應,不(bù)過從結構上(shàng)看正好左右互換了(le/liǎo)一(yī / yì /yí)下,所以(yǐ)把後出(chū)現的(de)那種代理方式稱爲(wéi / wèi)反向代理了(le/liǎo)。

負載均衡

我們已經明确了(le/liǎo)所謂代理服務器的(de)概念,那麽接下來(lái),Nginx扮演了(le/liǎo)反向代理服務器的(de)角色,它是(shì)以(yǐ)依據什麽樣的(de)規則進行請求分發的(de)呢?不(bù)用的(de)項目應用場景,分發的(de)規則是(shì)否可以(yǐ)控制呢?

這(zhè)裏提到(dào)的(de)客戶端發送的(de)、Nginx反向代理服務器接收到(dào)的(de)請求數量,就(jiù)是(shì)我們說(shuō)的(de)負載量。

請求數量按照一(yī / yì /yí)定的(de)規則進行分發到(dào)不(bù)同的(de)服務器處理的(de)規則,就(jiù)是(shì)一(yī / yì /yí)種均衡規則。

所以(yǐ),将服務器接收到(dào)的(de)請求按照規則分發的(de)過程,稱爲(wéi / wèi)負載均衡。

負載均衡在(zài)實際項目操作過程中,有硬件負載均衡和(hé / huò)軟件負載均衡兩種,硬件負載均衡也(yě)稱爲(wéi / wèi)硬負載,如F5負載均衡,相對造價昂貴成本較高,但是(shì)數據的(de)穩定性安全性等等有非常好的(de)保障,如中國(guó)移動中國(guó)聯通這(zhè)樣的(de)公司才會選擇硬負載進行操作;更多的(de)公司考慮到(dào)成本原因,會選擇使用軟件負載均衡,軟件負載均衡是(shì)利用現有的(de)技術結合主機硬件實現的(de)一(yī / yì /yí)種消息隊列分發機制。

Nginx支持的(de)負載均衡調度算法方式如下:

  1. weight輪詢(默認,常用):接收到(dào)的(de)請求按照權重分配到(dào)不(bù)同的(de)後端服務器,即使在(zài)使用過程中,某一(yī / yì /yí)台後端服務器宕機,Nginx會自動将該服務器剔除出(chū)隊列,請求受理情況不(bù)會受到(dào)任何影響。 這(zhè)種方式下,可以(yǐ)給不(bù)同的(de)後端服務器設置一(yī / yì /yí)個(gè)權重值(weight),用于(yú)調整不(bù)同的(de)服務器上(shàng)請求的(de)分配率;權重數據越大(dà),被分配到(dào)請求的(de)幾率越大(dà);該權重值,主要(yào / yāo)是(shì)針對實際工作環境中不(bù)同的(de)後端服務器硬件配置進行調整的(de)。

  2. ip_hash(常用):每個(gè)請求按照發起客戶端的(de)ip的(de)hash結果進行匹配,這(zhè)樣的(de)算法下一(yī / yì /yí)個(gè)固定ip地(dì / de)址的(de)客戶端總會訪問到(dào)同一(yī / yì /yí)個(gè)後端服務器,這(zhè)也(yě)在(zài)一(yī / yì /yí)定程度上(shàng)解決了(le/liǎo)集群部署環境下session共享的(de)問題。

  3. fair:智能調整調度算法,動态的(de)根據後端服務器的(de)請求處理到(dào)響應的(de)時(shí)間進行均衡分配,響應時(shí)間短處理效率高的(de)服務器分配到(dào)請求的(de)概率高,響應時(shí)間長處理效率低的(de)服務器分配到(dào)的(de)請求少;結合了(le/liǎo)前兩者的(de)優點的(de)一(yī / yì /yí)種調度算法。但是(shì)需要(yào / yāo)注意的(de)是(shì)Nginx默認不(bù)支持fair算法,如果要(yào / yāo)使用這(zhè)種調度算法,請安裝upstream_fair模塊。

  4. url_hash:按照訪問的(de)url的(de)hash結果分配請求,每個(gè)請求的(de)url會指向後端固定的(de)某個(gè)服務器,可以(yǐ)在(zài)Nginx作爲(wéi / wèi)靜态服務器的(de)情況下提高緩存效率。同樣要(yào / yāo)注意Nginx默認不(bù)支持這(zhè)種調度算法,要(yào / yāo)使用的(de)話需要(yào / yāo)安裝Nginx的(de)hash軟件包。

 幾種常用web服務器對比


來(lái)源:cnblogs