1.nginx 介紹
Nginx (engine x) 是一個輕量級,高性能的 HTTP 和 反向代理 服務(wù),也是一個IMAP/POP3/SMTP服務(wù)。因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名。其特點是占有內(nèi)存少,并發(fā)能力強,事實上nginx的并發(fā)能力確實在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好。
2.nginx的優(yōu)勢
- Nginx 是一個高性能的 Web 和反向代理服務(wù)器,它具有有很多非常優(yōu)越的特性
- 作為 Web 服務(wù)器:相比 Apache,Nginx 使用更少的資源,支持更多的并發(fā)連接,體現(xiàn)更高的效率,這點使 Nginx 尤其受到虛擬主機提供商的歡迎。能夠支持高達 50,000 個并發(fā)連接數(shù)的響應。
- 作為負載均衡服務(wù)器:可以進行自定義配置,支持虛擬主機,支持URL重定向,支持網(wǎng)絡(luò)監(jiān)控,支持流媒體傳輸?shù)?。Nginx 既可以在內(nèi)部直接支持 Rails 和 PHP,也可以支持作為 HTTP代理服務(wù)器對外進行服務(wù)。Nginx 用 C 編寫,不論是系統(tǒng)資源開銷還是 CPU 使用效率都比 Perlbal 要好的多。
- 作為郵件代理服務(wù)器: Nginx 同時也是一個非常優(yōu)秀的郵件代理服務(wù)器(最早開發(fā)這個產(chǎn)品的目的之一也是作為郵件代理服務(wù)器)。
- Nginx 安裝非常的簡單,配置文件 非常簡潔(還能夠支持perl語法),Bugs非常少的服務(wù)器
- Nginx 啟動特別容易,并且?guī)缀蹩梢宰龅?strong>7*24不間斷運行,即使運行數(shù)個月也不需要重新啟動。nginx還能夠在不間斷服務(wù)的情況下進行軟件版本的升級。
nginx的優(yōu)點:
1、高并發(fā),高性能(單機環(huán)境下參考服務(wù)器配置,并發(fā)連接數(shù)在7000+到8000左右。集群模式20000+)
2、高可靠??梢?*24小時不間斷運行
3、可擴展性強。模塊化設(shè)計,使得添加模塊非常的平穩(wěn)。
4、支持熱部署??梢栽诓煌V狗?wù)器的情況下升級nginx
5、BSD許可證。nginx不止開源免費的,我們還可以更具實際需求進行定制修改源代碼
3.Nginx VS Apache
3.1.內(nèi)核、語言、誕生時間比較
最大的區(qū)別:事件驅(qū)動模型不一樣,nginx使用的是異步非阻塞模式,apache使用的同步阻塞模式。
特性 | Nginx | Apache |
---|---|---|
請求管理 | 事件驅(qū)動模型,使用異步套接字處理,占用較少的內(nèi)存和CPU開銷 | 同步套接字、進程和線程每個請求都要使用一個單獨的進程或線程,使用同步套接字 |
設(shè)計語言 | C | C、C++ |
可移植性 | 多平臺 | 多平臺 |
誕生時間 | 2002 | 1994 |
3.2.功能比較
功能 | Nginx | Apache |
---|---|---|
HTTPS支持 | 作為模塊支持 | 作為模塊支持 |
虛擬主機 | 原生支持 | 原生支持 |
CGI支持 | 僅支持FastCGI | 支持CGI和FastCGI |
系統(tǒng)模塊 | 靜態(tài)模塊系統(tǒng) | 動態(tài)模塊系統(tǒng) |
FastCGI的介紹
快速通用網(wǎng)關(guān)接口(Fast Common Gateway Interface/FastCGI)是通用網(wǎng)關(guān)接口(CGI)的改進,描述了客戶端和服務(wù)器程序之間傳輸數(shù)據(jù)的一種標準。
FastCGI致力于減少Web服務(wù)器與CGI程序之間互動的開銷,從而使服務(wù)器可以同時處理更多的Web請求。
與為每個請求創(chuàng)建一個新的進程不同,F(xiàn)astCGI使用持續(xù)的進程來處理一連串的請求。這些進程由FastCGI進程管理器管理,而不是web服務(wù)器。
從以上功能上的對比,我們很難發(fā)現(xiàn)哪些功能Apache無法實現(xiàn)。
3.3.Nginx 相對 apache 的優(yōu)點
- 輕量級,同樣是web服務(wù)器比Apache 占用更少的內(nèi)存及資源
- apache采用的就是進程和線程模式工作,來一個請求就開啟一個進程或者線程,大大的占用系統(tǒng)的資源
- 開源免費(費用)
- 靜態(tài)處理性能強:Nginx 靜態(tài)處理性能比 Apache 高 3倍以上(性能)
- 抗高并發(fā):Nginx是采用異步非阻塞來處理請求的,而Apache則是阻塞型的。在高并發(fā)下Nginx 能保持低資源低消耗高性能。
- 在Apache+PHP(prefork)模式下,如果PHP處理慢或者前端壓力很大的情況下,很容易出Apache進程數(shù)飆升,從而出現(xiàn)拒絕服務(wù)的現(xiàn)象。
- 高度模塊化的設(shè)計:編寫模塊相對簡單(功能多);
- 解決了強耦合的問題,讓代碼依賴性變低變?nèi)?,甚至是互不干擾的工作,讓我們定制軟件提供了很大的便利,就是可以自定義安裝???;如果只使用3個???,你給我裝20個???,那就浪費了我系統(tǒng)的資源。
- 社區(qū)活躍:各種高性能模塊出品迅速(可維護性成本低)
4.Nginx為什么有這么多的優(yōu)勢?
從技術(shù)層面深度剖析nginx程序的設(shè)計思想
4.1.IO多路復用(I/O multiplexing【多并發(fā)】)
多并發(fā)在生活中的案例:超市收銀口的收銀員,將每個收銀口看成一個處理請求的線程,當人數(shù)不多的時候,開一個收銀口一個收銀員就能應付,但是當人數(shù)多起來了,一個收銀口應付不來那么多人了(對應的是海量的請求),這時就需要開啟多個收銀口來應對大量的顧客,而顧客則可以根據(jù)收銀員的忙碌程度進程自由選擇的排隊
- 第一種方法就是最傳統(tǒng)的多進程并發(fā)模型 (每進來一個新的I/O流會分配一個新的線程管理。)
- 第二種方法就是I/O多路復用 (單個線程,通過記錄跟蹤每個I/O流(sock)的狀態(tài),來同時管理多個I/O流 );發(fā)明它的原因,是盡量多的提高服務(wù)器的吞吐能力。在同一個線程里面, 通過撥開關(guān)的方式,來同時傳輸多個I/O流
4.2.nginx的驅(qū)動模型介紹
一個請求到來了,nginx使用epoll接收請求的過程是怎樣的?
- select,poll,epoll 都是I/O多路復用的具體的實現(xiàn),其實是他們出現(xiàn)是有先后順序的。
- I/O多路復用這個概念被提出來以后, 相繼出現(xiàn)了多個方案,但是都需要linux內(nèi)核支持
- select是第一個實現(xiàn) (1983 左右實現(xiàn)的)。 select 被實現(xiàn)以后,很快就暴露出了很多問題。
- select 任何一個sock(I/O stream)出現(xiàn)了數(shù)據(jù),select 僅僅會返回,但是并不會告訴你是那個sock上有數(shù)據(jù),于是你只能自己一個一個的找,10幾個sock可能還好,要是幾萬的#sock每次都找一遍就跟快遞員送快遞一樣,每次快遞到了都得你自己去快遞箱里面找,可想而知多麻煩
- select 只能監(jiān)視1024個鏈接。
- select 線程不是安全的。
- 于是14年以后(1997年)一幫人又實現(xiàn)了poll, poll 修復了select的很多問題,比如
- poll 去掉了1024個鏈接的限制,于是可以有多個連接進來。?但是poll仍然線程不是安全的,這就意味著,不管服務(wù)器有多強悍,也只能在一個線程里面處理一組I/O流。
- epoll:可以說是I/O 多路復用最新的一個實現(xiàn),epoll 修復了poll 和select絕大部分問題,比如
- epoll 現(xiàn)在是線程安全的。
- epoll 現(xiàn)在不僅告訴你sock組里面數(shù)據(jù),還會告訴你具體哪個sock有數(shù)據(jù),你不用自己去找了。
ngnix會有很多連接進來, 默認采用epoll會把他們都監(jiān)視起來,然后像撥開關(guān)一樣,誰有數(shù)據(jù)就撥向誰,然后調(diào)用相應的代碼處理。
4.3.nginx的異步非阻塞模式
//查看服務(wù)器中nginx的worker進程
# yum -y install psmisc
# pstree |grep nginx
|-+= 81666 root nginx: master process nginx
| |--- 82500 nobody nginx: worker process
| \--- 82501 nobody nginx: worker process
//1個master進程和n個work進程
每進來一個request,會有一個worker進程去處理。但不是全程的處理,處理到什么程度呢?
處理到可能發(fā)生阻塞的地方,比如向上游(后端)服務(wù)器轉(zhuǎn)發(fā)request,并等待請求返回。
那么,這個處理的worker不會這么一直等著,他會在發(fā)送完請求后,注冊一個事件:“如果upstream返回了,告訴我一聲,我再接著干”。于是他就休息去了。這就是【異步】。
此時,如果再有request 進來,他就可以很快再按這種方式處理。這就是非阻塞和IO多路復用。而一旦上游服務(wù)器返回了,就會觸發(fā)這個事件,worker才會來接手,這個request才會接著往下走。這就是【異步回調(diào)】。
4.4.理解同步、異步、阻塞、非阻塞
當我們使用一個簡單的讀取文件的操作來舉例說明:文章來源:http://www.zghlxwxcb.cn/news/detail-807890.html
- 同步阻塞(Synchronous Blocking):
在同步阻塞模式下,程序發(fā)起讀取文件的請求后,會一直等待文件讀取完成,期間無法進行其他操作。只有當文件讀取完成后,程序才能繼續(xù)執(zhí)行后續(xù)操作。 - 異步阻塞(Asynchronous Blocking):
在異步阻塞模式下,程序發(fā)起讀取文件的請求后,會立即返回并繼續(xù)執(zhí)行其他操作。但是程序會周期性地查詢文件是否已經(jīng)讀取完成,如果未完成,則會一直等待,直到文件讀取完成后再繼續(xù)執(zhí)行后續(xù)操作。 - 同步非阻塞(Synchronous Non-blocking):
在同步非阻塞模式下,程序發(fā)起讀取文件的請求后,會立即返回并繼續(xù)執(zhí)行其他操作。程序會不斷地輪詢文件是否已經(jīng)讀取完成,如果未完成,則會立即返回并繼續(xù)輪詢,直到文件讀取完成后再繼續(xù)執(zhí)行后續(xù)操作。 - 異步非阻塞(Asynchronous Non-blocking):
在異步非阻塞模式下,程序發(fā)起讀取文件的請求后,會立即返回并繼續(xù)執(zhí)行其他操作。當文件讀取完成后,系統(tǒng)會通過回調(diào)函數(shù)或者事件通知的方式來通知程序文件已經(jīng)讀取完成,程序再進行后續(xù)處理。
同步和異步是針對程序等待操作完成的方式,阻塞和非阻塞是針對程序等待I/O操作完成的方式。文章來源地址http://www.zghlxwxcb.cn/news/detail-807890.html
到了這里,關(guān)于Nginx詳細介紹(并從技術(shù)層面深度剖析)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!