Nginx實現(xiàn)原理及架構(gòu)解析_第1頁
Nginx實現(xiàn)原理及架構(gòu)解析_第2頁
Nginx實現(xiàn)原理及架構(gòu)解析_第3頁
Nginx實現(xiàn)原理及架構(gòu)解析_第4頁
Nginx實現(xiàn)原理及架構(gòu)解析_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Nginx是什么Nginx(engineX)是一個開源的輕量級的HTTP服務(wù)器,能夠提供高性能的HTTP和反向代理服務(wù)。與傳統(tǒng)的Apache服務(wù)器相比,在性能上Nginx占用系統(tǒng)資源更小、支持高并發(fā),訪問效率更高;在功能上,Nginx不僅作為Web服務(wù)軟件,還適用于反向代理、負載均衡等場景;在安裝配置上,Nginx更為簡單、靈活。Nginx因為并發(fā)性能和資源占用上的優(yōu)勢,已經(jīng)廣泛用于大中型互聯(lián)網(wǎng)企業(yè)。1.1Nginx特點Nginx具有以下特點:支持高并發(fā):Nginx是專門為性能優(yōu)化而開發(fā)的,采用內(nèi)核Poll模型,單機能夠支持幾萬以上的并發(fā)連接低資源消耗:Nginx采取了分階段資源分配技術(shù),使得CPU與內(nèi)存的占用率非常低。一般1萬個非活躍的HTTPKeep-Alive連接在Nginx中僅消耗幾MB內(nèi)存高拓展性:設(shè)計極具擴展性,由多個不同功能、不同層次、不同類型且耦合度極低的模塊組成高可用性:Nginx支持熱部署,其中的master管理進程與worker工作進程的分離設(shè)計;啟動速度特別迅速,因此可以在不間斷服務(wù)的情況下,對軟件版本或者配置進行升級,即使運行數(shù)月也無需重新啟動,幾乎可以做到7x24小時不間斷地運行豐富的使用場景:可以作為Web服務(wù)端、HTTP反向代理、負載均衡和前端緩存服務(wù)等場景使用開源協(xié)議:使用BSD許可協(xié)議,免費使用,且可修改源碼1.2Nginx使用場景1.2.1反向代理代理服務(wù)器一般指代局域網(wǎng)內(nèi)部的機器通過代理服務(wù)發(fā)送請求到互聯(lián)網(wǎng)上的服務(wù)器,代理服務(wù)器一般作用于客戶端。代理服務(wù)器是介于客戶端和Web服務(wù)器之間的服務(wù)器,客戶端首先與代理服務(wù)器創(chuàng)建連接,然后根據(jù)代理服務(wù)器所使用的代理協(xié)議,請求對目標(biāo)服務(wù)器創(chuàng)建連接、或則獲得目標(biāo)服務(wù)器的指定資源。正向代理:為了從原始服務(wù)器取的內(nèi)容,客戶端向代理發(fā)送一個請求并指定目標(biāo)(Web服務(wù)器),然后代理向Web服務(wù)器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端,客戶端必須要進行一些特別的設(shè)置才能使用正向代理。像VPN就是正向代理,一般在瀏覽器中配置代理服務(wù)器的相關(guān)信息。正向代理中代理的對象是客戶端,代理服務(wù)器和客戶端屬于同一個LAN,對服務(wù)器端來說是透明的。反向代理:客戶端發(fā)送請求到代理服務(wù)器,由代理服務(wù)器轉(zhuǎn)發(fā)給相應(yīng)的Web服務(wù)器進行處理,最終返回結(jié)果給客戶端。像Nginx就是反向代理服務(wù)器軟件,對客戶端暴露的其實是一個VIP,不是真實的Web服務(wù)器的IP。反向代理的是對象是Web服務(wù)器端,代理服務(wù)器和Web服務(wù)端屬于同一個LAN,對客戶端來說是透明的。使用反向代理的好處是客戶端不需要任何配置就可以訪問,對外暴露的是代理服務(wù)器的地址隱藏了真實服務(wù)器的地址,客戶端只需要把請求發(fā)送給代理服務(wù)器,由代理服務(wù)器去選擇后端的Web服務(wù)器,獲取到數(shù)據(jù)后再返回給客戶端。1.2.2負載均衡負載均衡建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上,它提供了一種廉價有效透明的方法擴展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強網(wǎng)絡(luò)數(shù)據(jù)處理能力、提高網(wǎng)絡(luò)的靈活性和可用性。負載均衡(LoadBalance)其意思就是分攤到多個操作單元上進行執(zhí)行,例如Web服務(wù)器、FTP服務(wù)器、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)。簡而言之,單個Web應(yīng)用服務(wù)器不能承受日益增長的并發(fā)量請求,因此需要不斷擴展web服務(wù)器來支撐高并發(fā)請求,根據(jù)不同的負載均衡策略將請求分配到各個服務(wù)器上。Nginx支持三種不同的負載均衡策略:輪詢:每個請求按時間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉能夠被自動剔除。輪詢算法適合服務(wù)器配置相當(dāng),無狀態(tài)且短平快的服務(wù)使用。weight權(quán)重:指定輪詢的幾率,weight和后端的訪問比例成比例,weight權(quán)重越高比例越大。通常用于后端服務(wù)器配置不均的情況。ip_hash:上面兩種算法存在一個問題是就是無法做到會話保持,當(dāng)用戶登錄到服務(wù)器上后,第二次請求的時候會被定位到服務(wù)器集群中的某一個,那么已經(jīng)登錄到某個服務(wù)器上的用戶會重新定位到另一臺,之前的登錄信息會丟失。ip_hash算法可以解決這個問題,當(dāng)用戶再次訪問請求時,會通過hash算法自動定位到已經(jīng)登錄的服務(wù)器上,這樣每個客戶端可以固定在某個web服務(wù)器上,解決客戶端session的問題。1.2.3動靜分離動靜分離技術(shù)是讓動態(tài)網(wǎng)站里的動態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,將靜態(tài)文件放在一個單獨的web服務(wù)器上,加快解析速度,降低原來單個服務(wù)器的壓力。在Nginx的配置中,在server{}段中加入帶正則匹配的location來指定匹配項針對PHP的動靜分離:靜態(tài)頁面交給Nginx處理,動態(tài)頁面交給PHP-FPM模塊或Apache處理。1.3Nginx功能模塊說明Nginx由內(nèi)核和模塊組成,其中內(nèi)核在設(shè)計上非常簡潔,完成的工作非常簡單,僅僅通過查找配置文件將客戶端請求映射到一個locationblock,而在這個location中所配置的每個指令將會啟動不同的模塊去完成相應(yīng)的工作。1.3.1Nginx模塊分類Nginx的模塊從結(jié)構(gòu)上分為核心模塊、基礎(chǔ)模塊和第三方模塊,其中用戶根據(jù)自己的需要開發(fā)的模塊都屬于第三方模塊:核心模塊:HTTP模塊、EVENT模塊和MAIL模塊基礎(chǔ)模塊:HTTPAccess模塊、HTTPFastCGI模塊、HTTPProxy模塊和HTTPRewrite模塊;第三方模塊:HTTPUpstreamRequestHash模塊、Notice模塊和HTTPAccessKey模塊。1.3.2Nginx模塊功能

