原理:
1.下载两个不同版本的安装包
[root@server1 ~]# ls
nginx-1.15.9.tar.gz nginx-1.16.0.tar.gz
配置一个1.16.0版本的nginx
2.解压1.16.0版本,作为旧的版本
[root@server1 ~]# tar zxf nginx-1.16.0.tar.gz
[root@server1 ~]# ls
nginx-1.15.9.tar.gz nginx-1.16.0 nginx-1.16.0.tar.gz
解压出来的源码安装包下的文件的解释
.
(1)关闭debug日志
[root@server1 nginx-1.16.0]# vim auto/cc/gcc ##关闭日志
[root@server1 nginx-1.16.0]# yum install -y pcre-devel zlib-devel gcc
(3)编译
[root@server1 nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --with-file-aio
(4)编译之后出现了objs目录
(5)安装
[root@server1 nginx-1.16.0]# make
make后objs/下出现了二进制执行文件
[root@server1 nginx-1.16.0]# ls
[root@server1 nginx-1.16.0]# cd objs/
[root@server1 objs]# ls
[root@server1 nginx-1.16.0]# make install
make install 实际上就是将二进制执行文件和一些配置文件复制到/usr/local/nginx目录下
4.配置nginx服务
(1)查看配置文件,第一行是nobody
不写的话nginx进程默认用户是nobody 可以开启服务用ps aux查看
(2)进行语法检测
[root@server1 conf]# ../sbin/nginx -t
[root@server1 conf]# ../sbin/nginx -V
[root@server1 conf]# ../sbin/nginx
(5)查看进程所有人是nobody
[root@server1 conf]# ps aux | grep nginx
(6)创建nginx用户
[root@server1 conf]# useradd nginx
[root@server1 conf]# id nginx
uid=1000(nginx) gid=1000(nginx) groups=1000(nginx)
[root@server1 conf]# ../sbin/nginx -s stop
(8)编辑配置文件
[root@server1 conf]# vim nginx.conf ##改变用户
user nginx nginx;
worker_processes 2;
(9)先在系统安全的配置文件中设定nginx用户允许的最大文件数
[root@server1 conf]# vim /etc/security/limits.conf
(10)再次编辑nginx配置文件,在配置文件设置最大并发数
[root@server1 conf]# vim nginx.conf ##改变最大并发数
12 events {
13 worker_connections 65535;
14 }
[root@server1 conf]# ../sbin/nginx
[root@server1 conf]#
[root@server1 conf]# ps aux
(12)打开浏览器测试,访问成功
访问到nginx的默认页面
1.解压另一个版本的nginx
[root@server1 ~]# cd nginx-1.15.9
[root@server1 nginx-1.15.9]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
2.编译安装,同样关闭debug日志,不取消版本号方便观察
注意:千万不要make insatll 否则会把二进制执行文件复制到/usr/local下的nginx目录 覆盖之前的文件
(1)编译
[root@server1 nginx-1.15.9]# ./configure --prefix=/usr/local/nginx --with-file-aio
(3)安装
[root@server1 nginx-1.15.9]# make
[root@server1 nginx-1.15.9]# cd objs/
[root@server1 objs]# ls
(4)备份旧版本的nginx二进制执行文件
[root@server1 objs]# cd /usr/local/nginx/sbin/
[root@server1 sbin]# ls
nginx
[root@server1 sbin]# cp nginx nginx.old
[root@server1 sbin]# ls
nginx nginx.old
(5)替换二进制文件(将新版本的二进制执行文件覆盖过去,要加 -f 否则报错正忙)
[root@server1 objs]# cp -f nginx /usr/local/nginx/sbin/nginx
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y
(6)查看nginx进程,一个master,两个worker
[root@server1 objs]# ps -ef | grep nginx
(7)查看当前版本
[root@server1 objs]# cd -
/usr/local/nginx/sbin
[root@server1 sbin]# ./nginx -V
注意:虽然当前版本已经变成了1.15.9版本,这个时候表面上看起来是更新成了新版本,但还是旧版本的在工作,接收客户端请求的仍然是1.16.0版本的nginx,这就有了下面的平滑升级
1.kill -USR2 旧版本的主进程号 (让旧版本的worker进程不再接受请求)
[root@server1 objs]# kill -USR2 4810
[root@server1 objs]# ps -ef | grep nginx
2.kill -WINCH 旧版本的主进程号 (关闭旧版本的worker进程)
[root@server1 objs]# kill -WINCH 4810
[root@server1 objs]# ps -ef | grep nginx
可以看到现在有2个master,2个worker
旧版本的worker被关闭
3.查看版本号现在用的是新版本
命令 | 作用 |
---|---|
kill -USER2 进程号 | 不再让worker进程接受请求,当前请求处理完就让worker进程退出 |
kill -WINCH 进程号 | 处理完关闭 |
kill -HUP 进程号 | 启动进程 |
1.先将二进制执行文件还原,不加-f会提示文件正忙
[root@server1 objs]# cd /usr/local/nginx/sbin/
[root@server1 sbin]# ls
nginx nginx.old
[root@server1 sbin]# cp nginx.old nginx
cp: overwrite ‘nginx’? y
cp: cannot create regular file ‘nginx’: Text file busy
[root@server1 sbin]#
[root@server1 sbin]# cp -f nginx.old nginx
cp: overwrite ‘nginx’? y
2.现在依旧是2个master 2个worker
3.kill -HUP 旧版本的进程号 (拉起旧版本的worker进程)
[root@server1 sbin]# kill -HUP 4810
[root@server1 sbin]# ps -ef | grep nginx
2个master 4个worker
5.kill -WINCH 新版本的主进程号 (关闭新版本的worker进程)
[root@server1 sbin]# kill -WINCH 16940
[root@server1 sbin]# ps -ef | grep nginx
6.查看版本号,是旧版本的nginx
[root@server1 sbin]# /usr/local/nginx/sbin/nginx -V