互聯(lián)網(wǎng)從90年代開始席卷全球,現(xiàn)如今基本上所有業(yè)務(wù)都可以在互聯(lián)網(wǎng)上完成,互聯(lián)網(wǎng)已經(jīng)成為我們生活中不可或缺的一部分。
那么互聯(lián)網(wǎng)web協(xié)議是怎樣的呢?可以概括為訪問者從給定的Web站點(diǎn)請(qǐng)求文檔,而DNS和IP系統(tǒng)將該請(qǐng)求轉(zhuǎn)發(fā)到正確的計(jì)算機(jī)。這臺(tái)托管請(qǐng)求的網(wǎng)頁(yè)的計(jì)算機(jī)將把網(wǎng)頁(yè)提供給訪問者。
網(wǎng)頁(yè)本質(zhì)上是html文檔。為了能夠向訪問者提供不同的網(wǎng)頁(yè),提供服務(wù)的機(jī)器需要一個(gè)服務(wù)器程序。 Nginx和Apache就是這個(gè)提供服務(wù)的的軟件程序,它們可以處理請(qǐng)求進(jìn)行分析,然后將用戶所需要的文檔信息返回給訪問者。

Nginx與Apache

Nginx和Apache都是非常??流行的Web服務(wù)器。
- Apache于1995年首次發(fā)布,Nginx于2004年發(fā)布。
- 兩者都被全球500強(qiáng)的大型公司使用。
- Nginx的市場(chǎng)份額多年來一直在穩(wěn)定增長(zhǎng)。
- 在某些情況下,Nginx在性能方面更具有競(jìng)爭(zhēng)優(yōu)勢(shì)。
Apache
隨著蒂姆伯納斯李創(chuàng)建了html,之后Apache就占據(jù)著web服務(wù)器的主導(dǎo)地位。現(xiàn)在發(fā)行的linux服務(wù)器,無論是redhat還是ubuntu,apache都是默認(rèn)自帶的服務(wù)器,因此,很多人都是使用Apache來進(jìn)行web開發(fā)的,畢竟人家操作系統(tǒng)已經(jīng)給你提供好了。
apache受歡迎的一個(gè)點(diǎn)就是他的.htacess文件配置管理。
Apache使用.htaccess進(jìn)行配置,它為處理傳入請(qǐng)求的方式提供了很大的靈活性。不同的重定向規(guī)則,最大上傳文件大小,URL重寫,內(nèi)存限制,目錄保護(hù),header頭信息,cookie,查詢字符串操作。
在服務(wù)器根目錄中,目錄樹中的每個(gè)級(jí)別或目錄都可以具有自己的.httaccess文件,并具有自己的配置。
對(duì)于共享主機(jī)提供商,這是一個(gè)夢(mèng)想,因?yàn)樗麄兛梢栽谕慌_(tái)計(jì)算機(jī)上為數(shù)百個(gè)用戶提供一種配置其網(wǎng)站服務(wù)方式的方式,而不會(huì)影響其他網(wǎng)站。客戶可以在受限的共享托管環(huán)境中配置許多詳細(xì)信息,而無需接觸全局服務(wù)器配置。
但是,這種靈活性是以性能為代價(jià)的:“無論您實(shí)際上是否使用它們,允許.htaccess文件都會(huì)導(dǎo)致性能下降!”
每次啟用.htaccess文件時(shí),Apache都必須從請(qǐng)求的URL或文件中遍歷整個(gè)目錄樹,直到所有的更高級(jí)別,直到服務(wù)器的根目錄,然后針對(duì)每個(gè)請(qǐng)求加載它們。
apache還有一個(gè)受歡迎的點(diǎn)是他的模塊機(jī)制。
Apache便允許用戶安裝模塊,然后根據(jù)需要啟用/禁用它們。
apahce有很多好用的模塊,比如壓縮,加密,日志記錄,重定向到更高級(jí)的內(nèi)容,例如使用高級(jí)語(yǔ)法編輯請(qǐng)求和響應(yīng),正是有了這些模塊,才讓Apache處理請(qǐng)求更加多樣化。
nginx
Nginx(也稱為nginx或NGINX)是在2004年由俄羅斯開發(fā)人員Igor Sysoev首次公開發(fā)行的。
Nginx是專門為解決Apache Web服務(wù)器的性能限制而編寫的。

