nginx平滑升级

  1. 环境
CentOS 6.x
nginx-1.9.15.tar.gz
nginx-1.10.0.tar.gz
  1. 创建用户、组
# groupadd -r nginx
# useradd -r -g nginx nginx
  1. 编译安装1.9.15
# mkdir -pv /var/tmp/nginx/{client,proxy,fcgi,uwsgi,scgi}
# tar xf /usr/local/src/zlib-1.2.8.tar.gz -C /usr/local/src/
# tar xf nginx-1.9.15.tar.gz
# cd nginx-1.9.15
# ./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid  \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-zlib=/usr/local/src/zlib-1.2.8 \
--with-pcre | tee /tmp/nginx.out
# make && make install
  1. 启动nginx
# /usr/local/nginx/sbin/nginx
  1. nginx控制信号
可以使用信号来控制主进程。默认,nginx将主进程的pid写入/usr/local/nginx/nginx.pid文件中。可以通过给./configure传递参数或在nginx.conf中使用pid指令修改该文件的位置。
主进程可以处理的信号:
	TERM, INT	    快速关闭
	QUIT		    从容关闭
	HUP			重载配置、用新的配置开始新的工作进程、从容关闭旧的工作进程
	USR1		    重新打开日志文件
	USR2		    平滑升级可执行程序。
	WINCH		    从容关闭工作进程
  1. 编译新版本的nginx
备份旧版nginx可执行程序:# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old;此时,服务不会中断
  获取旧版nginx编译参数:# /usr/local/nginx/sbin/nginx -V
  开始编译新版nginx:
  # tar xf nginx-1.10.0.tar.gz 
  # cd nginx-1.10.0
  # ./configure \
  --prefix=/usr/local/nginx \
  --sbin-path=/usr/local/nginx/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/nginx/access.log \
  --pid-path=/var/run/nginx/nginx.pid  \
  --lock-path=/var/lock/nginx.lock \
  --user=nginx \
  --group=nginx \
  --with-http_ssl_module \
  --with-http_stub_status_module \
  --with-http_gzip_static_module \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  --http-scgi-temp-path=/var/tmp/nginx/scgi \
  --with-zlib=/usr/local/src/zlib-1.2.8 \
  --with-pcre | tee /tmp/nginx.out
  # make && make install
  1. 测试新版本nginx是否正常
# /usr/local/nginx/sbin/nginx -t -c /etc/nginx/nginx.conf
	nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
	nginx: configuration file /etc/nginx/nginx.conf test is successful
	# ./nginx -v
	nginx version: nginx/1.10.0
  1. 平滑升级
# kill -USR2 `cat /var/run/nginx/nginx.pid`		主进程将重命名.pid为.oldbin,然后执行新的可执行程序,依次启动新的主进程和工作进程。
	此时,两个nginx进程实例会同时运行,一起处理请求。要逐步停止旧的进程,需要发送WINCH信号给旧进程,而后,它的工作进程将从容关闭。
	# ps aux | grep nginx
	root     13226  0.0  0.0  44784  1228 ?        Ss   02:46   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
	nginx    13228  0.2  0.0  45204  2092 ?        S    02:46   0:07 nginx: worker process                               
	root     18364  0.0  0.0  44780  2760 ?        S    03:36   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
	nginx    18365  0.0  0.0  45208  1656 ?        S    03:36   0:00 nginx: worker process
	可以看出来旧进程的工作进程已关闭:
	# kill -WINCH `cat /var/run/nginx/nginx.pid.oldbin`
	# ps aux | grep nginx
	root     13226  0.0  0.0  44784  1236 ?        Ss   02:46   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
	root     18364  0.0  0.0  44780  2760 ?        S    03:36   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
	nginx    18365  0.1  0.0  45208  2096 ?        S    03:36   0:00 nginx: worker process
	这时,因为旧的服务器还尚未关闭它监听的套接字,所以,通过下面的几步,你仍可以恢复旧的服务器:
		发送 HUP 信号给旧的主进程 - 它将在不重载配置文件的情况下启动它的工作进程
		发送 QUIT 信号给新的主进程,要求其从容关闭其工作进程
		发送 TERM 信号给新的主进程,迫使其退出
		如果因为某些原因新的工作进程不能退出,向其发送 KILL 信号
		新的主进程退出后,旧的主进程会由移除 .oldbin 前缀,恢复为它的 .pid 文件,这样,一切就都恢复到升级之前了。
	如果升级成功,而且希望保留新的nginx时,发送 QUIT 信号给旧的主进程使其退出而只留下新版nginx进程运行:
	# kill -QUIT `cat /var/run/nginx/nginx.pid.oldbin`
	# ps aux | grep nginx
	root     18364  0.0  0.0  44780  2760 ?        S    03:36   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
	nginx    18365  0.1  0.0  45208  2100 ?        S    03:36   0:00 nginx: worker process

通过查看日志,从始至终,nginx都在正常响应请求。

参考 http://www.nginx.cn/nginxchscommandline,并亲手实验验证。

转载于:https://my.oschina.net/forlinux/blog/680682

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值