chaihongjun.me

WEB不停服nginx平滑静默升级和跨版本升级注意事项

   网上有一篇关于nginx平滑升级的博客内容和思路写的非常清晰,博主N多次的升级(升级脚本无效)都是依照上面来操作的。

WEB不停服nginx平滑静默升级和跨版本升级注意事项

  博主使用的是oneinstack脚本,由于服务器的版本是1.8.1,最近的版本是1.10.2,显然已经跨了两个副版本号,所以LNMP的升级脚本也无法升级。各中原因主要是1.9之后的spdy模块变更为了v2,因此,脚本通不过。以下的操作顺序是在网上那篇文章基础上,结合自身无法使用脚本的快速平滑升级而出,通常情况下,以下的方法适用于任何手动升级模式。

#1. 先将最新的1.10.2的源码包,使用sohu镜像下载到lnmp的源码路径中:lnmp/src
wget  
#2. 解压包
tar zxf nginx-1.10.2.tar.gz
#.3 直接进入解压之后的最新安装包并获取之前的安装configure参数
cd nginx-1.10.2
nginx -V
#4. 这个时候将显示之前的安装configure参数,拉动鼠标复制到剪切板
#5. 将configure参数粘贴到configure命令之后
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_spdy_module --with-http_ssl_module --with-ipv6 --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-ld-opt='-ljemalloc

这里需要特别注意的是

--with-http_spdy_module

由于从1.9之后该模块升级为

--with-http_v2_module

这里又是从1.8升级到1.10必然升级参数不对,所以改成

--with-http_v2_module

完整的配置参数:

./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-ipv6 --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-ld-opt='-ljemalloc'

 然后命令行编译命令:

make

这个时候在nginx-1.10.2的源码包的objects目录里就生成了最新版本的nginx。后面就是平滑升级的具体部分:

#备份1.8.1版本的程序,如果不成功可以还原旧版本
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx1.8.1
#复制新生成的程序到执行目录中
cp objs/nginx /usr/local/nginx/sbin/nginx
#检测一下新版本的是否正常
 /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
#正常的话就开始对nginx做平滑升级了,关闭旧版本程序的进程,启动新版本进程,互相做接替
kill -USR2 `cat /var/run/nginx.pid`
kill -WINCH `cat /var/run/nginx.pid.oldbin`
kill -HUP `cat /var/run/nginx.pid.oldbin` 
kill -QUIT `cat /var/run/nginx.pid.oldbin`

完成上述操作就完成了nginx的平滑升级了。

总结一下:

  1. 最新版本的nginx安装包建议和旧版本的包在同一目录内,防止configure参数的路径错误问题。

  2. 在升级前,先备份旧版本的程序,以便出错可以立即还原。

  3. 替换新的执行程序之后,需要验证一下新版本程序是否正常

  4. 以上都OK了,再去操作新旧版本程序进程的接替,保证WEB不停服的nginx平滑静默升级




知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。作者:柴宏俊»