女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么NGINX的reload命令不是熱加載?

OSC開源社區(qū) ? 來源:OSC開源社區(qū) ? 作者:劉維 ? 2022-11-24 11:23 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者 劉維

這段時(shí)間在 Reddit 看到一個(gè)討論,為什么 NGINX 不支持熱加載?乍看之下很反常識(shí),作為世界第一大 Web 服務(wù)器,不支持熱加載?難道大家都在使用的 nginx -s reload 命令都用錯(cuò)了?帶著這個(gè)疑問,讓我們開始這次探索之旅,一起聊聊熱加載和 NGINX 的故事。

NGINX 相關(guān)介紹

NGINX 是一個(gè)跨平臺(tái)的開源 Web 服務(wù)器,使用 C 語言開發(fā)。據(jù)統(tǒng)計(jì),全世界流量最高的前 1000 名網(wǎng)站中,有超過 40% 的網(wǎng)站都在使用 NGINX 處理海量請(qǐng)求。

NGINX 有什么優(yōu)勢(shì),導(dǎo)致它從眾多的 Web 服務(wù)器中脫穎而出,并一直保持高使用量呢?

我覺得核心原因在于,NGINX 天生善于處理高并發(fā),能在高并發(fā)請(qǐng)求的同時(shí)保持高效的服務(wù)。相比于同時(shí)代的其他競(jìng)爭(zhēng)對(duì)手例如 Apache、Tomcat 等,其領(lǐng)先的事件驅(qū)動(dòng)型設(shè)計(jì)和全異步的網(wǎng)絡(luò) I/O 處理機(jī)制,以及極致的內(nèi)存分配管理等眾多優(yōu)秀設(shè)計(jì),將服務(wù)器硬件資源壓縮到了極致。使得 NGINX 成為高性能 Web 服務(wù)器的代名詞。

當(dāng)然,除此之外還有一些其他原因,比如:

高度模塊化的設(shè)計(jì),使得 NGINX 擁有無數(shù)個(gè)功能豐富的官方模塊和第三方拓展模塊。

最自由的 BSD 許可協(xié)議,使得無數(shù)開發(fā)者愿意為 NGINX 貢獻(xiàn)自己的想法。

支持熱加載,能保證 NGINX 提供 7x24h 不間斷的服務(wù)。

關(guān)于熱加載

大家期望的熱加載功能是什么樣的?我個(gè)人認(rèn)為,首先應(yīng)該是用戶端無感知的,在保證用戶請(qǐng)求正常和連接不斷的情況下,實(shí)現(xiàn)服務(wù)端或上游的動(dòng)態(tài)更新。

那什么情況下需要熱加載?在如今云原生時(shí)代下,微服務(wù)架構(gòu)盛行,越來越多的應(yīng)用場(chǎng)景有了更加頻繁的服務(wù)變更需求。包括反向代理域名上下線、上游地址變更、IP 黑白名單更新等,這些都和熱加載息息相關(guān)。

那么 NGINX 是如何實(shí)現(xiàn)熱加載的?

NGINX 熱加載的原理

執(zhí)行 nginx -s reload 熱加載命令,就等同于向 NGINX 的 master 進(jìn)程發(fā)送 HUP 信號(hào)。在 master 進(jìn)程收到 HUP 信號(hào)后,會(huì)依次打開新的監(jiān)聽端口,然后啟動(dòng)新的 worker 進(jìn)程。

此時(shí)會(huì)存在新舊兩套 worker 進(jìn)程,在新的 worker 進(jìn)程起來后,master 會(huì)向老的 worker 進(jìn)程發(fā)送 QUIT 信號(hào)進(jìn)行優(yōu)雅關(guān)閉。老的 worker 進(jìn)程收到 QUIT 信號(hào)后,會(huì)首先關(guān)閉監(jiān)聽句柄,此時(shí)新的連接就只會(huì)流進(jìn)到新的 worker 進(jìn)程中,老的 worker 進(jìn)程處理完當(dāng)前連接后就會(huì)結(jié)束進(jìn)程。
1d07f134-6b2e-11ed-8abf-dac502259ad0.png


從原理上看,NGINX 的熱加載能很好地滿足我們的需求嗎?答案很可能是否定的,讓我們來看下 NGINX 的熱加載存在哪些問題。

NGINX 熱加載的缺陷

首先,NGINX 頻繁熱加載會(huì)造成連接不穩(wěn)定,增加丟失業(yè)務(wù)的可能性。

NGINX 在執(zhí)行 reload 指令時(shí),會(huì)在舊的 worker 進(jìn)程上處理已經(jīng)存在的連接,處理完連接上的當(dāng)前請(qǐng)求后,會(huì)主動(dòng)斷開連接。此時(shí)如果客戶端沒處理好,就可能會(huì)丟失業(yè)務(wù),這對(duì)于客戶端來說明顯就不是無感知的了。

