<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Nginx進(jìn)程管理和重載原理詳解

          共 4855字,需瀏覽 10分鐘

           ·

          2021-04-24 00:33

          關(guān)注「開源Linux」,選擇“設(shè)為星標(biāo)”
          回復(fù)「學(xué)習(xí)」,有我為您特別篩選的學(xué)習(xí)資料~

          Nginx進(jìn)程結(jié)構(gòu)圖

          Nginx是多進(jìn)程結(jié)構(gòu),多進(jìn)程結(jié)構(gòu)設(shè)計(jì)是為了保證Nginx的高可用高可靠,包含:

          • master進(jìn)程:父進(jìn)程,負(fù)責(zé)worker進(jìn)程的管理

          • worker進(jìn)程:子進(jìn)程,worker進(jìn)程一般配置與服務(wù)器CPU核數(shù)相同,worker進(jìn)程用來(lái)處理具體請(qǐng)求。

          • cache進(jìn)程:也是子進(jìn)程,包括cache manager和cache loader進(jìn)程,主要是反向代理做緩存使用。

          注:多進(jìn)程相對(duì)于多線程之所以能夠保證高可用與高可靠是因?yàn)檫M(jìn)程間地址空間是獨(dú)立的,進(jìn)程間的任務(wù)不會(huì)相互影響,相對(duì)多線程更加耗費(fèi)CPU資源。而多線程共享一個(gè)進(jìn)程的地址空間,其中一個(gè)線程任務(wù)失敗會(huì)影響到其它線程任務(wù)。

          圖3-1 Nginx進(jìn)程結(jié)構(gòu)圖

          假設(shè)我們的Nginx服務(wù)的用戶是nginx,我們可以使用如下命令查看當(dāng)前運(yùn)行的Nginx服務(wù)的master進(jìn)程和worker進(jìn)程,而且可以看到4個(gè)worker進(jìn)程的父進(jìn)程ID都是master的進(jìn)程ID(1325)。

          [root@master ~]# ps -ef | grep nginx | grep -v grep | grep -v php-fpm
          root 1325 1 0 11:28 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
          nginx 1332 1325 0 11:28 ? 00:00:00 nginx: worker process
          nginx 1334 1325 0 11:28 ? 00:00:00 nginx: worker process
          nginx 1335 1325 0 11:28 ? 00:00:00 nginx: worker process
          nginx 1336 1325 0 11:28 ? 00:00:00 nginx: worker process

          圖3-2 一個(gè)master進(jìn)程與四個(gè)worker子進(jìn)程

          我們可以通過 lsof -i:nginx端口號(hào) 來(lái)查看我們的master和worker進(jìn)程。

          [root@master ~]# lsof -i:80
          COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
          nginx 1325 root 6u IPv4 22282 0t0 TCP *:http (LISTEN)
          nginx 1332 nginx 6u IPv4 22282 0t0 TCP *:http (LISTEN)
          nginx 1334 nginx 6u IPv4 22282 0t0 TCP *:http (LISTEN)
          nginx 1335 nginx 6u IPv4 22282 0t0 TCP *:http (LISTEN)
          nginx 1336 nginx 6u IPv4 22282 0t0 TCP *:http (LISTEN)

          信號(hào)量管理

          Linux的信號(hào)量管理機(jī)制

          信號(hào)是進(jìn)程間通信方式之一,典型用法是:終端用戶輸入中斷命令,通過信號(hào)機(jī)制停止一個(gè)程序的運(yùn)行。

          我們可以通過給進(jìn)程發(fā)送信號(hào)來(lái)管理我們的進(jìn)程,kill -l命令可以查看linux支持的信號(hào)量

          linux信號(hào)量

          一共有64號(hào)信號(hào)量,主要需要弄清如下幾個(gè):

          kill -1 $PID:(SIGHUP)重新加載進(jìn)程,對(duì)于與終端脫離關(guān)系的守護(hù)進(jìn)程,這個(gè)信號(hào)用于通知它重新讀取配置文件;

          kill -2 $PID:(SIGINT)中斷(Ctrl+C);

          kill -3 $PID:(SIGQUIT)從鍵盤輸入的退出(ctrl-\);

          kill -9 $PID:(SIGKILL)立即殺死進(jìn)程,無(wú)論當(dāng)前程序處于什么狀態(tài);

          kill -10 $PID:(SIGUSR1)$USR1和$USR2都是留給用戶自定義的信號(hào)量;

          kill -12 $PID:($IGUSR2)

          kill -15 $PID:(SIGTERM)正常停止一個(gè)進(jìn)程;

          kill -17 $PID:(SIGCHLD)父子進(jìn)程通信的信號(hào)量,父進(jìn)程可以fork()出很多子進(jìn)程,子進(jìn)程掛掉會(huì)給父進(jìn)程發(fā)送信號(hào);

          kill 可將指定的信息送至程序。預(yù)設(shè)的信息為 SIGTERM(15),可將指定程序終止。若仍無(wú)法終止該程序,可使用 SIGKILL(9) 信息嘗試強(qiáng)制刪除程序。程序或工作的編號(hào)可利用 ps 指令或 jobs 指令查看。

          kill -l   #查看所有能夠支持的信號(hào)
          kill PID #殺死一個(gè)進(jìn)程
          kill 1024
          kill 1024 2048 #殺死多個(gè)進(jìn)程,進(jìn)程之間用空格隔開
          kill -9 1024 #kill -9表示立即強(qiáng)制結(jié)束進(jìn)程

          注:Ctrl+C:停止終端中正在運(yùn)行的進(jìn)程,Ctrl+C可以比較好地中止終端中正在運(yùn)行的程序(進(jìn)程)

          利用信號(hào)量管理Nginx進(jìn)程

          管理Nginx進(jìn)程可以這些方式:master進(jìn)程、worker進(jìn)程、命令行

          使用信號(hào)量管理master和worker(不推薦使用發(fā)送信號(hào)量的方式來(lái)管理worker進(jìn)程,worker進(jìn)程應(yīng)該交給master進(jìn)程來(lái)管理和維護(hù))。

          Master進(jìn)程

          • 監(jiān)控worker進(jìn)程

            • CHLD

          • 管理worker進(jìn)程

          • 接收信號(hào)

            • TERM、INT

            • QUIT

            • HUP

            • USR1

            • USR2

            • WINCH

          示例:

          通過kill命令殺死m(xù)aster進(jìn)程

          kill -s SIGTERM 1325

          通過kill命令讓Nginx重新讀取文件,這樣會(huì)關(guān)閉舊worker進(jìn)程,生成新的worker進(jìn)程,master進(jìn)程(ID)依舊保持不變

          kill -s SIGHUP 1325

          Worker進(jìn)程

          • 接收信號(hào)

            • TERM、INT

            • QUIT

            • USR1

            • WINCH

          • 雖然可以,但是不推薦使用信號(hào)量方式直接管理worker進(jìn)程,worker進(jìn)程應(yīng)該交給master進(jìn)程來(lái)管理和維護(hù)

          示例:

          使用kill命令殺死一個(gè)worker進(jìn)程,這樣會(huì)殺死一個(gè)worker進(jìn)程,linux會(huì)殺掉的worker進(jìn)程的父進(jìn)程(master進(jìn)程)發(fā)送SIGCHLD信號(hào)量,所以master進(jìn)程監(jiān)測(cè)到我們某一個(gè)子進(jìn)程可能出了問題,會(huì)啟動(dòng)一個(gè)新的worker進(jìn)程,維護(hù)worker進(jìn)程的數(shù)量。

          kill -s SIGTERM 1332

          命令行

          • reload:HUP

          • reopen:USR2

          • stop:TERM

          • quit:QUIT

          可以使用nginx -h查看幫助命令

          [itbsl@master ~]$ nginx -h
          nginx version: nginx/1.18.0
          Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

          Options:
          -?,-h : this help
          -v : show version and exit
          -V : show version and configure options then exit
          -t : test configuration and exit
          -T : test configuration, dump it and exit
          -q : suppress non-error messages during configuration testing
          -s signal : send signal to a master process: stop, quit, reopen, reload
          -p prefix : set prefix path (default: /usr/local/nginx-1.18.0/)
          -c filename : set configuration file (default: conf/nginx.conf)
          -g directives : set global directives out of configuration file

          參數(shù)說(shuō)明:

          • -?,-h:查看幫助

          • -v:查看Nginx版本

          • -V:查看Nginx版本和編譯選項(xiàng)

          • -t:檢查配置文件語(yǔ)法是否正確

          • -T:檢查配置文件語(yǔ)法是否正確,并打印

          • -q:在檢查配置文件時(shí)不顯示非錯(cuò)誤消息

          • -s:給master進(jìn)程發(fā)送信號(hào),可以發(fā)送:stop、quit、reopen、reload

          • -c:指定配置文件

          • -g:設(shè)置配置文件之外的全局指令

          配置文件重載原理

          我們知道了可以通過給nginx的master進(jìn)程發(fā)送SIGHUP信號(hào),或者使用nginx -s reload命令來(lái)達(dá)到重新載入配置文件,從而使nginx平滑升級(jí)。那我們執(zhí)行這樣一個(gè)命令之后,對(duì)nginx本身來(lái)說(shuō)背后發(fā)生了什么事情呢,它是如何保證新老請(qǐng)求如何平滑過渡的?

          reload重載配置文件的流程

          1. 向master進(jìn)程發(fā)送HUP信號(hào)(reload命令)

          2. master進(jìn)程檢查配置語(yǔ)法是否正確

          3. master進(jìn)程打開監(jiān)聽端口(在修改配置文件的端口情況下,可能)

          4. master進(jìn)程使用新的配置文件啟動(dòng)新的worker子進(jìn)程

          5. master進(jìn)程向老的worker子進(jìn)程發(fā)送QUIT信號(hào)

          6. 舊的worker進(jìn)程關(guān)閉監(jiān)聽句柄,處理完當(dāng)前連接后關(guān)閉進(jìn)程

          如果用圖示來(lái)描述的話大概如下圖所示

          nginx -s reload

          圖示解析:

          1.左邊綠色的狀態(tài)是執(zhí)行nginx -s reload命令之前的狀態(tài),按照我個(gè)人主機(jī)的配置一個(gè)master進(jìn)程和4個(gè)worker子進(jìn)程。

          2.為了模擬執(zhí)行nginx -s reload命令后原來(lái)的worker進(jìn)程會(huì)處理完請(qǐng)求后再被殺掉,我模擬一個(gè)需要很久才能處理完任務(wù)并響應(yīng)的接口,是的,我在代碼里sleep 15秒,也就是說(shuō)這個(gè)接口響應(yīng)需要15秒,時(shí)間弄長(zhǎng)點(diǎn)方便我們來(lái)觀察中間態(tài),注意,在執(zhí)行reload命令前請(qǐng)求該接口

          <?php
          sleep(15);
          echo json_encode(['msg' => 'hello world']);die();

          3.我們已經(jīng)知道了master進(jìn)程會(huì)把任務(wù)交給worker子進(jìn)程處理,目前只有一個(gè)任務(wù),所以當(dāng)前只需要一個(gè)worker進(jìn)程需要處理任務(wù)。

          4.執(zhí)行reload命令,master進(jìn)程會(huì)創(chuàng)建4個(gè)(與你配置有關(guān))新的worker進(jìn)程(我上圖中的黃色worker進(jìn)程),關(guān)閉掉舊的空閑worker進(jìn)程(綠色worker進(jìn)程),而正在處理請(qǐng)求的舊worker進(jìn)程不會(huì)立即關(guān)閉,而是會(huì)等請(qǐng)求處理完畢就關(guān)閉。

          5.剩下的最后一個(gè)舊worker進(jìn)程任務(wù)處理完畢也被關(guān)掉,最后剩下的都是使用新nginx.conf配置產(chǎn)生的新worker進(jìn)程,可以看下面的這張圖,那個(gè)處于is shutting down的舊worker進(jìn)程就是因?yàn)樘幚砩厦鎠leep 15秒的任務(wù)接口還沒處理完畢,所以依然能夠被看到。

          原文鏈接:https://www.cnblogs.com/itbsl/p/14684211.html

          關(guān)注「開源Linux」加星標(biāo),提升IT技能

          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青青草免费在线视 | 免费一级片日本 | 牛牛精品一区二区 | 欧美双飞 | 交欧美|