Nginx模塊常規(guī)的HTTP請求和響應(yīng)的過程如上圖所示,Nginx模塊從功能上分為以下三類:Handlers處理器模塊:此類模塊直接處理請求,并進行輸出內(nèi)容和修改headers信息等操作。Handlers處理器模塊一般只能有一個。Filters過濾器模塊:此類模塊主要對其他處理器模塊輸出的內(nèi)容進行修改操作,最后由Nginx輸出。Proxies代理類模塊:此類模塊是Nginx的HTTPUpstream之類的模塊,這些模塊主要與后端一些服務(wù)比如FastCGI等進行交互,實現(xiàn)服務(wù)代理和負載均衡等功能。Nginx本身處理的工作很少,當(dāng)它接到一個HTTP請求時,通過查找配置文件將此次請求映射到一個locationblock,而此location中所配置的各個指令則會啟動不同的模塊去完成工作。2、Nginx架構(gòu)解析2.1Nginx進程模型Nginx默認采用多進程工作方式,在Nginx啟動后,會運行一個master進程和多個worker進程。master主要用來管理worker進程,充當(dāng)整個進程組與用戶的交互接口,同時對進程進行監(jiān)護,實現(xiàn)worker進程的重啟服務(wù)、平滑升級、更換日志文件、配置文件實時生效等功能;worker進程用來處理基本的網(wǎng)絡(luò)事件,worker之間是平等的,他們共同競爭來處理來自客戶端的請求。一個請求只能在一個worker進程中處理,一個worker進程不可能處理其它worker進程中的請求。另外在Nginx架構(gòu)中還有CacheLoader和CacheManager進程,CacheLoader進程加載緩存索引文件信息;CacheManager進程管理磁盤的緩存大小,超過預(yù)定值大小后最小使用的數(shù)據(jù)將被刪除。2.1.1Master管理進程Master進程主要用來管理worker進程,具體包括如下4個主要功能:接收來自外界的信號;向各worker進程發(fā)送信號;監(jiān)控woker進程的運行狀態(tài);當(dāng)woker進程退出后(異常情況下),會自動重新啟動新的woker進程。Master進程接受到命令重啟Nginx進程(./nginx-sreload),會按照以下流程:1)首先master進程在收到重啟命令后,會先重新加載配置文件,然后再啟動新的worker進程,并向所有老的worker進程發(fā)送信號,告訴他們可以光榮退休了。2)新的worker進程在啟動后,就開始接收新的請求,而老的worker在收到來自master的信號后,就不再接收新的請求,并且處理完當(dāng)前進程中的所有未處理完的請求后,再退出。2.1.2Worker工作進程Worker工作進程之間是對等的,每個進程處理請求的機會也是一樣的。Nginx采用異步非阻塞的方式來處理網(wǎng)絡(luò)事件,具體流程如下:1)