Nginx發(fā)布后,主要用于提供靜態(tài)文件,并在Apache安裝之前用作負(fù)載平衡器或反向代理。 隨著網(wǎng)絡(luò)的發(fā)展以及對(duì)速度和硬件使用效率的高要求,越來越多的網(wǎng)站開始使用Nginx完全替換Apache,這也要?dú)w功于更成熟的軟件。
現(xiàn)在市場(chǎng)上nginx的份額已經(jīng)超過了Apache,很多大公司都開始采用nginx作為后端的web服務(wù)器,有些大公司甚至?xí)薷膎ginx的部分代碼來使用,比如我們熟知的Tengine。
nginx最初設(shè)計(jì)的時(shí)候就是模塊化的思想,它的所有功能都是采用模塊形式提供的,需要什么功能,只要對(duì)應(yīng)加載相應(yīng)的模塊就可以。
nginx一直都在全速發(fā)展著,目前最新的web技術(shù)quic和http3也已經(jīng)在最新版的nginx中提供實(shí)現(xiàn)了。

緩存
apahce和nginx都提供了緩存功能。apache有mod_cache模塊,nginx也有fastcgi緩存。可以說沒有緩存的web系統(tǒng)幾乎不可能支撐如今高訪問的情況。當(dāng)然,說道緩存,最專業(yè)的還是Varnish HTTP。不過因?yàn)閚ginx可以和它完美地結(jié)合,所以這也是越來越多人擁抱nginx的一個(gè)理由。
apache和nginx處理請(qǐng)求方式
apache和nginx最大的不同在于它們處理請(qǐng)求的方式。
apache使用MPM(Multi-Processing-Modules)處理請(qǐng)求。
早期的mpm是prefork模塊。在這種模式下,Apache會(huì)在每個(gè)請(qǐng)求中生成一個(gè)線程的新進(jìn)程。該模塊與mod_php一起使用,意味著Apache服務(wù)器在每個(gè)進(jìn)程中都嵌入了一個(gè)PHP解釋器,雖然可能這個(gè)請(qǐng)求只是請(qǐng)求css等靜態(tài)文件。這是非常低效的。
在后來的幾年中,Apache開發(fā)了多線程工作程序mpm,之后又開發(fā)了事件mpm。它們都減輕了許多Apache的性能問題。切換到php-fpm使得Apache仍然可以成為當(dāng)今競(jìng)爭(zhēng)性的解決方案,并且消除了.htaccess的使用,這讓apache的處理效率提升了很多。
Nginx使用異步,非阻塞事件來處理請(qǐng)求。
簡(jiǎn)而言之,Apache對(duì)每個(gè)連接都使用進(jìn)程(對(duì)于worker mpm,它使用線程)。隨著流量的增加,它很快變得太昂貴了。
事件mpm在優(yōu)化方面更進(jìn)一步,但是一些測(cè)試表明它不能超過Nginx。尤其是當(dāng)我們談?wù)撿o態(tài)文件時(shí),Nginx的服務(wù)量是Apache的兩倍。
Nginx理想情況下,每個(gè)CPU /內(nèi)核只有一個(gè)工作進(jìn)程。 Nginx工作進(jìn)程的區(qū)別在于,每個(gè)工作進(jìn)程可以處理每個(gè)工作進(jìn)程成千上萬的傳入網(wǎng)絡(luò)連接。無需為每個(gè)連接創(chuàng)建新的線程或進(jìn)程。

總結(jié)
從目前的的發(fā)展眼光來看,nginx卻是比apache的性能更優(yōu)越,而且有越來越多的輔助插件構(gòu)建在nginx上面,所以,如果你的web項(xiàng)目剛起步,建議您選擇nginx來作為服務(wù)器,它可以給你提供更優(yōu)秀的性能體驗(yàn),當(dāng)然,對(duì)于中小型項(xiàng)目來說,apahce依然也是不錯(cuò)的選擇。特別是他的.htaccess確實(shí)非常好用。