其次,在某些場(chǎng)景下,舊進(jìn)程回收時(shí)間長,進(jìn)而影響正常業(yè)務(wù)。

比如代理 WebSocket 協(xié)議時(shí),由于 NGINX 不解析通訊幀,所以無法知道該請(qǐng)求是否為已處理完畢狀態(tài)。即使 worker 進(jìn)程收到來自 master 的退出指令,它也無法立刻退出,而是需要等到這些連接出現(xiàn)異常、超時(shí)或者某一端主動(dòng)斷開后,才能正常退出。

再比如 NGINX 做 TCP 層和 UDP 層的反向代理時(shí),它也沒法知道一個(gè)請(qǐng)求究竟要經(jīng)過多少次請(qǐng)求才算真正地結(jié)束。

這就導(dǎo)致舊 worker 進(jìn)程的回收時(shí)間特別長,尤其是在直播、新聞媒體活語音識(shí)別等行業(yè)。舊 worker 進(jìn)程的回收時(shí)間通常能達(dá)到半小時(shí)甚至更長,這時(shí)如果再頻繁 reload,將會(huì)導(dǎo)致 shutting down 進(jìn)程持續(xù)增加,最終甚至?xí)?dǎo)致 NGINX OOM,嚴(yán)重影響業(yè)務(wù)。


# 一直存在舊 worker 進(jìn)程:
nobody 6246 6241 0 10:51 ? 0000 nginx: worker process 
nobody 6247 6241 0 10:51 ? 0000 nginx: worker process 
nobody 6247 6241 0 10:51 ? 0000 nginx: worker process 
nobody 6248 6241 0 10:51 ? 0000 nginx: worker process 
nobody 6249 6241 0 10:51 ? 0000 nginx: worker process 
nobody 7995 10419 0 10:30 ? 0037 nginx: worker process is shutting down  <= here 
nobody 7995 10419 0 10:30 ? 0037 nginx: worker process is shutting down 
nobody 7996 10419 0 10:30 ? 0037 nginx: worker process is shutting down

從上述內(nèi)容可以看到,通過nginx -s reload方式支持的“熱加載”,雖然在以往的技術(shù)場(chǎng)景中夠用,但是在微服務(wù)和云原生迅速發(fā)展的今天,它已經(jīng)捉襟見肘且不合時(shí)宜。

如果你的業(yè)務(wù)變更頻率是每周或者每天,那么 NGINX 這種 reload 還是滿足你的需求的。但如果變更頻率是每小時(shí)、每分鐘呢?假設(shè)你有 100 個(gè) NGINX 服務(wù),每小時(shí) reload 一次的話,就要 reload 2400 次;如果每分鐘 reload 一次,就是 864 萬次。這顯然是無法接受的。

因此,我們需要一個(gè)不需要進(jìn)程替換的 reload 方案,在現(xiàn)有 NGINX 進(jìn)程內(nèi)可以直接完成內(nèi)容的更新和實(shí)時(shí)生效。

在內(nèi)存中直接生效的熱加載方案

在 Apache APISIX 誕生之初,就是希望來解決 NGINX 熱加載這個(gè)問題的。

Apache APISIX 是基于 NGINX + Lua 的技術(shù)棧,以 ETCD 作為配置中心實(shí)現(xiàn)的云原生、高性能、全動(dòng)態(tài)的微服務(wù) API 網(wǎng)關(guān),提供負(fù)載均衡、動(dòng)態(tài)上游、灰度發(fā)布、精細(xì)化路由、限流限速、服務(wù)降級(jí)、服務(wù)熔斷、身份認(rèn)證、可觀測(cè)性等數(shù)百項(xiàng)功能。

使用 APISIX 你不需要重啟服務(wù)就可以更新配置,這意味著修改上游、路由、插件時(shí)都不用重啟。既然是基于 NGINX,APISIX 又是如何擺脫 NGINX 的限制實(shí)現(xiàn)完美熱更新?我們先看下 APISIX 的架構(gòu)。 1d33deca-6b2e-11ed-8abf-dac502259ad0.png


通過上述架構(gòu)圖可以看到,之所以 APISIX 能擺脫 NGINX 的限制是因?yàn)樗焉嫌蔚扰渲萌糠诺?APISIX Core 和 Plugin Runtime 中動(dòng)態(tài)指定。

