Nginx热部署 平滑升级 日志切割
1.重载
修改nginx配置文件之后,在不影响服务的前提下想加载最新的配置,就可以重载配置即可。
操作如下:
1)修改nginx配置文件
2)nginx -t 检查nginx文件语法是否有误
3)nginx -s reload 重载nginx配置
2.热部署(升级nginx版本)
比如我把版本冲nginx1.14-2升级到nginx1.16.1;
我之前nginx安装目录为:/data/geek/nginx目录
操作如下:
注意:千万不要make insatll 否则会把二进制执行文件复制到/data/geek/下的nginx目录 覆盖之前的文件
1)下载最新的nginx1.16.1版本
2)执行./configure –prefix=/home/geek/nginx #新版本的nginx执行这步–prefix目录可以随便指,最后千万不能make install。否则nginx二进制文件会找新的nginx生成的文件。
3) 编译make,make之后会在objs下面生成一个nginx二进制执行文件
4)备份老的nginx二进制配置文件
[root@nginx sbin]# cd /data/geek/nginx/sbin [root@nginx sbin]# cp nginx nginx.old
5)拷贝objs目录下新的nginx二进制执行文件到/home/geek/nginx/sbin/目录
[root@nginx objs]# pwd
/data/geek/nginx-1.16.1/objs
[root@nginx objs]# ls
autoconf.err nginx ngx_auto_config.h ngx_modules.c src
Makefile nginx.8 ngx_auto_headers.h ngx_modules.o
[root@nginx objs]# cp nginx /data/geek/nginx/sbin/ -f
cp: overwrite ‘/data/geek/nginx/sbin/nginx’? y
[root@nginx objs]#
6)检查当前Nginx版本是否为新版本
[root@nginx sbin]# pwd /data/geek/nginx/sbin [root@nginx sbin]# ls nginx nginx.old [root@nginx sbin]# ./nginx -V nginx version: nginx/1.16.1 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) configure arguments: --prefix=/data/geek/nginx [root@nginx sbin]#
注意:虽然当前版本已经变成了1.16.1版本,这个时候表面上看起来是更新成了新版本,但还是旧版本的在工作,接收客户端请求的仍然是1.14.2版本的nginx,这就有了下面的平滑升级
3.平滑升级
继续上面的操作来:
1)kill -USR2 旧版本的主进程号 (让旧版本的worker进程不再接受请求)
这步操作完之后,新版本的nginx进程就起来了,ps -ef |grep nginx 就可以看到二个nginx的master进程,旧的nginx master进程已经不在监听80端口了。新的请求由新的nginx进程处理
2)kill -WINCH 旧版本的主进程号 (关闭旧版本的worker进程)
3)这个时候就已经平滑升级完毕了
命令 | 作用 |
---|---|
kill -USER2 进程号 | 不再让worker进程接受请求,当前请求处理完就让worker进程退出 |
kill -WINCH 进程号 | 处理完关闭 |
kill -HUP 进程号 | 启动进程 |
4.日志切割
1)备份之前的日志
[root@nginx logs]# ll total 12 -rw-r--r-- 1 root root 1721 Nov 28 20:31 access.log -rw-r--r-- 1 root root 1686 Nov 28 20:31 error.log -rw-r--r-- 1 root root 6 Nov 28 20:32 nginx.pid [root@nginx logs]# ls access.log error.log nginx.pid [root@nginx logs]# mv access.log access.log.bak
这里直接用mv命令备份日志文件就可以,因为linux文件系统中,改名并不会影响已经打开文件的写入操作,内核inode不变,这样就不会出现丢日志了。
2)nginx -s reopen 重新生成log文件
[root@nginx logs]# ../sbin/nginx -s reopen [root@nginx logs]# ll total 12 -rw-r--r-- 1 nobody root 0 Nov 28 20:36 access.log -rw-r--r-- 1 root root 2109 Nov 28 20:35 access.log.bak -rw-r--r-- 1 nobody root 1747 Nov 28 20:36 error.log -rw-r--r-- 1 root root 6 Nov 28 20:32 nginx.pid
4.1一般写一个脚本然后加个定时任务进行切割,如果我下面的脚本放在crontab里一天执行一次
kill -USR1 nginx进程号 也是重新生成日志文件,和nginx -s reopen是一样的。