[实战]在不停止服务, 不丢失连接情况下更新NGINX到新版本(0.7.14 -> 0.7.17)

[实战]在不停止服务, 不丢失连接情况下更新NGINX到新版本(0.7.14 -> 0.7.17)

参考:http://wiki.codemongers.com/NginxCommandLine#utnbotf


一,准备工作:

备份nginx的二进制文件

[Copy to clipboard] [ - ]
CODE:
mv /usr/local/webserver/nginx/sbin/nginx /usr/local/webserver/nginx/sbin/nginx.old

下载, 编译得到新版本的nginx

[Copy to clipboard] [ - ]
CODE:
wget http://sysoev.ru/nginx/nginx-0.7.17.tar.gz
tar xzvf nginx-0.7.17.tar.gz
cd nginx-0.7.17  
./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with- http_stub_status_module --with-http_ssl_module
根据需求配置...
make
cp objs/nginx /usr/local/webserver/nginx/sbin/

将新版本的nginx可执行文件复制到相应目录

[Copy to clipboard] [ - ]
CODE:
cd /usr/local/webserver/nginx/sbin/
查看
[root@main sbin]# ./nginx -V
nginx version: nginx/0.7.17
built by gcc 4.1.1 20070105 (Red Hat 4.1.1-52)
configure arguments: --user=www --group=www --prefix=/usr/local/webserver/nginx --with- http_stub_status_module --with-http_ssl_module
[root@main sbin]# ./nginx.old -V
nginx version: nginx/0.7.14
built by gcc 4.1.1 20070105 (Red Hat 4.1.1-52)
configure arguments: --user=www --group=www --prefix=/usr/local/webserver/nginx --with- http_stub_status_module --with-http_ssl_module

二,启动新版本nginx

[Copy to clipboard] [ - ]
CODE:
[root@main nginx]# kill -USR2 `cat /usr/local/webserver/nginx/nginx.pid`

将发送USR2信号给nginx主进程. 其行为是将nginx.pid改成nginx.pid.oldbin, 然后启动新版本的nginx

[Copy to clipboard] [ - ]
CODE:
[root@main nginx]# ls /usr/local/webserver/nginx/
client_body_temp  fastcgi_temp  logs       nginx.pid.oldbin  sbin
conf              html          nginx.pid  proxy_temp

[root@main nginx]# ps aux | grep nginx
root     18749  0.0  0.2   5168  1152 ?        Ss   10:44   0:00 nginx: master process  /usr/local/webserver/nginx/sbin/nginx
www      18829  0.0  2.0  14516 10652 ?        S    10:46   0:00 nginx: worker process                 
www      18830  0.0  1.9  14580 10276 ?        S    10:46   0:00 nginx: worker process                 
www      18831  0.0  1.9  14580 10276 ?        S    10:46   0:00 nginx: worker process                 
www      18832  0.0  2.1  14908 10956 ?        S    10:46   0:00 nginx: worker process                 
www      18833  0.0  1.9  14580 10276 ?        S    10:46   0:00 nginx: worker process                 
www      18834  0.0  1.9  14580 10276 ?        S    10:46   0:00 nginx: worker process                 
www      18835  0.0  1.9  14580 10276 ?        S    10:46   0:00 nginx: worker process                 
www      18836  0.0  1.9  14580 10276 ?        S    10:46   0:00 nginx: worker process                 
root     23949  0.0  0.3   5100  1800 ?        S    11:34   0:00 nginx: master process  /usr/local/webserver/nginx/sbin/nginx
www      23950  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23951  0.1  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23952  0.1  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23953  0.1  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23954  0.1  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23955  0.1  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23958  0.1  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23959  0.1  1.9  14512 10196 ?        S    11:34   0:00 nginx: worker process

这时新版本与旧版本的nginx同时运行

三,关闭旧版本nignx的工作进程

[Copy to clipboard] [ - ]
CODE:
[root@main nginx]# kill -WINCH 18749

将发送WINCH信号给旧版本的nginx的主进程, 其行为是优雅地关闭旧版本nginx的工作进程
一段时间后:

[Copy to clipboard] [ - ]
CODE:
[root@main nginx]# ps aux | grep nginx
root     18749  0.0  0.2   5168  1152 ?        Ss   10:44   0:00 nginx: master process  /usr/local/webserver/nginx/sbin/nginx
root     23949  0.0  0.3   5100  1800 ?        S    11:34   0:00 nginx: master process  /usr/local/webserver/nginx/sbin/nginx
www      23950  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23951  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23952  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23953  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23954  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23955  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23958  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23959  0.0  1.9  14512 10196 ?        S    11:34   0:00 nginx: worker process

此时旧版本nginx的主进程依然存在


四,
A.如果测试成功, 关闭旧版本nginx的主进程

[Copy to clipboard] [ - ]
CODE:
[root@main nginx]# kill -QUIT 18749



[Copy to clipboard] [ - ]
CODE:
[root@main nginx]# ps aux | grep nginx
root     23949  0.0  0.3   5100  1800 ?        S    11:34   0:00 nginx: master process  /usr/local/webserver/nginx/sbin/nginx
www      23950  0.0  2.0  14512 10604 ?        S    11:34   0:00 nginx: worker process                 
www      23951  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23952  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23953  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23954  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23955  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23958  0.0  1.9  14512 10208 ?        S    11:34   0:00 nginx: worker process                 
www      23959  0.0  1.9  14512 10196 ?        S    11:34   0:00 nginx: worker process                 
root     24710  0.0  0.1   3884   668 pts/2    R+   12:00   0:00 grep nginx

随着旧版本nginx主进程的关闭, nginx.pid.oldbin也没有了.

[Copy to clipboard] [ - ]
CODE:
[root@main nginx]# ls
client_body_temp  conf  fastcgi_temp  html  logs  nginx.pid  proxy_temp  sbin

删除旧版本nginx二进制文件

[Copy to clipboard] [ - ]
CODE:
[root@main nginx]# rm sbin/nginx.old

B.如果新版本测试失败, 这时还可以复原, 继续使用旧版本nginx

[Copy to clipboard] [ - ]
CODE:
kill -HUP 18749

让旧nginx不加载配置文件的情况下启动工作进程

[Copy to clipboard] [ - ]
CODE:
kill -QUIT 23949

优雅地关闭新nginx工作进程(但我测试时, 不但新nginx工作进程结束了, 其主进程也结束了, 难道文档太旧了, 还是其它什么原因?)

[Copy to clipboard] [ - ]
CODE:
kill -TERM 23949

关闭新nginx主进程(如果不成功则kill -KILL 23949强制关闭)

随着新nginx主进程关闭, nginx.pid文件被删除, 而nginx.pid.oldbin则重命名成nginx.pid, 一切都恢复到尝试更新nginx之前.

[Copy to clipboard] [ - ]
CODE:
[root@main nginx]# ls
client_body_temp  conf  fastcgi_temp  html  logs  nginx.pid  proxy_temp  sbin

该方法也适用于增加/删除nginx模块

没人顶
都哭了 帮你顶下吧
有必要这么来么?怎么确认没间断呢


QUOTE:
原帖由 LAMP兄弟连 于 2008-10-8 15:25 发表
都哭了 帮你顶下吧



QUOTE:
原帖由 heizi21 于 2008-10-8 15:33 发表
有必要这么来么?怎么确认没间断呢

nginx既然有这个功能, 当然能用上就最好了.试试就知道了
似乎现在NGINX比较流行, 大家都用啊
看来还是眼泪有用
nginx不是有make upgrade的么?需要这么麻烦么?