文/郝淑惠
Nginx雖然開發的時間不長,但是由于其低內存消耗、高穩定性和代碼開源,很快受到許多公司和開發人員的喜愛,大量的研究人員對Nginx進行研究。
ngxpagespeed模塊是谷歌基于Nginx開發的,大大提高了網頁的加載速度,并且降低了用戶訪問延遲。
Nginx在中國也有大量用戶和研究人員,并開發了不同的項目。比如,Tengine是由阿里巴巴基于Nginx開發的,它在Nginx的基礎上,針對大訪問量網站的需求,添加了很多高級功能和特性。
負載均衡多年來一直是研究的熱點,并且不斷有新的算法被提出。負載均衡不僅在同構集群系統和異構集群系統中得到廣泛應用,而且在分布式系統和云系統中也得到了廣泛應用。通常,人們用節點的負載與性能比來衡量負載權重,值越大,權重越大。
Nginx有多種負載均衡算法,負載均衡的主要目的是將大量并發請求合理地分布到集群中的服務器上,根據算法是否內置,分為內置算法和擴展算法兩種類型,加權輪詢算法就屬于內置算法,而一致性哈希算法則屬于擴展算法。
如果沒有配置任何負載均衡算法時,負載均衡算法會默認是加權輪詢算法。
下文是Nginx中加權輪詢算法的部分配置:

加權輪詢算法存在的缺點是:加權輪詢算法會根據配置經驗進行權重配置,服務器的真實性能難以得到體現,并且由于客戶端對每個請求的處理時間不同,會產生不均衡問題。當某個服務器的權重相對較大,并且正在用時較長的用戶請求時,假如又有新的請求需要處理,由于該服務器的權重相對較大,新的請求會被分配給該服務器。該服務器會因為處理的請求過多而超載,其他服務器卻沒有處理請求。
一致性哈希算法就是將服務器地址按照一定規則(比如路由分配情況,服務器承載服務種類等)分配到一張哈希表中。當有新的數據請求時,會根據哈希表中的順序,選擇最近的一個服務器來處理該請求。
優點是,所選服務器是緩存服務器時,可以快速找到存儲該類型數據的服務器。缺點是,一般的哈希算法是根據路由狀況生成哈希表的,當該服務器不是緩存服務器時,如果遇到一個IP段出現大量請求,則會將這些請求都分配到同一臺服務器。
Nginx支持正則表達式,是一款配置靈活的高性能Web服務器。在對Nginx性能進行調優時,可以一次只改一個配置項,如果更改后性能沒有變化,就改回原來的值。

在全局塊中,需要配置一些項。以下是一些需要特別關注的幾個:
(1)設置創建的工作進程數。Nginx可以運行多個工作進程,每個都能處理大量連接。Nginx通過主進程創建工作進程。具體的數值設置由Nginx配置文件中的worker_connectons決定。設置的值太低,可能導致無法有效地處理高并發請求。如果設置的值太高,將導致工作進程之間的連續切換,增加系統損耗。
(2)每個工作進程設置固定的CPU內核。這樣做可以避免同一個工作進程選擇不同的CPU內核。
(3)設置nginx進程可以打開的最大文件數。如果設置的數值太低,當同時的連接數過多時,將會出現“打開的文件太多”問題。

events塊為Nginx中的連接處理進行相應的設置。
(1)設置工作進程的最大連接數。這一數值的設置應該與全局塊中提到的值相同。
(2)設置事件驅動模型。不同操作系統的事件驅動模型不同,因此該參數的設定一般根據操作系統來決定。如果是linux2.6+,使用epoll;如果是BSD,如Mac,使用Kqueue。
作為Web服務器,http塊是Nginx最核心的一個模塊,配置項也比較多,需要根據硬件信息進行適當的配置,常規情況下,使用默認配置即可。
有關Nginx性能調優,還有很多內容,比如,啟用緩存可以顯著地降低響應時間,同時能顯著減輕后端服務器的負載;壓縮響應可以大大減小響應的大小,減少帶寬占用。
隨著國內外研究人員對Nginx的深入研究,Nginx的穩定性、安全性和高效性在未來將會大大提高,并且會給用戶帶來更好的體驗。