99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

nginx平滑重啟的實現(xiàn)方法

服務(wù)器

一、背景

雙牌網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,雙牌網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為雙牌近千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的雙牌做網(wǎng)站的公司定做!

在服務(wù)器開發(fā)過程中,難免需要重啟服務(wù)加載新的代碼或配置,如果能夠保證server重啟的過程中服務(wù)不間斷,那重啟對于業(yè)務(wù)的影響可以降為0。最近調(diào)研了一下nginx平滑重啟,覺得很有意思,記錄下來供有興趣的同學(xué)查閱。

二、重啟流程

重啟意味著新舊接替,在交接任務(wù)的過程中勢必會存在新舊server并存的情形,因此,重啟的流程大致為: 啟動新的server 新舊server并存,兩者共同處理請求,提供服務(wù) 舊的server處理完所有的請求之后優(yōu)雅退出 這里,最主要的問題在于如何保證新舊server可以并存,如果重啟前后的server端口一致,如何保證兩者可以監(jiān)聽同一端口。

三、nginx實現(xiàn)

為了驗證nginx平滑重啟,筆者首先嘗試nginx啟動的情形下再次開啟一個新的server實例,結(jié)果如圖:

很明顯,重新開啟server實例是行不通的,原因在于新舊server使用了同一個端口80,在未開始socket reuseport選項復(fù)用端口時,bind系統(tǒng)調(diào)用會出錯。nginx默認bind重試5次,失敗后直接退出。而nginx需要監(jiān)聽IPV4地址0.0.0.0和IPV6地址[::],故圖中打印出10條emerg日志。

接下來就開始嘗試平滑重啟命令了,一共兩條命令:

kill -USR2 `cat /var/run/nginx.pid`
kill -QUIT `cat /var/run/nginx.pid.oldbin`

第一條命令是發(fā)送信號USR2給舊的master進程,進程的pid存放在/var/run/nginx.pid文件中,其中nginx.pid文件路徑由nginx.conf配置。

第二條命令是發(fā)送信號QUIT給舊的master進程,進程的pid存放在/var/run/nginx.pid.oldbin文件中,隨后舊的master進程退出。

那么問題來了,為什么舊的master進程的pid存在于兩個pid文件之中?事實上,在發(fā)送信號USR2給舊的master進程之后,舊的master進程將pid重命名,原先的nginx.pid文件rename成nginx.pid.oldbin。這樣新的master進行就可以使用nginx.pid這個文件名了。

先執(zhí)行第一條命令,結(jié)果如圖:

不錯,新舊master和worker進程并存了。 再來第二條命令,結(jié)果如圖:

如你所見,舊的master進程8527和其worker進程全部退出,只剩下新的master進程12740。

不由得產(chǎn)生困惑,為什么手動開啟一個新的實例行不通,使用信號重啟就可以達到。先看下nginx log文件:

除了之前的錯誤日志,還多了一條notice,意思就是繼承了sockets,fd值為6,7。 隨著日志翻看nginx源碼,定位到nginx.c/ngx_exec_new_binary函數(shù)之中,

ngx_pid_t
ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv)
{
  ...
  ctx.path = argv[0];
  ctx.name = new binary process;
  ctx.argv = argv;
  n = 2;
  env = ngx_set_environment(cycle, &n);
...
  var = ngx_alloc(sizeof(NGINX_VAR)
          + cycle->listening.nelts * (NGX_INT32_LEN + 1) + 2,
          cycle->log);
...
  p = ngx_cpymem(var, NGINX_VAR =, sizeof(NGINX_VAR));
  ls = cycle->listening.elts;
  for (i = 0; i < cycle->listening.nelts; i++) {
    p = ngx_sprintf(p, %ud;, ls[i].fd);
  }
  *p = \'\\0\';
  env[n++] = var;
...
  env[n] = NULL;
...
  ctx.envp = (char *const *) env;
  ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
  if (ngx_rename_file(ccf->pid.data, ccf->oldpid.data) == NGX_FILE_ERROR) {
    ...
    return NGX_INVALID_PID;
  }
  pid = ngx_execute(cycle, &ctx);
  if (pid == NGX_INVALID_PID) {
    if (ngx_rename_file(ccf->oldpid.data, ccf->pid.data)
      == NGX_FILE_ERROR)
    {
      ...
    }
  }
...
  return pid;
}

函數(shù)的流程為

將舊的master進程監(jiān)聽的所有fd,拷貝至新master進程的env環(huán)境變量NGINX_VAR。 rename重命名pid文件 ngx_execute函數(shù)fork子進程,execve執(zhí)行命令行啟動新的server。 在server啟動流程之中,涉及到環(huán)境變量NGINX_VAR的解析,ngx_connection.c/ngx_add_inherited_sockets具體代碼為:
static ngx_int_t
ngx_add_inherited_sockets(ngx_cycle_t *cycle)
{
...
  inherited = (u_char *) getenv(NGINX_VAR);
  if (inherited == NULL) {
    return NGX_OK;
  }
  if (ngx_array_init(&cycle->listening, cycle->pool, 10,
            sizeof(ngx_listening_t))
    != NGX_OK)
  {
    return NGX_ERROR;
  }
  for (p = inherited, v = p; *p; p++) {
    if (*p == \':\' || *p == \';\') {
      s = ngx_atoi(v, p - v);
      ...
      v = p + 1;
      ls = ngx_array_push(&cycle->listening);
      if (ls == NULL) {
        return NGX_ERROR;
      }
      ngx_memzero(ls, sizeof(ngx_listening_t));
      ls->fd = (ngx_socket_t) s;
    }
  }
  ...
  ngx_inherited = 1;
  return ngx_set_inherited_sockets(cycle);
}

函數(shù)流程為:

解析環(huán)境變量NGINX_VAR的值,獲取fd存入數(shù)組

fd對應(yīng)的socket設(shè)為ngx_inherited,保存這些socket的信息。

也就是說,新的server壓根就沒重新bind端口listen,這些fd狀態(tài)和值都是新的master進程fork時帶過來的,新的master進程監(jiān)聽處理繼承來的文件描述符即可,這里比較關(guān)鍵的一點在于listen socket文件描述符通過ENV傳遞。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

網(wǎng)頁名稱:nginx平滑重啟的實現(xiàn)方法
文章來源:http://www.yijiale78.com/article34/cpdhpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站全網(wǎng)營銷推廣品牌網(wǎng)站建設(shè)網(wǎng)站策劃外貿(mào)建站靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)