互聯網從90年代開始席卷全球,現如今基本上所有業務都可以在互聯網上完成,互聯網已經成為我們生活中不可或缺的一部分。
那么互聯網web協議是怎樣的呢?可以概括為訪問者從給定的Web站點請求文檔,而DNS和IP系統將該請求轉發到正確的計算機。這臺托管請求的網頁的計算機將把網頁提供給訪問者。
網頁本質上是html文檔。為了能夠向訪問者提供不同的網頁,提供服務的機器需要一個服務器程序。 Nginx和Apache就是這個提供服務的的軟件程序,它們可以處理請求進行分析,然后將用戶所需要的文檔信息返回給訪問者。
Nginx與Apache
Nginx和Apache都是非常??流行的Web服務器。
- Apache于1995年首次發布,Nginx于2004年發布。
- 兩者都被全球500強的大型公司使用。
- Nginx的市場份額多年來一直在穩定增長。
- 在某些情況下,Nginx在性能方面更具有競爭優勢。
Apache
隨著蒂姆伯納斯李創建了html,之后Apache就占據著web服務器的主導地位。現在發行的linux服務器,無論是redhat還是ubuntu,apache都是默認自帶的服務器,因此,很多人都是使用Apache來進行web開發的,畢竟人家操作系統已經給你提供好了。
apache受歡迎的一個點就是他的.htacess文件配置管理。
Apache使用.htaccess進行配置,它為處理傳入請求的方式提供了很大的靈活性。不同的重定向規則,最大上傳文件大小,URL重寫,內存限制,目錄保護,header頭信息,cookie,查詢字符串操作。
在服務器根目錄中,目錄樹中的每個級別或目錄都可以具有自己的.httaccess文件,并具有自己的配置。
對于共享主機提供商,這是一個夢想,因為他們可以在同一臺計算機上為數百個用戶提供一種配置其網站服務方式的方式,而不會影響其他網站。客戶可以在受限的共享托管環境中配置許多詳細信息,而無需接觸全局服務器配置。
但是,這種靈活性是以性能為代價的:“無論您實際上是否使用它們,允許.htaccess文件都會導致性能下降!”
每次啟用.htaccess文件時,Apache都必須從請求的URL或文件中遍歷整個目錄樹,直到所有的更高級別,直到服務器的根目錄,然后針對每個請求加載它們。
apache還有一個受歡迎的點是他的模塊機制。
Apache便允許用戶安裝模塊,然后根據需要啟用/禁用它們。
apahce有很多好用的模塊,比如壓縮,加密,日志記錄,重定向到更高級的內容,例如使用高級語法編輯請求和響應,正是有了這些模塊,才讓Apache處理請求更加多樣化。
nginx
Nginx(也稱為nginx或NGINX)是在2004年由俄羅斯開發人員Igor Sysoev首次公開發行的。
Nginx是專門為解決Apache Web服務器的性能限制而編寫的。
Nginx發布后,主要用于提供靜態文件,并在Apache安裝之前用作負載平衡器或反向代理。 隨著網絡的發展以及對速度和硬件使用效率的高要求,越來越多的網站開始使用Nginx完全替換Apache,這也要歸功于更成熟的軟件。
現在市場上nginx的份額已經超過了Apache,很多大公司都開始采用nginx作為后端的web服務器,有些大公司甚至會修改nginx的部分代碼來使用,比如我們熟知的Tengine。
nginx最初設計的時候就是模塊化的思想,它的所有功能都是采用模塊形式提供的,需要什么功能,只要對應加載相應的模塊就可以。
nginx一直都在全速發展著,目前最新的web技術quic和http3也已經在最新版的nginx中提供實現了。
緩存
apahce和nginx都提供了緩存功能。apache有mod_cache模塊,nginx也有fastcgi緩存。可以說沒有緩存的web系統幾乎不可能支撐如今高訪問的情況。當然,說道緩存,最專業的還是Varnish HTTP。不過因為nginx可以和它完美地結合,所以這也是越來越多人擁抱nginx的一個理由。
apache和nginx處理請求方式
apache和nginx最大的不同在于它們處理請求的方式。
apache使用MPM(Multi-Processing-Modules)處理請求。
早期的mpm是prefork模塊。在這種模式下,Apache會在每個請求中生成一個線程的新進程。該模塊與mod_php一起使用,意味著Apache服務器在每個進程中都嵌入了一個PHP解釋器,雖然可能這個請求只是請求css等靜態文件。這是非常低效的。
在后來的幾年中,Apache開發了多線程工作程序mpm,之后又開發了事件mpm。它們都減輕了許多Apache的性能問題。切換到php-fpm使得Apache仍然可以成為當今競爭性的解決方案,并且消除了.htaccess的使用,這讓apache的處理效率提升了很多。
Nginx使用異步,非阻塞事件來處理請求。
簡而言之,Apache對每個連接都使用進程(對于worker mpm,它使用線程)。隨著流量的增加,它很快變得太昂貴了。
事件mpm在優化方面更進一步,但是一些測試表明它不能超過Nginx。尤其是當我們談論靜態文件時,Nginx的服務量是Apache的兩倍。
Nginx理想情況下,每個CPU /內核只有一個工作進程。 Nginx工作進程的區別在于,每個工作進程可以處理每個工作進程成千上萬的傳入網絡連接。無需為每個連接創建新的線程或進程。
總結
從目前的的發展眼光來看,nginx卻是比apache的性能更優越,而且有越來越多的輔助插件構建在nginx上面,所以,如果你的web項目剛起步,建議您選擇nginx來作為服務器,它可以給你提供更優秀的性能體驗,當然,對于中小型項目來說,apahce依然也是不錯的選擇。特別是他的.htaccess確實非常好用。