zoukankan      html  css  js  c++  java
  • 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是一样的。

  • 相关阅读:
    洛谷-P1149 火柴棒等式
    洛谷-P1036 选题
    【linux】CPU,内存对网站的影响
    【jenkins】【java】【tomcat】windows host key verification failed
    【java】A local class access to local variables
    【java】类成员的访问限制关系
    【android】6大布局
    【android】android对位图文件的支持
    【android】签署应用采用相同证书的用处
    【markdown】图片的处理
  • 原文地址:https://www.cnblogs.com/Tao9/p/11953946.html
Copyright © 2011-2022 走看看