[实战]在不停止服务, 不丢失连接情况下更新NGINX到新版本(0.7.14 -> 0.7.17)
xi2008wang
|
1#
xi2008wang 发表于 2008-10-08 13:32
[实战]在不停止服务, 不丢失连接情况下更新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模块 |