以路由為例,NGINX 需要在配置文件內(nèi)進(jìn)行配置,每次更改都需要 reload 之后才能生效。而為了實(shí)現(xiàn)路由動(dòng)態(tài)配置,Apache APISIX 在 NGINX 配置文件內(nèi)配置了單個(gè) server,這個(gè) server 中只有一個(gè) location。我們把這個(gè) location 作為主入口,所有的請(qǐng)求都會(huì)經(jīng)過這個(gè) location,再由 APISIX Core 動(dòng)態(tài)指定具體上游。因此 Apache APISIX 的路由模塊支持在運(yùn)行時(shí)增減、修改和刪除路由,實(shí)現(xiàn)了動(dòng)態(tài)加載。所有的這些變化,對(duì)客戶端都零感知,沒有任何影響。

再來幾個(gè)典型場(chǎng)景的描述。

比如增加某個(gè)新域名的反向代理,在 APISIX 中只需創(chuàng)建上游,并添加新的路由即可,整個(gè)過程中不需要 NGINX 進(jìn)程有任何重啟。再比如插件系統(tǒng),APISIX 可以通過 ip-restriction 插件實(shí)現(xiàn) IP 黑白名單功能,這些能力的更新也是動(dòng)態(tài)方式,同樣不需要重啟服務(wù)。借助架構(gòu)內(nèi)的 ETCD,配置策略以增量方式實(shí)時(shí)推送,最終讓所有規(guī)則實(shí)時(shí)、動(dòng)態(tài)的生效,為用戶帶來極致體驗(yàn)。

總結(jié)

NGINX 的熱加載在某些場(chǎng)景下會(huì)長時(shí)間存在新舊兩套進(jìn)程,導(dǎo)致額外消耗資源,同時(shí)頻繁熱加載也會(huì)導(dǎo)致小概率業(yè)務(wù)丟失。面對(duì)當(dāng)下云原生和微服務(wù)的技術(shù)趨勢(shì)下, 服務(wù)變化更加的頻繁,控制 API 的策略也發(fā)生了變化,導(dǎo)致我們對(duì)熱加載的需求提出了新需求,NGINX 的熱加載已經(jīng)不能滿足實(shí)際業(yè)務(wù)需求。

現(xiàn)在是時(shí)候切換到更貼合云原生時(shí)代并且更完善的熱加載策略、性能表現(xiàn)卓越的 API 網(wǎng)關(guān)——Apache APISIX,從而享受動(dòng)態(tài)、統(tǒng)一管理等特性帶來的管理效率上的極大提升。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1287

    瀏覽量

    71393
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    9793

    瀏覽量

    87935
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    737

    瀏覽量

    22874
  • nginx
    +關(guān)注

    關(guān)注

    0

    文章

    171

    瀏覽量

    12591

原文標(biāo)題:為什么NGINX的reload命令不是熱加載?