接收請求:首先,每個worker進程都是從master進程fork過來,在master進程建立好需要listen的socket(listenfd)之后,然后再fork出多個worker進程。a)所有worker進程的listenfd會在新連接到來時變得可讀,每個work進程都可以去accept這個socket(listenfd)。b)當(dāng)一個client連接到來時,所有accept的work進程都會受到通知,但只有一個進程可以accept成功,其它的則會accept失敗。c)為保證只有一個進程處理該連接,Nginx提供了一把共享鎖accept_mutex來保證同一時刻只有一個work進程在accept連接。d)所有worker進程在注冊listenfd讀事件前搶accept_mutex,搶到互斥鎖的那個進程注冊listenfd讀事件,在讀事件里調(diào)用accept接受該連接。2)

處理請求:當(dāng)一個worker進程在accept這個連接之后,就開始讀取請求,解析請求,處理請求,產(chǎn)生數(shù)據(jù)后,再返回給客戶端,最后才斷開連接。由上可以看出,一個請求完全由worker進程處理,并且只在一個worker進程中處理。2.2Nginx請求處理流程Nginx工作進程會監(jiān)聽套接字上的事件(accept_mutex和kernelsocketsharding),來決定什么時候開始工作。事件是由新的連接初始化的,這些連接會被分配給狀態(tài)機,Nginx中有三大類狀態(tài)機:處理應(yīng)用層的HTTP狀態(tài)機、處理TCP/UDP的4層的傳輸層狀態(tài)機和處理郵件的MAIL狀態(tài)機,其中HTTP狀態(tài)機最為常見。在多種流量進入Nginx后,Nginx的三種狀態(tài)機在Nginx解析出請求后,會動用線程池處理調(diào)用,將靜態(tài)資源、反向代理、錯誤日志等信息分別導(dǎo)向不同的出口,比如fastcgi會導(dǎo)向PHP處理、html會導(dǎo)向nginx處理,并將處理請求日志記錄到本地或遠程服務(wù)器中。2.3Nginx多進程IO模型2.3.1Nginx多進程模型Nginx默認使用多進程的工作方式,相比較多線程的方式,有以下好處:1)首先,對于每個worker進程來說,獨立的進程不需要加鎖,所以省掉了鎖帶來的開銷,同時在編程以及問題查找時,也會方便很多;2)其次,采用獨立的進程,可以讓進程之間相互不會影響,一個進程退出后,其它進程還在工作,服務(wù)也不會中斷,master進程則很快啟動新的worker進程;3)再次,為Nginx熱部署提供了支持。在修改配置文件nginx.conf后,重新生成新的worker進程,新的worker進程會以新的配置處理請求,而老的worker進程,等把以前的請求處理完成以后,kill掉就可以。2.3.2Nginx異步非阻塞事件模型異步非阻塞事件是怎么回事?先看一個請求的完整過程,首先請求過來建立連接,然后再接收數(shù)據(jù)再發(fā)送數(shù)據(jù),具體到系統(tǒng)層就是IO讀寫事件。當(dāng)讀寫事件沒有準(zhǔn)備好,如果不采用非阻塞的方式,就得阻塞調(diào)用,阻塞調(diào)用會進入內(nèi)核等待,導(dǎo)致CPU資源被其它進程占用。當(dāng)并發(fā)請求越大時,等待的事件越多,CPU利用不上去,并發(fā)也上不去。因此Nginx使用非阻塞的事件模型,系統(tǒng)中事件模型有很多中,比如select/poll/kqueue/epoll等,Nginx采用epoll模型。Epoll模型基于事件驅(qū)動機制,可以監(jiān)控多個事件是否準(zhǔn)備完畢,如果可以,就放入epoll隊列,這個過程是異步的,worker進程只需要從epoll隊列循環(huán)處理即可。Epoll調(diào)用過程如下圖所示:3、Nginx部署與配置3.1Nginx環(huán)境部署1)下載安裝包,官網(wǎng)鏈接/en/download.html2)解壓安裝包[root@tango-rac01src]#tar-xzvfnginx-1.22.1.tar.gz3)編譯配置[root@tango-rac01nginx-1.22.1]#./configure[root@tango-rac01nginx-1.22.1]#make[root@tango-rac01nginx-1.22.1]#whereisnginxnginx:/usr/local/nginx4)啟動Nginx[root@tango-rac01nginx-1.22.1]#cd/usr/local/nginx/[root@tango-rac01nginx]#./sbin/nginx[root@tango-rac01nginx]#ss-antlStateRecv-QSend-QLocalAddress:PortPeerAddress:PortLISTEN0511*:80*:*5)訪問頁面ip:803.2Nginx不同場景配置3.2.1Nginx配置文件介紹...#全局塊

