只知道 Nginx 牛逼,卻不知道它怎么支持百萬并發(fā)?
本文將深入探討Nginx的關(guān)鍵技術(shù)和配置優(yōu)化,幫助您更好地了解如何利用Nginx實(shí)現(xiàn)高性能的Web服務(wù)器。
近年來,Nginx作為一款備受推崇的開源、高性能、高可靠的Web和反向代理服務(wù)器,備受業(yè)界關(guān)注。其強(qiáng)大的性能和高并發(fā)能力使其成為許多互聯(lián)網(wǎng)公司和知名網(wǎng)站的首選。但是,許多人對于Nginx如何支持百萬級并發(fā)連接的內(nèi)部工作原理卻知之甚少。本文將深入探討Nginx的關(guān)鍵技術(shù),揭秘其支持百萬級并發(fā)連接的秘密。
無論是運(yùn)維、開發(fā)、測試,Nginx 技術(shù)棧的學(xué)習(xí)總是必不可少的,只是不同的崗位掌握的深度與廣度不同而已。
什么是 Nginx?
Nginx 是開源、高性能、高可靠的 Web 和反向代理服務(wù)器,支持熱部署,幾乎可以做到 7 * 24 小時不間斷運(yùn)行,還可在不間斷服務(wù)的情況下對軟件版本進(jìn)行熱更新。Nginx 性能非常牛逼,占用內(nèi)存少、并發(fā)能力強(qiáng)、能支持高并發(fā),支持絕大部分協(xié)議,如TCP、UDP、SMTP、HTTPS等。最重要的是, Nginx 是免費(fèi)開源的且可以商業(yè)化,配置使用也比較簡單。
在中國有眾多互聯(lián)網(wǎng)大廠,如百度、京東、新浪、網(wǎng)易、騰訊等都在使用 Nginx,也有很多高知名度的國外網(wǎng)站也在使用 Nginx,比如:Netflix、GitHub、SoundCloud、MaxCDN等。
官方網(wǎng)站:http://www.nginx.org
Nginx 架構(gòu)
Nginx的架構(gòu)設(shè)計(jì)是支持高并發(fā)的基石。在啟動時,Nginx會生成主進(jìn)程(master)和工作進(jìn)程(worker)。主進(jìn)程負(fù)責(zé)調(diào)度工作進(jìn)程,而工作進(jìn)程則獨(dú)立處理網(wǎng)絡(luò)請求,每個工作進(jìn)程都可以同時處理數(shù)以千計(jì)的網(wǎng)絡(luò)請求。請查看以下示意圖:
Nginx 是如何支持百萬并發(fā)?
Nginx 能夠支持百萬并發(fā)連接,主要通過以下幾個方面來實(shí)現(xiàn):
主進(jìn)程與工作進(jìn)程
當(dāng) Nginx 啟動時,會生成主進(jìn)程(master)和工作進(jìn)程(worker)
root@nginx ~]# ps -ef|grep nginx root 6324 1 0 09:06 ? 00:00:00 nginx: master process /usr/local/nginx-1.12.2/sbin/nginx nobody 6325 6324 0 09:06 ? 00:00:00 nginx: worker process root 6327 1244 0 09:06 pts/0 00:00:00 grep --color=auto ngin
主進(jìn)程主要負(fù)責(zé)調(diào)度工作進(jìn)程(管理 Worker 進(jìn)程),并不直接處理網(wǎng)絡(luò)請求。
工作進(jìn)程(所有 Worker 進(jìn)程都對等的)是實(shí)際處理網(wǎng)絡(luò)請求及響應(yīng)的進(jìn)程,每個工作進(jìn)程都是獨(dú)立的,可同時處理數(shù)以千計(jì)的網(wǎng)絡(luò)請求。
Master 工作過程細(xì)節(jié)
1. Master 建立 listen 的 socket (listenfd)
2. Master,fork 出 Worker 進(jìn)程(fork:進(jìn)程鏡像)
3. 新請求到來時,所有 Worker 進(jìn)程的 listenfd 都變?yōu)榭勺x;
4. Worker 進(jìn)程,競爭 accept_mutex,獲勝的注冊 listenfd 的讀事件
5. Worker 進(jìn)程,在讀事件中,accept 當(dāng)前連接,并處理請求
疑問:
1. listenfd, Master 和 Worker 共享一個?
2.accept mutex 在哪里?
Worker 工作過程細(xì)節(jié):
1. 新請求到來時,所有 Worker 進(jìn)程的 listenfd 都變?yōu)榭勺x;
2. Worker 進(jìn)程,競爭 accept_mutex,獲勝的注冊 llistenfd 的讀事件
3. Worker 進(jìn)程,在讀事件中,accept 當(dāng)前連接;
4. Worker 進(jìn)程,讀取請求、解析請求、處理請求、進(jìn)行響應(yīng)。
事件驅(qū)動模型
Nginx 的事件驅(qū)動模型由事件收集器、發(fā)送器和處理器三部分基本單元組成。
事件收集器:收集 worker 進(jìn)程的各種 IO 請求
事件發(fā)送器:將 IO 事件發(fā)送到事件處理器
事件處理器:處理各種事件的響應(yīng)工作
Nginx 事件驅(qū)動架構(gòu)是基于異步及非阻塞的方式,這種設(shè)計(jì)允許 Nginx 同時處理多個網(wǎng)絡(luò)請求。
當(dāng)一個客戶端發(fā)起請求時,Nginx 會將該請求交給一個工作進(jìn)程,由工作進(jìn)程負(fù)責(zé)處理請求。工作進(jìn)程采用異步方式處理請求,每個請求在一個單獨(dú)的工作進(jìn)程中處理,這樣就不會因?yàn)橐粋€請求的阻塞而影響其他請求的處理。因些,它可以同時處理多個客戶端請求,從而提高了并發(fā)處理能力。
非阻塞IO
Nginx 在處理請求時采用了非阻塞 I/O 操作,這意味著它不會在等待 I/O 操作完成時阻塞進(jìn)程。通過使用非阻塞 I/O,Nginx 可以同時處理多個 I/O 操作,從而提高了整體的處理能力。
如前面的圖,事件發(fā)送器會將事件放入一個類似待處理的列表中,然后采用非非阻塞 I/O 方式來調(diào)用事件處理器來處理這個請求。
這種處理模式我們又將其稱為“多路復(fù)用 I/O”,最常見的有括這三種:select 模型、poll模型、epoll 模型。
內(nèi)存管理
Nginx 使用了強(qiáng)大內(nèi)存池技術(shù)來管理內(nèi)存,內(nèi)存池中的內(nèi)存塊是預(yù)先分配的,避免了頻繁的內(nèi)存分配和釋放操作,從而減少了內(nèi)存分配和釋放的開銷,這樣可以使 Nginx 在處理大量并發(fā)連接時更加高效。
負(fù)載均衡Nginx 可以作為反向代理服務(wù)器使用,將客戶端請求轉(zhuǎn)發(fā)給后端服務(wù)器處理。通過配置負(fù)載均衡策略,Nginx 可以將請求分發(fā)到多個后端服務(wù)器,進(jìn)一步提高整體的處理能力,這也是它給支持百萬并發(fā)的一大關(guān)鍵技術(shù)。upstream server_pools { server 192.168.1.100:8888 weight=5; server 192.168.1.101:9999 weight=5; server 192.168.1.102:6666 weight=5; #weigth參數(shù)表示權(quán)值,權(quán)值越高被分配到的幾率越大 } server { listen 80; server_name toymoban.com; location / { proxy_pass http://server_pools; } }
Nginx 實(shí)現(xiàn)負(fù)載均衡的策略
輪詢策略:默認(rèn)情況下采用的策略,將所有客戶端請求輪詢分配給服務(wù)端。這種策略是可以正常工作的,但是如果其中某一臺服務(wù)器壓力太大,出現(xiàn)延遲,會影響所有分配在這臺服務(wù)器下的用戶。 最小連接數(shù)策略:將請求優(yōu)先分配給壓力較小的服務(wù)器,它可以平衡每個隊(duì)列的長度,并避免向壓力大的服務(wù)器添加更多的請求。 最快響應(yīng)時間策略:優(yōu)先分配給響應(yīng)時間最短的服務(wù)器。 客戶端 ip 綁定策略:來自同一個 ip 的請求永遠(yuǎn)只分配一臺服務(wù)器,有效解決了動態(tài)網(wǎng)頁存在的 session 共享問題。
緩存
Nginx 支持緩存功能,Nginx 緩存作為性能優(yōu)化的一個重要手段,可以極大減輕后端服務(wù)器的負(fù)載。
我們可以通過 Nginx 配置將靜態(tài)文件存儲在本地磁盤上,直接提供給客戶端,減少了請求后端服務(wù)器的次數(shù),提高了性能和并發(fā)處理能力。proxy_cache_path #代理緩存的路徑 #語法格式 proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]; proxy_cache #開啟或關(guān)閉代理緩存 #語法格式 proxy_cache zone | off; #zone為內(nèi)存區(qū)域的名稱,即上面中keys_zone設(shè)置的名稱。 proxy_cache_key #定義如何生成緩存的鍵 #語法格式 proxy_cache_key string; #string為生成Key的規(guī)則,如proxy_host$request_uri。 proxy_cache_valid #緩存生效的狀態(tài)碼與過期時間。 #語法格式 proxy_cache_valid [code ...] time; #code為狀態(tài)碼,time為有效時間,可以根據(jù)狀態(tài)碼設(shè)置不同的緩存時間。如:proxy_cache_valid 200 302 30m; proxy_cache_min_uses #設(shè)置資源被請求多少次后被緩存。 #語法格式 proxy_cache_min_uses number; #number為次數(shù),默認(rèn)為1。 proxy_cache_use_stale #當(dāng)后端出現(xiàn)異常時,是否允許Nginx返回緩存作為響應(yīng)。 #語法格式 proxy_cache_use_stale error; #error為錯誤類型 proxy_cache_lock #是否開啟鎖機(jī)制 #語法格式 proxy_cache_lock on | off; proxy_cache_lock_timeout #配置鎖超時機(jī)制,超出規(guī)定時間后會釋放請求。 #語法格式 proxy_cache_lock_timeout time; proxy_cache_methods #設(shè)置對于那些HTTP方法開啟緩存。 #語法格式 proxy_cache_methods method; #method為請求方法類型,如GET、HEAD等。 proxy_no_cache #設(shè)置不存儲緩存的條件,符合時不會保存。 #語法格式 proxy_no_cache string...; #string為條件,如arg_nocache $arg_comment; proxy_cache_bypass #設(shè)置不讀取緩存的條件,符合時不會從緩存中讀取。 #語法格式 proxy_cache_bypass string...; #與上面proxy_no_cache的配置方法類似。 add_header #配置往響應(yīng)頭中添加字段信息。 #語法格式 add_header fieldName fieldValue; $upstream_cache_status #記錄了緩存是否命中的信息,存在以下多種情況: MISS:請求未命中緩存。 HIT:請求命中緩存。 EXPIRED:請求命中緩存但緩存已過期。 STALE:請求命中了陳舊緩存。 REVALIDDATED:Nginx驗(yàn)證陳舊緩存依然有效。 UPDATING:命中的緩存內(nèi)容陳舊,但正在更新緩存。 BYPASS:響應(yīng)結(jié)果是從原始服務(wù)器獲取的。 #注:這是一個Nginx內(nèi)置變量,與上面的參數(shù)不同。下面是一個配置實(shí)例
server{ location / { # 使用名為nginx_cache的緩存空間 proxy_cache hot_cache; # 對于200、206、304、301、302狀態(tài)碼的數(shù)據(jù)緩存1天 proxy_cache_valid 200 206 304 301 302 1d; # 對于其他狀態(tài)的數(shù)據(jù)緩存30分鐘 proxy_cache_valid any 30m; # 定義生成緩存鍵的規(guī)則(請求的url+參數(shù)作為key) proxy_cache_key $host$uri$is_args$args; # 資源至少被重復(fù)訪問三次后再加入緩存 proxy_cache_min_uses 3; # 出現(xiàn)重復(fù)請求時,只讓一個去后端讀數(shù)據(jù),其他的從緩存中讀取 proxy_cache_lock on; # 上面的鎖超時時間為3s,超過3s未獲取數(shù)據(jù),其他請求直接去后端 proxy_cache_lock_timeout 3s; # 對于請求參數(shù)或cookie中聲明了不緩存的數(shù)據(jù),不再加入緩存 proxy_no_cache $cookie_nocache $arg_nocache $arg_comment; # 在響應(yīng)頭中添加一個緩存是否命中的狀態(tài)(便于調(diào)試) add_header Cache-status $upstream_cache_status; }
模塊化設(shè)計(jì)
Nginx 的模塊化設(shè)計(jì)使得它能夠根據(jù)需求選擇和加載不同的模塊,以支持各種功能,如日志記錄、身份驗(yàn)證等。這種設(shè)計(jì)靈活性高,便于擴(kuò)展和維護(hù)。
Nginx 的模塊主要包括核心模塊、標(biāo)準(zhǔn)HTTP模塊、可選HTTP模塊、郵件服務(wù)模塊和第三方模塊等。這些模塊通過事件驅(qū)動模型和非阻塞I/O等技術(shù)手段,實(shí)現(xiàn)了高效地處理大量的并發(fā)連接,支持百萬級別的并發(fā)訪問。
Nginx 這種模塊化設(shè)計(jì)使得它可以根據(jù)不同的需求去加載不同的模塊,從而去支持各種不同的功能,這個設(shè)計(jì)非常靈活,且便于擴(kuò)展與維護(hù)。
核心模塊是Nginx的基礎(chǔ)部分,主要實(shí)現(xiàn)了底層的自身的一部分通訊協(xié)議,也為其他的一些模塊和Nginx的進(jìn)程等內(nèi)容提供了一個運(yùn)行時的環(huán)境。標(biāo)準(zhǔn)HTTP模塊是核心中的一部分,負(fù)責(zé)定義除配置模塊之外的其他模塊??蛇xHTTP模塊則提供了更多高級功能,如負(fù)載均衡、SSL加密等。郵件服務(wù)模塊則與郵件相關(guān)。第三方模塊則是一些由第三方提供的模塊,可以擴(kuò)展Nginx的功能。
總的來說,Nginx 的模塊化設(shè)計(jì)是其高性能、高并發(fā)能力的關(guān)鍵因素之一。
代理機(jī)制
Nginx 作為反向代理服務(wù)器能夠?qū)崿F(xiàn)請求轉(zhuǎn)發(fā)、負(fù)載均衡、緩存等功能,提高處理性能和并發(fā)能力。
Nginx 作為反向代理服務(wù)器使用時,會接收客戶端的請求并轉(zhuǎn)發(fā)給后端服務(wù)器處理。通過代理機(jī)制,Nginx能夠?qū)崿F(xiàn)請求的轉(zhuǎn)發(fā)、負(fù)載均衡、緩存等功能,提高了處理性能和并發(fā)能力。
相關(guān)的介紹文章可以參考: 以下是一個基本的配置示例:http { ............. upstream product_server{ 127.0.0.1:8081; } upstream admin_server{ 127.0.0.1:8082; } upstream test_server{ 127.0.0.1:8083; } server { #默認(rèn)指向product的server location / { proxy_pass http://product_server; } location /product/{ proxy_pass http://product_server; } location /admin/ { proxy_pass http://admin_server; } location /test/ { proxy_pass http://test_server; } } }
Nginx通過這些優(yōu)秀的技術(shù)設(shè)計(jì),然后將這些技術(shù)手段在 Nginx 中廣泛應(yīng)用,使得 Nginx 能夠高效地處理大量的并發(fā)連接,我們在實(shí)際應(yīng)用中,可以通過合理的配置 Nginx,來提高與優(yōu)化其性能,進(jìn)一步提高并發(fā)處理能力,從而去支持百萬級別的并發(fā)訪問。
Nginx 能夠高效地處理大量的并發(fā)連接,我們在實(shí)際應(yīng)用中,可以通過合理的配置 Nginx,來提高與優(yōu)化其性能,進(jìn)一步提高并發(fā)處理能力,從而去支持百萬級別的并發(fā)訪問。文章來源:http://www.zghlxwxcb.cn/article/743.html
示例
以下是一個示例,展示如何使用Nginx配置支持百萬級并發(fā)連接的簡單示例:文章來源地址http://www.zghlxwxcb.cn/article/743.html
worker_processes auto; # 自動設(shè)置工作進(jìn)程數(shù)量 events { worker_connections 1024; # 每個工作進(jìn)程允許的最大連接數(shù) use epoll; # 使用epoll事件驅(qū)動模型 } http { include mime.types; default_type application/octet-stream; sendfile on; # 開啟sendfile功能 tcp_nopush on; # 開啟tcp_nopush功能 tcp_nodelay on; # 開啟tcp_nodelay功能 keepalive_timeout 65; # 客戶端保持連接的超時時間 gzip on; # 開啟gzip壓縮 server { listen 80; location / { root /path/to/your/website; index index.html; } } }
到此這篇關(guān)于Nginx高并發(fā),Nginx怎么設(shè)置才支持百萬并發(fā)?的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!