1、Nginx版本,在实际的业务场景中,需要使用软件新版本的功能、特性。就需要对原有软件进行升级或重装系统。
Nginx的版本需要升级迭代。那么如何进行升级呢?线上服务器如何升级,我们选择稳定版本。
从nginx的1.14版本升级到nginx的1.16版本。
平滑升级。
信号参数:
信号参数:
kill命令传输信号给进程nginx的主进程。
TERM, INT(快速退出,强制退出,当前的请求不执行完成就退出) -s stop
QUIT (优雅退出,执行完当前的请求后退出) -s quit
HUP (重新加载配置文件,用新的配置文件启动新worker进程,并优雅的关闭旧的worker进程) -s reload
USR1 (重新打开日志文件) -s reopen
USR2 (平滑的升级nginx二进制文件 拉起一个新的主进程 旧主进程不停止)
WINCH (优雅的关闭worker进程)
我们平滑升级USR2,这个信号要注意下。
以上几个信号命令都是发给nginx的master主进程。
语法:
[root@server01 ~]# ps aux |grep nginx
root 937 0.0 0.1 46156 2100 ? Ss 09:41 0:00 nginx: master process /usr/local/nginx/sbin/nginx
www 26449 0.0 0.0 46392 1956 ? S 17:32 0:00 nginx: worker process
root 26474 0.0 0.0 112816 972 pts/0 S+ 18:11 0:00 grep --color=auto nginx
[root@server01 ~]# kill -TERM 937
[root@server01 ~]# ps aux |grep nginx
root 26480 0.0 0.0 112812 972 pts/0 S+ 18:11 0:00 grep --color=auto nginx
不是所有的软件都支持kill信号方面的内容。要看软件是怎么写出来的。
nginx是支持这几个的。
WINCH:
[root@server01 ~]# ps aux |grep nginx
root 26534 0.0 0.0 46016 1348 ? Ss 18:13 0:00 nginx: master process /usr/local/nginx/sbin/nginx
www 26539 0.0 0.0 46392 1920 ? S 18:17 0:00 nginx: worker process
root 26541 0.0 0.0 112812 968 pts/0 S+ 18:17 0:00 grep --color=auto nginx
[root@server01 ~]# kill -WINCH 26534
[root@server01 ~]#
[root@server01 ~]# ps aux |grep nginx
root 26534 0.0 0.0 46016 1348 ? Ss 18:13 0:00 nginx: master process /usr/local/nginx/sbin/nginx
root 26543 0.0 0.0 112812 972 pts/0 S+ 18:18 0:00 grep --color=auto nginx
[root@server01 ~]#
我们可以看到worker进程被关闭了。那么这个时候访问页面访问不了。说明worker不工作,nginx就不工作。这个是比较特殊的场景。
[root@server01 ~]# kill -HUP 26534
[root@server01 ~]#
[root@server01 ~]# ps aux |grep nginx
root 26534 0.0 0.1 46152 2064 ? Ss 18:13 0:00 nginx: master process /usr/local/nginx/sbin/nginx
www 26544 0.0 0.0 46528 1972 ? S 18:21 0:00 nginx: worker process
root 26546 0.0 0.0 112812 972 pts/0 S+ 18:21 0:00 grep --color=auto nginx
我们通过kill -HUP PID命令来重新加载配置文件,启动新的worker进程,优雅地关闭旧的worker进程。
[root@server01 ~]# ps aux |grep mysqld
root 918 0.0 0.0 115544 1696 ? S 09:41 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/server01.pid
mysql 1073 0.0 22.4 968628 454524 ? Sl 09:41 0:05 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/server01.err --pid-file=/usr/local/mysql/data/server01.pid
root 26561 0.0 0.0 112816 972 pts/0 S+ 18:25 0:00 grep --color=auto mysqld
[root@server01 ~]# kill -QUIT 918
[root@server01 ~]# ps aux |grep mysqld
root 918 0.0 0.0 115544 1696 ? S 09:41 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/server01.pid
mysql 1073 0.0 22.4 968628 454524 ? Sl 09:41 0:05 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/server01.err --pid-file=/usr/local/mysql/data/server01.pid
root 26563 0.0 0.0 112816 972 pts/0 S+ 18:26 0:00 grep --color=auto mysqld
[root@server01 ~]#
我们可以看到-QUIT这个信号,mysqld就不支持。但是php-fpm又支持。
在脚本中,stop对应的kill -QUIT,优雅退出。
重新安装:
1)停止掉服务,删除编译的安装的软件包和源码包;
2)重新解压编译安装即可;
注意:如果需要,请备份配置文件和网站目录里的资源文件。
一些重要的东西,网站文件和配置文件要进行备份。
平滑升级:
升级软件版本之后,需要启动新的版本,启动不了,端口已被占用。
如果直接把旧版本的服务停止掉,会影响线上业务的使用。
最佳解决办法:
①旧的不先停掉
②新的又可以起来
③旧的和新的同时提供服务,旧的请求完成之后,就停掉旧进程
-USR2 平滑启动一个进程(平滑升级)
-WINCH 优雅的关闭子进程
-QUIT 优雅关闭主进程
shell > tar xvf nginx-1.16.0.tar.gz
shell > cd nginx-1.16.0
shell > ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module
shell > make && make install
升级新版本,需要把软件的安装路径,指定到旧版本上。
以上操作完成之后,会把原来的旧版本备份为nginx.old
新旧版本同时运行:
kill -USR2 主进程号
停止掉旧进程
查看旧的主进程号,并使用kill -WINCH 优雅的关闭的子进程,再关闭旧的主进程
shell > kill -WINCH 旧的主进程号
shell > kill -QUIT 旧的主进程号
[root@server01 nginx-1.24.0]# cat Makefile
default: build
clean:
rm -rf Makefile objs
.PHONY: default clean
build:
$(MAKE) -f objs/Makefile
install:
$(MAKE) -f objs/Makefile install
modules:
$(MAKE) -f objs/Makefile modules
upgrade:
/usr/local/nginx/sbin/nginx -t
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
说明:
1)先对配置文件进行测试;
2)然后平滑启动一个新nginx进程。
3)判断下旧进程是否存在;
4)然后再将旧nginx进程进行优雅退出。
在nginx中,默认提供了平滑升级的操作。
#注意先configure 在nginx源码包执行
shell > make install && make upgrade
注意:要make install && make upgrade。