前言
本文會(huì)對(duì)Nginx的介紹、使用、原理等知識(shí)作由淺入深的剖析。如果你只想對(duì)Nginx作為反向代理的使用作初步的了解,那么可以只看第一、二章節(jié);如果想對(duì)Nginx工作原理、擴(kuò)展使用等進(jìn)行深入研究,可以看第三章節(jié)。相信本文會(huì)對(duì)你有所幫助
一、Nginx 基本介紹
1. 了解 Nginx
Nginx(“engine x”)是一個(gè)高性能的HTTP和反向代理服務(wù)器,特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上Nginx的并發(fā)能力確實(shí)在同類(lèi)型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好。 Nginx 專(zhuān)為性能優(yōu)化而開(kāi)發(fā),性能是其最重要的考量,實(shí)力上表現(xiàn)注重效率,能經(jīng)受高負(fù)載的考驗(yàn),有報(bào)告表明Nginx能支持高達(dá)50000個(gè)并發(fā)連接數(shù)。
- 俄羅斯程序員Igor Sysoev于2022年開(kāi)始
- Nginx是增長(zhǎng)最快的Web服務(wù)器,市場(chǎng)份額已達(dá)33.3%
- 全球使用量排行第二2011年成立商業(yè)公司
2. 關(guān)于反向代理
Nginx不僅可以做反向代理,實(shí)現(xiàn)負(fù)載均衡。還能用做正向代理來(lái)進(jìn)行上網(wǎng)等功能。
2.1 正向代理
正向代理:如果把局域網(wǎng)的Internet想象成一個(gè)巨大的資源庫(kù),則局域網(wǎng)中的客戶端要訪問(wèn)Internet,則需要通過(guò)代理服務(wù)器來(lái)訪問(wèn),這種代理服務(wù)就稱(chēng)為正向代理。在客戶端(瀏覽器)配置代理服務(wù),通過(guò)代理服務(wù)器進(jìn)行互聯(lián)網(wǎng)訪問(wèn)。
2.3 反向代理
反向代理:其實(shí)客戶端對(duì)代理是無(wú)感知的,因?yàn)?strong>客戶端不需要任何配置就可以訪問(wèn),我們只需要將請(qǐng)求發(fā)送到反向代理服務(wù)器,由反向代理服務(wù)器去選擇目標(biāo)服務(wù)器獲取數(shù)據(jù)后,再返回給客戶端,此時(shí)反向代理服務(wù)器和目標(biāo)服務(wù)器對(duì)外就是一個(gè)服務(wù)器,暴露的是代理服務(wù)器地址,隱藏了真實(shí)服務(wù)器IP地址。
2.4 正向代理與反向代理的區(qū)別
正向代理與反向代理的區(qū)別在于代理的對(duì)象不一樣,正向代理代理的對(duì)象是客戶端,反向代理代理的對(duì)象是服務(wù)端。
- 正向代理即是客戶端代理, 代理客戶端, 服務(wù)端不知道實(shí)際發(fā)起請(qǐng)求的客戶端
- 反向代理即是服務(wù)端代理, 代理服務(wù)端, 客戶端不知道實(shí)際提供服務(wù)的服務(wù)端
3. 負(fù)載均衡
??客戶端發(fā)送多個(gè)請(qǐng)求到服務(wù)器,服務(wù)器處理請(qǐng)求,有一些可能要與數(shù)據(jù)庫(kù)進(jìn)行交互,服務(wù)器處理完畢后,再將結(jié)果返回給客戶端。
??這種架構(gòu)模式對(duì)于早期的系統(tǒng)相對(duì)單一,并發(fā)請(qǐng)求相對(duì)較少的情況下是比較適合的,成本也低。但是隨著訪問(wèn)量和數(shù)據(jù)量的飛速增長(zhǎng),以及系統(tǒng)業(yè)務(wù)的復(fù)雜度增加,這種架構(gòu)會(huì)造成服務(wù)器響應(yīng)客戶端的請(qǐng)求日益緩慢,并發(fā)量特別大的時(shí)候,還容易造成服務(wù)器直接崩潰。很明顯這是由于服務(wù)器性能的瓶頸造成的問(wèn)題,那么如何解決這種情況呢?
??我們首先想到的可能是升級(jí)服務(wù)器配置,比如提高CPU執(zhí)行頻率,加大內(nèi)存等提高服務(wù)器的物理性能來(lái)解決此問(wèn)題,但我們知道摩爾定律的日益失效,硬件的性能提升已經(jīng)不能滿足日益提升的需求了。最明顯的一個(gè)例子,天貓雙十一當(dāng)天,某個(gè)熱銷(xiāo)商品的瞬時(shí)訪問(wèn)量是極其龐大的,那么類(lèi)似上面的系統(tǒng)架構(gòu),將機(jī)器都增加到現(xiàn)有的頂級(jí)物理配置,都是不能夠滿足需求的,那么怎么辦呢?
??上面的分析我們?nèi)サ袅嗽黾臃?wù)器物理配置來(lái)解決問(wèn)題的辦法,也就是說(shuō)縱向解決問(wèn)題的辦法行不通了,那么橫向增加服務(wù)器的數(shù)量呢?這時(shí)候集群的概念產(chǎn)生了,單個(gè)服務(wù)器解決不了,我們?cè)黾臃?wù)器的數(shù)量,然后將請(qǐng)求分發(fā)到各個(gè)服務(wù)器上,將原先請(qǐng)求集中到單個(gè)服務(wù)器上的情況改為將請(qǐng)求分發(fā)到多個(gè)服務(wù)器上,將負(fù)載分發(fā)到不同的服務(wù)器,也就是我們所說(shuō)的負(fù)載均衡。
4. 動(dòng)靜分離
原部署方式:動(dòng)態(tài)資源與靜態(tài)資源都部署在同一服務(wù)器中,這樣的方式會(huì)使Tomcat有較大壓力
動(dòng)靜分離:為了加快網(wǎng)站的解析速度,可以把動(dòng)態(tài)頁(yè)面和靜態(tài)頁(yè)面由不同的服務(wù)器來(lái)解析,加快解析速度。降低原來(lái)單個(gè)服務(wù)器的壓力。 在動(dòng)靜分離下,Tomcat 有比較明顯的優(yōu)化,因?yàn)?Tomcat 解析靜態(tài)很慢。其實(shí)原理很好理解,簡(jiǎn)單來(lái)說(shuō),使用正則表達(dá)式匹配過(guò)濾,然后交給不同的服務(wù)器。
靜態(tài)頁(yè)面一般直接由Nginx來(lái)處理,動(dòng)態(tài)頁(yè)面則是通過(guò)反向代理,代理到后端的 Tomcat,然后再做負(fù)載均衡,是選擇本地靜態(tài)頁(yè)面還是后端Tomcat,這由負(fù)載均衡配置決定。
動(dòng)靜分離是在負(fù)載均衡后做的,例如靜態(tài)web有多臺(tái),動(dòng)態(tài)web有多臺(tái),先動(dòng)靜分離,然后在各自集群里做負(fù)載均衡、權(quán)重等。
關(guān)于動(dòng)靜分離的Nginx配置,可見(jiàn)文章:Nginx動(dòng)靜分離詳細(xì)配置
二、Nginx 基本使用
1. Nginx 常用命令
使用Nginx操作命令前提條件:進(jìn)入到 nginx/sbin 目錄 /usr/local/nginx/sbin
-
查看Nginx版本號(hào):./nginx -v
-
測(cè)試Nginx配置:./nginx -t
-
啟動(dòng)Nginx:./nginx
-
關(guān)閉Nginx:./nginx -s stop
-
重新加載Nginx配置文件:./nginx -s reload
2. Nginx 配置文件
(1)Nginx配置文件目錄:/nginx/conf/nginx.conf
(2)Nginx配置文件的組成
Nginx的配置文件由三部分組成,分別為全局塊、events塊、http塊
2.1 第一部分:全局塊
從配置文件開(kāi)始到 events 塊之間的內(nèi)容,主要會(huì)設(shè)置一些影響 Nginx 服務(wù)器整體運(yùn)行的配置指令,主要包括配置運(yùn)行 Nginx 服務(wù)器的用戶(組)、允許生成的 worker process 數(shù),進(jìn)程 PID 存放路徑、日志存放路徑和類(lèi)型以及配置文件的引入等。
比如上面第一行配置的:worker_processes 1
,這是 Nginx 服務(wù)器并發(fā)處理服務(wù)的關(guān)鍵配置,worker_processes 值越大,可以支持的并發(fā)處理量也越多,但是會(huì)受到硬件、軟件等設(shè)備的制約。
2.2 第二部分:events塊
events 塊設(shè)計(jì)的指令主要影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接,常用的設(shè)置包括是否開(kāi)啟對(duì)多 work process 下的網(wǎng)絡(luò)連接進(jìn)行序列化,是否允許同時(shí)接收多個(gè)網(wǎng)絡(luò)連接,選取哪種事件驅(qū)動(dòng)模型來(lái)處理連接請(qǐng)求,每個(gè) word process 可以同時(shí)支持的最大連接數(shù)等。
上圖中的例子標(biāo)識(shí)每個(gè) work process 支持的最大連接數(shù)為 1024。這部分的配置對(duì) Nginx 的性能影響較大,在實(shí)際中應(yīng)該靈活配置。
2.3 第三部分:http塊
這一模塊是 Nginx 服務(wù)器配置中最頻繁的部分,代理、緩存和日志定義等絕大多數(shù)功能和第三方模塊的配置都在這里。需要注意的是:http 塊也可以包括 http 全局塊、server 塊。
① http 全局塊
http 全局塊配置的指令包括文件引入、MIME-TYPE定義、日志自定義、連接超時(shí)時(shí)間、單鏈接請(qǐng)求數(shù)上限等。
② server 塊
這塊和虛擬主機(jī)有密切關(guān)系,虛擬主機(jī)從角度看,和一臺(tái)獨(dú)立的硬件主機(jī)是完全一樣的,該技術(shù)的產(chǎn)生是為了節(jié)省互聯(lián)網(wǎng)服務(wù)器硬件成本。
每個(gè) http 塊可以包括多個(gè) server 塊,而每個(gè) server 塊就相當(dāng)于一個(gè)虛擬主機(jī)。
每個(gè) server 塊也分為全局 server 塊,以及可以同時(shí)包含多個(gè) location 塊。
- 全局 server 塊
最常見(jiàn)的配置是本虛擬主機(jī)的監(jiān)聽(tīng)配置和本虛擬主機(jī)的名稱(chēng)或IP配置 - location 塊
一個(gè) server 塊可以配置多個(gè) location 塊。
這塊的主要作用是基于 Nginx 服務(wù)器接收到的請(qǐng)求字符串(例如server_name/uri-string),對(duì)虛擬主機(jī)名稱(chēng)(也可以是IP別名)之外的字符串(例如 前面的/uri-string)進(jìn)行匹配,對(duì)特定的請(qǐng)求進(jìn)行處理。地址定向、數(shù)據(jù)緩存和應(yīng)答控制等功能,還有許多第三方模塊的配置也在這里進(jìn)行。
三、Nginx 進(jìn)階
1. Nginx 詳述
1.1 Nginx 社區(qū)分支
- Openresty:作者@agentzh(章宜春)開(kāi)發(fā)的,最大特點(diǎn)是引入了ngx_lua模塊,支持使用lua開(kāi)發(fā)插件,且集合了很多豐富的模塊以及l(fā)ua庫(kù)
- Tengine:主要由淘寶團(tuán)隊(duì)開(kāi)發(fā)。特點(diǎn)是融入了因淘寶自身的一些業(yè)務(wù)帶來(lái)的新功能(統(tǒng)計(jì)QPS、主動(dòng)健康檢查等)
- Nginx官方版本:更新迭代快,且提供免費(fèi)版本和商業(yè)版本。目前大多數(shù)使用的是免費(fèi)版本,核心版本為1.6
1.2 Nginx 源碼結(jié)構(gòu)
Nginx 大約含11萬(wàn)行C代碼,源代碼目錄結(jié)構(gòu):
- core:主干和基礎(chǔ)設(shè)置,包括鏈表、數(shù)組、字符串解析、MD5庫(kù)等。定制化開(kāi)發(fā)時(shí)候可以直接使用此目錄的數(shù)據(jù)結(jié)構(gòu)
- event:事件驅(qū)動(dòng)模型和不同的IO復(fù)用模塊
- http:HTTP服務(wù)器和模塊
- mail:郵件代理服務(wù)器和模塊
- os:操作系統(tǒng)相關(guān)的實(shí)現(xiàn)
- misc:雜項(xiàng)
如果我們要開(kāi)發(fā)新http模塊,可參考下http中內(nèi)容,調(diào)用core模塊的庫(kù)函數(shù)來(lái)實(shí)現(xiàn)新模塊開(kāi)發(fā)
1.3 Nginx 特點(diǎn)
- 反向代理,負(fù)載均衡:用的最多也是最基礎(chǔ)的特點(diǎn)。最常用的負(fù)載均衡算法是輪詢,另外還有IP哈希、URL哈希、基于服務(wù)器后端響應(yīng)時(shí)間的負(fù)載均衡
- 高可靠性,架構(gòu)模型基于單master多worker模式:master管理所有worker。當(dāng)worker意外call down,master立即拉取新worker
- 高可擴(kuò)展性、高度模塊化:Nginx 有主流程11個(gè)階段,每個(gè)階段都可以進(jìn)行獨(dú)立的專(zhuān)注擴(kuò)展
- 非阻塞:Nginx非??欤诩僀實(shí)現(xiàn),即收即發(fā)的非阻塞模式
- 事件驅(qū)動(dòng):支持多種事件驅(qū)動(dòng),默認(rèn)采用epoll(最流行最火的)
- 低內(nèi)存消耗:在剛開(kāi)始創(chuàng)建內(nèi)存池,每次請(qǐng)求會(huì)取用其中一小塊內(nèi)存,用完即回收(減少了因系統(tǒng)不斷開(kāi)辟內(nèi)核態(tài)內(nèi)存產(chǎn)生的內(nèi)存碎片,防止內(nèi)存泄漏)
- 熱部署:不停機(jī)的狀態(tài)下,更新二進(jìn)制文件與配置,完成升級(jí)
1.4 Nginx 更多應(yīng)用場(chǎng)景
- 靜態(tài)文件服務(wù)器:將靜態(tài)頁(yè)面資源(圖片、CSS、樣式表)與動(dòng)態(tài)服務(wù)器分離,存儲(chǔ)于不同服務(wù)器上,即動(dòng)靜分離
- 反向代理、負(fù)載均衡:作為反向代理,以負(fù)載多臺(tái)服務(wù)集群
- 安全防御:帶有限流、限速等功能
- 智能路由:比如進(jìn)行灰度測(cè)試,A、B兩個(gè)版本,測(cè)A與B的功能,看用戶更喜愛(ài)哪個(gè)。,另外A機(jī)房出現(xiàn)問(wèn)題也可以切換到B機(jī)房
- 灰度發(fā)布:上面所說(shuō)的AB測(cè)試
- 靜態(tài)化:動(dòng)態(tài)服務(wù)器性能無(wú)法承擔(dān),
- 消息推送:成本較高,不作多介紹
- 圖片實(shí)時(shí)壓縮
- 防盜鏈:根據(jù)配置實(shí)現(xiàn)防盜鏈,比如圖片打水印等方式
1.5 Nginx 進(jìn)程組件角色
-
master 進(jìn)程
- 監(jiān)視worker進(jìn)程的狀態(tài)
- 當(dāng)worker進(jìn)程掛掉后,重啟一個(gè)新的
- 處理信號(hào)和通知worker進(jìn)程
-
worker 進(jìn)程
- 處理客戶端請(qǐng)求
- 從master進(jìn)程處獲得信號(hào)做相應(yīng)的事情
-
cache loader進(jìn)程
- 加載緩存索引文件信息,然后退出
-
cache manager進(jìn)程
- 管理磁盤(pán)的緩存大小,超過(guò)預(yù)定值大小后,根據(jù)LRU淘汰數(shù)據(jù)
2. Nginx 框架模型
-
Client 發(fā)送請(qǐng)求到 Nginx:Nginx中存在多個(gè)Worker搶占該連接請(qǐng)求,僅有一個(gè)會(huì)搶占成功并處理該連接,處理完成后返回響應(yīng)給Client
-
管理員(運(yùn)維人員) 發(fā)送請(qǐng)求到Nginx:比如發(fā)送一個(gè)reload信號(hào),該請(qǐng)求會(huì)被Master進(jìn)程接收,并交給所有Worker執(zhí)行相應(yīng)操作
Client與Nginx交互的詳細(xì)流程:Master進(jìn)程啟動(dòng)時(shí),創(chuàng)建socket綁定端口并監(jiān)聽(tīng),然后創(chuàng)建多個(gè)Worker進(jìn)程。Worker進(jìn)程accept來(lái)自Client的連接,Client發(fā)送請(qǐng)求包至Worker,因?yàn)槭欠亲枞?,?chuàng)建連接后可能由于網(wǎng)絡(luò)延遲發(fā)包較慢而receive多次
2.1 Master 進(jìn)程的初始化
Master初始化啟動(dòng)時(shí)會(huì)加載配置文件,創(chuàng)建全局?jǐn)?shù)據(jù)結(jié)構(gòu)、共享內(nèi)存、連接池等,并創(chuàng)建Workers,然后等待接收信號(hào)。(特別解釋下reload命令,它會(huì)使Workers處理完任務(wù)后退出,并fork一批新的Workers接收新的請(qǐng)求)
2.2 Worker 進(jìn)程的初始化
Worker中有各個(gè)模塊與11個(gè)階段,初始化各個(gè)模塊,包括進(jìn)行回調(diào)函數(shù)、事件模塊、定時(shí)器的初始化
3. 靜態(tài)文件請(qǐng)求流程
Client發(fā)送請(qǐng)求到Nginx,Nginx初始化連接并建立讀事件的回調(diào)函數(shù),該函數(shù)從TCP中讀取客戶端發(fā)送的數(shù)據(jù),讀取完成后解析請(qǐng)求行,檢驗(yàn)該請(qǐng)求的HTTP合法性(是否有非法字符等),然后解析請(qǐng)求,并執(zhí)行Nginx的11個(gè)階段。此時(shí)進(jìn)入static_handler函數(shù),在Nginx配置的目錄中找尋相應(yīng)靜態(tài)資源文件讀取進(jìn)內(nèi)存,響應(yīng)Client
4. Upstream設(shè)計(jì)
Upstream用來(lái)解決跨進(jìn)程訪問(wèn)第三方Server服務(wù)器問(wèn)題,具有以下特點(diǎn):
- 底層HTTP通信框架非常完善,采用異步非阻塞模式
- 上下游內(nèi)存零拷貝,節(jié)省內(nèi)存,提升效率(Nginx接收到Client的請(qǐng)求直接發(fā)送給后端Server)
- 支持自定義模塊開(kāi)發(fā)
5. 反向代理流程
Nginx接收到Client發(fā)送的請(qǐng)求,進(jìn)行解析并進(jìn)行upstream:初始化upstream請(qǐng)求,連接后端Server發(fā)送請(qǐng)求,接收來(lái)自Server的響應(yīng),最終返回響應(yīng)給Client
四、Nginx 定制化開(kāi)發(fā)
1. Nginx 模塊化設(shè)計(jì)特點(diǎn)
-
高度抽象的模塊接口:所有模塊遵循Nginx模塊定義規(guī)范
-
模塊接口簡(jiǎn)單,具有很高的靈活性:模塊之間無(wú)關(guān)聯(lián)且獨(dú)立,對(duì)其中一個(gè)模塊的修改不會(huì)干涉到其他模塊
-
配置模塊的設(shè)計(jì):
-
核心模塊接口的簡(jiǎn)單化:event模塊存在select poll,http模塊、email模塊文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-728626.html
-
多層次、多類(lèi)別的模塊設(shè)計(jì)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-728626.html
到了這里,關(guān)于學(xué)習(xí)筆記:代理服務(wù)器——Nginx的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!