nginx入門實踐

2021-08-26 20:18:09 字數 2874 閱讀 1808

nginx(engine x)是一種http伺服器,反向**伺服器,tcp/udp**伺服器。因擁有很多優秀的特性和提供了豐富的功能,被廣泛應用。具體可以看下官網介紹最常見是被用於反向**和負載均衡。本文著重介紹nginx的使用,以及負載均衡的原理。

nginx配置安裝nginx完成之後,安裝目錄下會有乙個nginx.conf檔案,裡面提供了nginx常見的配置,並展示主要配置模組。可以歸類如下:

...

#全域性塊

events

http #http塊

location [pattern]

}server

...#http全域性塊

}

events塊,對nginx伺服器和客戶端的連線進行配置

accept_mutex on; #設定網路連線序列化,防止發生驚群,預設開啟

multi_accept on; #設定乙個程序是否同時接受多個網路連線,預設禁用

use epoll;#epoll是多路復用io(i/o multiplexing)中的一種方式

worker_connections 1024; #乙個程序可連線的客戶端的最大連線數

介紹一下驚群,這裡的驚群是指,當乙個新的連線請求來的時候,所有的worker程序都將被喚醒,而最終只能有乙個worker進行來處理這個連線請求,其他的worker就白白被喚醒。這裡worder程序數就是由worker_processes來設定的。而避免驚群的方式就是新連線到來的時候,指定乙個worder程序來處理,對其他worker無感知。但是需要注意的是nginx的worker程序不像apache會建立那麼程序,程序數通常會設定成和當前機器的cpu數一樣,所以即便有驚群現象,影響也是比較小。而且如果同時請求比較多的話,換句話說一次不是來乙個連線請求,而是一批連線請求,那麼如果每個請求都去指定乙個worker去處理,效率反而會下降,影響最終的吞吐量。

io多路復用的實現方式跟系統有關,通常有下面幾種

select|poll|kqueue|epoll|resig|/dev/poll|eventport,在linux上使用的就是epoll,具體可以看一下nio的相關文件。

sendfile是linux下檔案傳輸的一種模式,概括來講,就是檔案由傳統read和write方式,從io-核心buf-使用者buf-socket相關buf-協議引擎經歷4此copy,改為io-核心buf-協議引擎只需要兩次copy,減少資料copy次數,提高傳輸效率。

server塊,乙個server可以當成是乙個虛擬主機,同乙個nginx根據不同的server可以同時提供不同的服務。

upstream mysvr 

server

location ~*^.+$

}

上面的配置的意思是,請求符合正則的將會使用負載均衡**到定義的mysvr中的伺服器上。而其他的,通常是靜態資源會到root對應的目錄中去尋找。upstream中可以ip加埠,也可以是網域名稱加埠,如果沒有埠,預設是80埠。weight是指負載均衡的權重,預設為1,值越大,將會有越多的請求發到這個server上。

執行流程

通過上面配置,nginx可以正常執行。而nginx的執行流程又是什麼樣的呢?網上有很多研究其原始碼的文章,我這裡總結一下主要流程。

1,在使用worker_processes進行配置表示的是建立worker程序數,其實除了worker程序之外,還會有master程序和cache manager程序。

2,master程序也是nginx啟動的主程序,從main函式開始執行到自身的事件迴圈,到最終的結束。其主要的工作是對nginx做整體的管理,包括對worker程序的管理,比如說啟動,關閉等,而不做具體的請求處理,比如說連線,讀寫等,這是由worker完成的。master的事件迴圈,是對管理事件進行監聽,然後通知各worker,從而達到對worker管理的作用。

3,worker被master建立啟動之後,會進入到自己的事件迴圈,在此迴圈中,一方面對master的事件進行響應,另一方面對連線和讀寫等事件進行處理。需要注意的是worker之間通過socket互相通訊。

4,cache manager/loader 是進行cache管理,主要用來將上游伺服器返回的資料快取在本地檔案中,如果請求命中快取,則直接通過sendfile將快取檔案的內容傳送給下游。cache的管理由cache loader/cache manager兩個程序合作完成;cache manager的功能是定期清理過期快取(基本策略為lru);cache loader的功能是將已經快取檔案對映到記憶體中。

那麼乙個請求來了之後,nginx具體怎麼處理的呢?

首先是worker在進行埠監聽,無論配置了多少個server,這些server都是共用這些worker的。如果配置了accept_mutex那麼將會交給其中乙個worker進行處理,否則所有worker進行競爭。這中間要明確乙個知識點,多個程序是可以同時監聽乙個埠的,通過fork就能實現,其實nginx便是這麼讓所有worker監聽同乙個埠的,而且程序之間存在競爭關係。

負載均衡

負載均衡是nginx很重要的功能。有以下幾種配置,分別對應了不同的路由**規則:

round robin(按照weight進行輪詢)

ip_hash

generic_hash(按照uri進行hash)

fair(按響應時間快慢路由)

backend(其他請求失敗的時候會落到此server)

參考

Nginx入門到實踐

http sub module http內容替換 location 請求頻率限制 limit reg module語法 limit conn zone binanry remote addr zone conn zone 1m 同個ip過來請求,每秒只允許乙個請求 工具htpasswd locati...

三 nginx從入門到實踐 場景實踐篇

靜態資源web服務 服務 負載均衡排程器lsb 動態快取 靜態資源型別 非伺服器動態執行生成的檔案 型別 種類 瀏覽器端渲染 html css js jpeg gif png cdn內容分發網路 配置語法 檔案讀取 with file aio 非同步檔案讀取 sendfile開啟的情況下,提高網路包...

Nginx從入門到實踐 基礎篇(安裝)

一 nginx快速搭建與基本引數額使用 版本mainline version 開發版本 stable version 穩定版 legacy version 歷史版本 nginx 官網 基於yum源安裝修改yum源 vim etc yum.repos.d nginx.repo 新增以下內容 nginx...