网上有一篇关于nginx平滑升级的博客内容和思路写的非常清晰,博主N多次的升级(升级脚本无效)都是依照上面来操作的。
博主使用的是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的平滑升级了。
总结一下:
最新版本的nginx安装包建议和旧版本的包在同一目录内,防止configure参数的路径错误问题。
在升级前,先备份旧版本的程序,以便出错可以立即还原。
替换新的执行程序之后,需要验证一下新版本程序是否正常
以上都OK了,再去操作新旧版本程序进程的接替,保证WEB不停服的nginx平滑静默升级