1. 程式人生 > 其它 >nginx的平滑升級

nginx的平滑升級

一:解釋nginx的平滑升級

隨著nginx越來越流行,並且nginx的優勢也越來越明顯,nginx的版本迭代也來時加速模式,1.9.0版本的nginx更新了許多新功能,例如stream四層代理功能,伴隨著nginx的廣泛應用,版本升級必然越來越快,線上業務不能停,此時nginx的升級就是運維的工作了

Nginx方便地幫助我們實現了平滑升級。其原理簡單概括,就是:
(1)在不停掉老程序的情況下,啟動新程序。
(2)老程序負責處理仍然沒有處理完的請求,但不再接受處理請求。
(3)新程序接受新請求。
(4)老程序處理完所有請求,關閉所有連線後,停止。
這樣就很方便地實現了平滑升級。一般有兩種情況下需要升級Nginx,一種是確實要升級Nginx的版本,另一種是要為Nginx新增新的模組。

二.nginx平滑升級的原理:

多程序模式下的請求分配方式

nginx預設工作在多程序模式下,即主程序啟動完成配置載入和埠繫結等動作 ,fork出指定數量的工作程序,這些子程序會持有監聽埠檔案描述符(fd)並通過在該描述上新增監聽事件來接受連線(accept)

訊號的接受和處理

nginx主程序在啟動完成後進入等待狀態,負載相應各類系統訊息,如SIGCHLD,SIGHUP.SIGUSR2等

nginx訊號簡介

主程序支援的訊號

TERM,INT:立刻退出

QUIT:等待工作程序結束在提出,

KILL:強子終止程序

HUP:重新載入配置檔案,使用新的的配置啟動工作程序,並逐步關閉日程序

USR1:重新開啟日誌檔案

USR2:啟動新的主程序,實現熱升級

WINCH:逐步關閉工作程序

工作程序支援的訊號:

TERM,INT:立刻退出

QUIT:等待請求處理結束後再退出

USR1:重新開啟日誌檔案

[root@Centos ~]# yum install -y gcc gcc-c++ pcre-devel openssl-devel zlib-devel

[root@Centos ~]# tar zxvf nginx-1.6.0.tar.gz -C /usr/src/

[root@Centos ~]# cd /usr/src/nginx-1.6.0/
[root@Centos nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

[root@Centos nginx-1.6.0]# make

[root@Centos nginx-1.6.0]# make install

[root@Centos nginx-1.6.0]# ln -s /usr/local/nginx/sbin/* /usr/sbin/
[root@Centos nginx-1.6.0]# useradd -M -s /sbin/nologin nginx
[root@Centos nginx-1.6.0]# nginx
[root@Centos nginx-1.6.0]# netstat -anput | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19008/nginx: master

目前版本是1.6.0

[root@Centos nginx-1.6.0]# nginx -v
nginx version: nginx/1.6.0

目前版本是1.6.0且只有一個模組,該模式支援nginx狀態查詢,
[root@Centos nginx-1.6.0]# nginx -V
nginx version: nginx/1.6.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

[root@Centos nginx-1.6.0]# echo "nginx1.6.0" > /usr/local/nginx/html/index.html

[root@Centos nginx-1.6.0]# elinks 192.168.20.167

現在我們 需要jiangnginx版本進行升級 並在不影響業務的情況下新增SSL和pcre模組

[root@Centos ~]# tar zxvf nginx-1.11.2.tar.gz -C /usr/src/

[root@Centos ~]# cd /usr/src/nginx-1.11.2/
[root@Centos nginx-1.11.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=ngiinx --with-http_stub_status_module --with-http_ssl_module --with-pcre

[root@Centos nginx-1.11.2]# make

[root@Centos nginx-1.11.2]# cd
[root@Centos ~]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old
[root@Centos ~]# cp /usr/src/nginx-1.11.2/objs/nginx /usr/local/nginx/sbin/

[root@Centos ~]# mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.old[root@Centos ~]# cp /usr/src/nginx-1.11.2/conf/nginx.conf /usr/local/nginx/conf/nginx.conf

[root@Centos ~]# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
[root@Centos ~]# ls /usr/local/nginx/logs/
access.log error.log nginx.pid

[root@Centos ~]# ps aux | grep nginx
root 19008 0.0 0.0 24324 944 ? Ss 14:07 0:00 nginx: master process nginx
nginx 19009 0.0 0.1 26832 1744 ? S 14:07 0:00 nginx: worker process
root 53194 0.0 0.0 112660 976 pts/0 R+ 14:36 0:00 grep --color=auto ngin

驗證nginx是否升級成功

本文來自:https://www.cnblogs.com/bixiaoyu/p/6937453.html