文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Nginx和Apache的差異

    Nginx是一個(gè) 輕量級(jí)/高性能 的反向代理Web服務(wù)器,用于 HTTP、HTTPS、SMTP、POP3 和IMAP 協(xié)議。
    的頭像 發(fā)表于 07-09 09:45 ?107次閱讀

    Nginx配置終極指南

    Nginx 是開源、高性能、高可靠的 Web 和反向代理服務(wù)器,而且支持熱部署,幾乎可以做到 7 * 24 小時(shí)不間斷運(yùn)行,即使運(yùn)行幾個(gè)月也不需要重新啟動(dòng),還能在不間斷服務(wù)的情況下對(duì)軟件版本進(jìn)行熱
    的頭像 發(fā)表于 06-18 15:56 ?328次閱讀
    <b class='flag-5'>Nginx</b>配置終極指南

    Nginx性能優(yōu)化終極指南

    而worker 進(jìn)程數(shù)默認(rèn)為 1 。單進(jìn)程最大連接數(shù)為1024。如下圖(打開Nginx目錄下的/conf/nginx.conf 文檔),現(xiàn)在我們來對(duì)這兩個(gè)數(shù)值進(jìn)行調(diào)優(yōu)
    的頭像 發(fā)表于 06-16 13:44 ?247次閱讀
    <b class='flag-5'>Nginx</b>性能優(yōu)化終極指南

    Nginx核心功能深度解析

    Nginx核心功能深度解析
    的頭像 發(fā)表于 05-09 10:50 ?281次閱讀

    Nginx緩存配置詳解

    Nginx 是一個(gè)功能強(qiáng)大的 Web 服務(wù)器和反向代理服務(wù)器,它可以用于實(shí)現(xiàn)靜態(tài)內(nèi)容的緩存,緩存可以分為客戶端緩存和服務(wù)端緩存。
    的頭像 發(fā)表于 05-07 14:03 ?572次閱讀
    <b class='flag-5'>Nginx</b>緩存配置詳解

    Nginx服務(wù)優(yōu)化教程

    隱藏Nginx版本號(hào),避免安全漏洞泄漏:修改配置文件法;修改源碼法
    的頭像 發(fā)表于 03-12 15:57 ?505次閱讀
    <b class='flag-5'>Nginx</b>服務(wù)優(yōu)化教程

    Nginx常見面試題總結(jié)

    Nginx是一個(gè) 輕量級(jí)/高性能的反向代理Web服務(wù)器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 協(xié)議。
    的頭像 發(fā)表于 03-03 09:36 ?494次閱讀
    <b class='flag-5'>Nginx</b>常見面試題總結(jié)

    深度解析Nginx Gzip指令:優(yōu)化網(wǎng)站性能與加速加載速度的關(guān)鍵工具

    說一段廢話 壓縮響應(yīng)數(shù)據(jù)有什么作用呢?問的好:從用戶體驗(yàn)和IT成本兩方面回答這個(gè)問題: 用戶體驗(yàn)上 網(wǎng)速一定的情況下,傳輸5MB數(shù)據(jù)比傳輸10MB數(shù)據(jù)的時(shí)間快了一半。所以傳輸數(shù)據(jù)越小用戶加載頁面就越
    的頭像 發(fā)表于 02-12 11:06 ?416次閱讀

    nginx+lua+redis實(shí)現(xiàn)灰度發(fā)布

    作者:馬仁喜 前言: 授人以魚不如授人以漁 .先學(xué)會(huì)用,在學(xué)原理,在學(xué)創(chuàng)造,可能一輩子用不到這種能力,但是不能不具備這種能力。這篇文章主要是沉淀使用nginx+lua+redis實(shí)現(xiàn)灰度,當(dāng)我們具備
    的頭像 發(fā)表于 12-17 10:01 ?431次閱讀

    Nginx日常運(yùn)維方法Linux版

    -1.10.0-1.el7.ngx.x86_64.rpm 離線包用其它方式下載也可以。 安裝:rpm -ivh nginx-1.10.0-1.el7.ngx.x86_64.rpm 如果找不wget請(qǐng)安裝,命令:yum -y install wget 2
    的頭像 發(fā)表于 12-06 16:38 ?459次閱讀
    <b class='flag-5'>Nginx</b>日常運(yùn)維方法Linux版

    詳解nginx中的正則表達(dá)式

    前言,我這里驗(yàn)證的nginx-v1.23.2單機(jī)環(huán)境下的nginx中的正則表達(dá)式、location路徑匹配規(guī)則和優(yōu)先級(jí)。
    的頭像 發(fā)表于 12-03 09:59 ?855次閱讀
    詳解<b class='flag-5'>nginx</b>中的正則表達(dá)式

    使用lsof實(shí)現(xiàn)對(duì)linux文件的誤刪除恢復(fù)練習(xí)

    lsof命令的幫助,恢復(fù)該日志數(shù)據(jù) 確保當(dāng)前nginx進(jìn)程運(yùn)行中 [root@master10 ~]# systemctl status nginx 查看nginx日志文件 [root
    的頭像 發(fā)表于 11-24 11:14 ?623次閱讀
    使用lsof實(shí)現(xiàn)對(duì)linux文件的誤刪除恢復(fù)練習(xí)

    nginx隱藏版本號(hào)與WEB服務(wù)器信息

    nginx不僅可以隱藏版本信息,還支持自定義web服務(wù)器信息 先看看最終的隱藏結(jié)果吧 具體怎么實(shí)現(xiàn)呢,其實(shí)也很簡(jiǎn)單,請(qǐng)往下看 1 官網(wǎng)下載最新穩(wěn)定版 wget http://nginx
    的頭像 發(fā)表于 11-22 10:25 ?607次閱讀
    <b class='flag-5'>nginx</b>隱藏版本號(hào)與WEB服務(wù)器信息

    nginx負(fù)載均衡配置介紹

    目錄 nginx負(fù)載均衡 nginx負(fù)載均衡介紹 反向代理與負(fù)載均衡 nginx負(fù)載均衡配置 Keepalived高可用nginx負(fù)載均衡器 修改Web服務(wù)器的默認(rèn)主頁 開啟
    的頭像 發(fā)表于 11-10 13:39 ?753次閱讀
    <b class='flag-5'>nginx</b>負(fù)載均衡配置介紹

    nginx中的正則表達(dá)式和location路徑匹配指南

    前言,我這里驗(yàn)證的nginx-v1.23.2單機(jī)環(huán)境下的nginx中的正則表達(dá)式、location路徑匹配規(guī)則和優(yōu)先級(jí)。
    的頭像 發(fā)表于 09-29 16:02 ?1738次閱讀
    <b class='flag-5'>nginx</b>中的正則表達(dá)式和location路徑匹配指南