認識Nginx,理解原理和功能
前端工程師在理解Nginx之後,就能更好的與後端工程師溝通,為了能提高工作效率,這兩天抽空讀了《Nginx高效能Web伺服器實戰教程》。
一、Nginx
Nginx是一款高效能的Web伺服器軟體,主要用於提供網上資訊瀏覽服務,為高併發網站的應用場景而設計,可以在Linux、macOS和Windows等作業系統中執行,它的優點包括效能高、穩定性好、結構模組化、配置簡單以及資源消耗非常低等。擁有HTTPS訪問、gzip壓縮、虛擬主機和URL重寫等功能,不但可以搭配FastCGI程式處理動態請求,還可以用於代理、反向代理、負載均衡和快取伺服器等功能。P2
1)程序和訪問控制
Nginx由一個主程序和多個工作程序組成,主程序接收客戶端請求,再轉交給工作程序處理,從而很好地利用多核心CPU的計算能力。P89
Nginx的訪問控制是網路安全防範和保護的主要策略,其任務是保證網路資源不被非法訪問。P93
2)日誌記錄功能
Nginx提供了一個非常靈活的日誌記錄功能,它可以使每個塊的配置擁有各自獨立的日誌進行記錄,並且根據記錄內容的不同又分為訪問日誌和錯誤日誌。P101
(1)訪問日誌用於記錄客戶端訪問Nginx的每一個請求。記錄使用者的IP、訪問時間、請求方式、響應狀態、地域來源、跳轉來源、使用終端等資訊。
(2)錯誤日誌記錄在訪問Nginx時出錯的記錄,可以檢視某個服務的效能瓶頸。
3)虛擬主機技術
虛擬主機技術是指一臺物理主機伺服器上劃分出多個磁碟空間,每個磁碟空間都是一臺虛擬主機,每臺虛擬主機都可以獨立對外提供Web服務,且互不干擾。
利用虛擬主機可把多個不同域名的網站部署在同一臺伺服器上,而不必再為建立一個網站單獨購買一臺伺服器,既解決了維護難題,又節省了硬體成本。P107
二、PHP與Nginx
對Nginx而言,PHP是一個外部程式,而非其內部的一個模組。為了讓Web伺服器的功能擴充套件性更強,就需要支援CGI(Common Interface,公共閘道器介面)規範。P124
1)CGI
CGI是Web伺服器與外部程式之間的介面標準,用於兩種不同程式之間的資訊傳遞。CGI規範允許Web伺服器根據瀏覽器請求呼叫CGI程式,並將其輸出結果通過響應傳送給瀏覽器,從而使Web伺服器支援處理複雜的網站業務需求。
Web伺服器支援CGI的意義不在於效能而在於開發,開發者只需要編寫一個CGI檔案放在網站目錄中,當瀏覽器請求CGI檔案,Web伺服器就會呼叫CGI程式執行CGI檔案,等待CGI程式處理完成後,再將程式的輸出結果返回給瀏覽器。
2)FastCGI和PHP-FPM
FastCGI主要用於解決CGI效能上的缺陷。傳統CGI方式是每當客戶端請求CGI時,Web伺服器就通過作業系統建立一個新的CGI程序,一個CGI程序完成一個請求處理後就退出,下次請求再建立一個新CGI程序。由於這種方式需要不斷為每個請求建立程序,因此在網站併發量很大時顯得非常低效。FastCGI優化了這種工作方式,它由一個常駐的CGI程序管理器,通過管理一個程序池來處理Web伺服器的請求,由此提高了效能。
PHP提供的PHP-FPM(FastCGI Process Manager)就是一個FastCGI程序管理器,其可執行檔案位於PHP安裝的目錄中。
三、負載均衡與快取
1)正向代理
代理也稱為正向代理,是一個位於客戶端和目標伺服器之間的代理伺服器,客戶端將傳送的請求和指定的目標伺服器提交給代理伺服器,然後代理伺服器向目標伺服器發起請求,並將獲得的響應結果返回給客戶端。P158
2)反向代理
反向代理對於客戶端而言就是目標伺服器,客戶端反向代理伺服器傳送請求後,反向代理伺服器將該請求轉發給內部網路上的後端伺服器,並從後端伺服器上得到的響應結果返回給客戶端。
兩種代理的特性有:安全性和功能性。
3)負載均衡
負載均衡(load balance)就是將負載分攤到多個操作單元上執行,從而提高服務的可用性和響應速度,帶給使用者更好的體驗。P162
目前負載均衡有4種典型的配置方式,分別為輪詢、權重、ip_hash和利用第三方模組的方式。
4)Web快取方式
利用反向代理伺服器對訪問頻率較多的內容進行快取,有利於節省後端伺服器的資源。Nginx提供了兩種Web快取方式:永久性快取和臨時性快取。P168
永久性快取:將內容源伺服器響應的內容快取到本地,若不手動刪除,該快取檔案會一直生效。
臨時性快取:採用md5演算法將請求連線進行雜湊後,根據具體配置生成快取檔案目錄,儲存響應的資料。
Web快取伺服器位於內容源Web伺服器和客戶端之間,當客戶端使用者訪問一個URL時,Web快取伺服器就會請求相應的內容源Web伺服器,並將響應的資訊快取至記憶體或磁碟;然後,當下一個請求到來時,如果訪問的是相同URL,Web快取伺服器會直接將已快取的內容輸出給客戶端,而不用再次向內容源Web伺服器傳送請求。
四、模組配置應用
由於Nginx的高度模組化設計,使得每個模組的功能相對簡單,便於實現功能的擴充套件性。P182
1)模組化結構設計
模組化結構設計就是以功能塊為單位進行程式設計,實現其求解演算法的一種方法。模組化結構設計的目的是為了降低程式複雜度,使程式設計、除錯和維護等操作簡單化,方便團隊協作以及應用的擴充套件升級。
換句話說,Nginx就像是積木搭建的房子,在實現規範介面的前提下,各個團隊只要保持介面不變,可同時開發功能模組,這樣就可以根據實際需求不斷地加入新的功能,或者去掉舊的功能,達到應用程式的高配置性、高擴充套件性、高定製性和高伸縮性。
Nginx分為5大模組:核心模組、標準HTTP模組、可選HTTP模組、郵件服務模組和第三方模組。
2)gzip
gzip(GNU-ZIP)是一種壓縮技術,經過gzip壓縮後,頁面大小可以變為原來的30%甚至更小。gzip網頁壓縮的實現需要瀏覽器和伺服器的支援。P195
gzip的壓縮過程:首先在伺服器端壓縮,然後傳到瀏覽器端後解壓。當瀏覽器支援gzip解壓時,會在請求訊息頭中包含Accpet-Encoding:gzip,這樣Nginx就會向瀏覽器傳送經過gzip後的內容,同時在響應訊息頭中加入Content-Encoding:gzip,宣告這是gzip後的內容,告知瀏覽器要先解壓後才能解析輸出。
3)重寫與重定向
為了能夠在修改網站結構或域名後,避免造成網站中的連結或在其他網站中的外鏈失效,以及提高該網站在搜尋引擎的收錄量和排名等目的。通常會採用URL重寫與重定向,在增強網站專業化的同時,為使用者提供更加舒適的使用體驗。P198
下面第6行通過if指令判斷訪問不到使用者請求或目錄時,執行第7行指令,^/.*用於匹配當前網路下的所有請求,/default/default.html用於替換符合指定規則的請求。
下面第5行利用set指令為變數$name賦值,$1表示符合正則表示式第一個子模式的值。第6行用於在使用者請求“http://test.ng.test/img-數字.jpg”時,重定向到“http://test.ng.test/img/數字.jpg”。