events{#events塊...}

http#http塊{...#http全局塊server#server塊{...#server全局塊location[PATTERN]#location塊{...}location[PATTERN]{...}}server{...}...#http全局塊}全局塊:配置影響nginx全局的指令。一般有運行nginx服務(wù)器的用戶組,nginx進程pid存放路徑,日志存放路徑,配置文件引入,允許生成workerprocess數(shù)等。events塊:配置影響nginx服務(wù)器或與用戶的網(wǎng)絡(luò)連接。有每個進程的最大連接數(shù),選取哪種事件驅(qū)動模型處理連接請求,是否允許同時接受多個網(wǎng)路連接,開啟多個網(wǎng)絡(luò)連接序列化等。http塊:可以嵌套多個server,配置代理,緩存,日志定義等絕大多數(shù)功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數(shù)等。server塊:配置虛擬主機的相關(guān)參數(shù),一個http中可以有多個server。location塊:配置請求的路由,以及各種頁面的處理情況。3.2.2反向代理配置1)簡單配置如下:server{keepalive_requests120;listen80;server_name35;location~/news/{proxy_pass01:8080;}location~/prod/{proxy_pass01:8081;}}訪問http://35:80/news/時會跳轉(zhuǎn)到01:8080,訪問http://35:80/prod/時會跳轉(zhuǎn)到01:80813.2.3負載均衡配置1)配置如下:upstreammyServer{server01:8080down;server01:8090weight=2;server01:6060;server01:7070backup;}#指定負載均衡策略為ip_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論