Nginx 其實就是一款輕量級的 Web 服務器、反向代理服務器,由於它的內存佔用少,啟動極快,高併發能力強,在互聯網項目中廣泛應用。
那麼你可能會問了:“不是說 Nginx 嗎?怎麼又扯出來一個 Web 服務器呢?啥是服務器?”。彆著急,在學習 Nginx 之前你還真得知道什麼是服務器這個概念,下面我們先來看下到底啥是服務器。
啥是服務器
服務器的英文叫 Server , 顧名思義就是為其他人服務的。我們可以把所有為其他用戶提供服務的機器或軟件都稱作服務器。
- Server 可以指硬件,比如谷歌公司對用戶提供服務的主機,下圖是谷歌公司的一個數據中心圖片,走道兩側亮著紅黃藍顏色的笨重機器就是服務器。
- Server 也可以是一個軟件。比如我們本次專欄要介紹的 Nginx,它就是一個對用戶提供 HTTP 服務的Server。又比如我們常聽到的網易郵箱服務器,它就是專門為用戶提供郵件服務的。這些軟件都運行在一個個物理機器上面,專門對外提供對應的服務。
WEB服務器
我們上面嘮叨了一下什麼是服務器。下面我們說一下啥是 Web 服務器,在上面我們也說了 Nginx 其實就是一個 輕量級的 Web 服務器,那麼什麼是 Web 服務器呢?
我們平時可以打開瀏覽器訪問微博的網站,獲取各種娛樂圈各種勁爆消息。這個看似簡單的行為,背後有隱藏了那些細節呢?
上圖就是一個典型的 web 請求流程,主要分為五個步驟:
- 瀏覽器本身作為一個客戶端,當你輸入 www.weibo.com 的時候,向 DNS 服務器發出域名請求服務;
- DNS 服務器將域名將對應的 IP 地址返回給瀏覽器;
- 瀏覽器使用 IP 地址找到對應的服務器後,建立 TCP 連接,向服務器發送 HTTP 請求;
- 服務器接收到請求之後才開始處理,返回 HTTP 響應;
- 瀏覽器收到來自服務器的響應後開始渲染頁面,最後斷開與該服務器之間的 TCP 連接。
我們所介紹的 Web 服務器就是在第 3 和 4 步驟中發揮作用的。它的作用很簡單,概括地講,主要完成三個工作:
- 接收請求;
- 處理請求,生成響應 ;
- 發送響應。
哈哈,當然了,一個成熟的 Web 服務器肯定還有其他各種各樣的功能,但是原理都是一樣。所以,一定要淡定,學會 Web 服務器並沒有想象中的那麼困難。
WEB服務器的分類
其實,現在的市面上面有很多類似於 Nginx 的 Web 服務器,如下圖:
幾款服務器比較
下面我們簡單地比較一下幾款流行的 Web 服務器軟件的區別。
- Apache 是一款歷史悠久的開源 Web 服務器軟件。擁有很多的第三方模塊,你想使用的功能基本上都可以找到,避免自己重複造輪子。採用多進程方式處理請求,每個請求都對應於一個進程。在高併發的情況下,多進程處理方式特別的消耗資源,所以天然不適合高併發場景;
- Nginx 是年輕(相比Apache)的開源 Web 服務器軟件。它也採用 C 語言編寫,代碼運行效率很高。它採用了epoll (以Linux為例) 事件處理機制作為模型,能夠保證非常高的併發量;
- IIS是微軟的Web服務器軟件,這個可是收費的哦~~~
我們看一下 Netcraft 公司在2019年7月份統計的全球 Web 服務器佔用率調查:
從這兩張圖中可以看到,Nginx 開發者數量已經明顯的超過了其他 Web Server 開發者數量,獨佔鰲頭。
在 Web Server 市場使用率中,Nginx 的佔有率一直在穩步的上升,超過了 IIS,與 Apache 的差距越來越小。
所以,使用和學習 Nginx 已經成為每一個後端工程師必備的技能了。好了,鋪墊了這麼多,下面我們正式來看下 Nginx 倒底是個什麼東西。
Nginx簡介
Nginx是由戰鬥民族的一位名叫 Igor Sysoev 的程序猿開發的,開源、高性能的 HTTP 服務器和反向代理服務器,也可以作為一個 IMAP/POP3 代理服務器。也就是說,Nginx不僅可以託管網站,進行HTTP服務處理,還可以作為反向代理服務器。
Nginx 出現的初衷是為了解決著名的 C10K 問題而出現的。和傳統的 Web Server 不一樣,Nginx 使用了異步事件處理機制架構。這種架構可以輕鬆高效地處理大量的請求,並且非常的節省內存。高性能是Nginx最大的優點。
啥?不知道什麼是C10K問題,我嚴重懷疑你是從外星球來的,來,看這裡。
不知道什麼是異步事件處理機制?沒關係,我會在後面的小節中分析的,包學會。
為什麼選擇Nginx
- 佔用內存小。這得益於 Nginx 使用 C 語言編寫,能夠高效使用 CPU、內存等系統資源。並且作者自己造了很多的輪子 , 比如 Nginx 自己實現了內存管理系統,動態數組機制等。Nginx 作者對內存的使用控制簡直到了喪心病狂的地步,所以非常的節省系統資源,特別是內存;
- 高併發。在 Linux 系統上,Nginx 使用了 epoll 機制,能夠高效處理大量的連接數。理論上,Nginx 可以同時處理的最大連接數取決於你的機器的物理內存,上不封頂;
- 高可靠性。我認為 Nginx 的高可靠性主要體現在兩方面:(一):Nginx 使用了 Master-Worker 機制,真正處理請求的是Worker進程。Master進程可以監控Worker進程的運行狀況,當某個Worker進程因意外原因退出的時候,Master會重新啟動Worker進程;(二):Nginx 的內部框架非常優秀。它的各個模塊都非常簡單,所以也非常的穩定。
- 熱部署。可能大家覺得這個原因並不重要,其實在實際的線上環境是非常重要的。代碼上線之後,我們只需要執行 nginx -s reload 命令就可以完成 Nginx 的重啟,其他的交給 Nginx 就可以了,你可以安心去喝咖啡了。如果沒有親身體驗過這種痛苦,你是無法理解的這是多麼痛的領悟。
Nginx能幹啥
上面我們 ‘吹噓’ 了 Nginx 的這麼多優點,那麼 Nginx 究竟能幹什麼呢?
- HTTP 服務器。作為一款優秀的 Web 服務器,那麼提供 HTTP 服務顯然是它的首要任務;
- 負載均衡。Nginx 提供了多種負載均衡策略,實現了7層負載均衡。針對不同的情形,我們可以選擇合適的策略。另外我們也可以自己實現特殊需求的負載均衡策略;
- 反向代理。Nginx 是一款非常優秀的反向代理服務器。
擴展鏈接:MySQL面試必問題,希望對你有幫助。
閱讀更多 今頭日條一小馬奔騰 的文章