一、解釋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 | 重新打開日志文件 |
四、先安裝一個nginx做測試用
#用yum安裝nginx所需要的包及組件
[root@Centos ~]# yum install -y gcc gcc-c++ pcre-devel openssl-devel zlib-devel
#解壓nginx
[root@Centos ~]# tar zxvf nginx-1.6.0.tar.gz -C /usr/src/
[root@Centos ~]# cd /usr/src/nginx-1.6.0/
#安裝nginx --后面都是指定的參數
[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
#查看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
#查看nginx版本
[root@Centos nginx-1.6.0]# nginx -v #-V可以顯示的更詳細包括模塊
nginx version: nginx/1.6.0
五、進行nginx升級
- 現在我們 需要將nginx版本進行升級 並在不影響業務的情況下添加SSL和pcre模塊
#解壓新nginx包
[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
#編譯 ###注意只進行編譯不執行make install
[root@Centos nginx-1.11.2]# make
[root@Centos nginx-1.11.2]# cd
#將nginx的可執行文件進行替換
[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/
#備份nginx配置文件
[root@Centos ~]# mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.old
#將新nginx配置文件
[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
#查看nginx進程,新舊替換中
[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
