官方的参考文件在这里
而且nginx源代码编译安装时也支持make upgrade了。但实际上使用来看,虽然不好用,但步骤基本上是正确的,所以可以看看其Makefile,结合官方文档了解下平滑升级到底是怎么做的。
1,备份原来的nginx

cp /usr/local/sbin/nginx /usr/local/sbin/nginx.bak

2,获取原来nginx的编译参数

cp /usr/local/sbin/nginx -V

3,用原来的编译参数来编新版本的nginx,并make

./configure ........;
make -j8;
make install;

需要注意的是,这里”make install”在cp新版本的nginx到目标路径的时候也许会出”Text file busy”的错误,那是要写入一个正在运行的二进制文件时会出这个错误。这时需要修改objs/Makefile把cp objs/nginx 那一行的cp加上参数”-f”,再make install就可以了。问题来了:为什么cp -f又可以写入正在运行的二进制文件呢?”man cp”告诉我们:-f参数会让系统先删掉目标文件,然后再cp过去新文件!
4,最后,再做平滑升级

make upgrade;

如果你要了解细节的话,可以分步骤:

kill -USR2 $(cat /var/run/nginx.pid);
sleep 1;
kill -WINCH $(cat /var/run/nginx.pid.oldbin);
sleep 5;
kill -QUIT $(cat /var/run/nginx.pid.oldbin);

注意:如果你的nginx的pid的配置是在nginx.conf里定制过的,那么直接make upgrade将不能正常工作!具体只要对比下Makefile中的pid路径和实际的路径即可,如果不一样,则千万别直接“make upgrade”!


0 Responses to “关于nginx的平滑升级(Upgrading Executable on the Fly)”

  1. No Comments

Leave a Reply





文章归档