zoukankan      html  css  js  c++  java
  • web服务之nginx命令,信号还有平滑升级与回滚

    nginx 命令和信号

    nginx命令

    nginx 命令支持向其发送信号,实现不同功能
    nginx 格式

    nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
    

    选项说明

    帮助: -? -h
    使用指定的配置文件: -c
    指定配置指令:-g
    指定运行目录:-p
    测试配置文件是否有语法错误:-t -T
    打印nginx的版本信息、编译信息等:-v -V
    发送信号: -s 示例: nginx -s reload
    

    信号说明:

    立刻停止服务:stop,相当于信号SIGTERM,SIGINT
    优雅的停止服务:quit,相当于信号SIGQUIT
    平滑重启,重新加载配置文件: reload,相当于信号SIGHUP
    重新开始记录日志文件:reopen,相当于信号SIGUSR1,在切割日志时用途较大
    平滑升级可执行程序:发送信号SIGUSR2,在升级版本时使用
    优雅的停止工作进程:发送信号SIGWINCH,在升级版本时使用
    

    范例: 查看nginx帮助

    [root@centos8 ~]# nginx -h
    nginx version: nginx/1.16.1
    Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
    Options:
    -?,-h : this help
    -v : show version and exit
    -V : show version and configure options then exit
    -t : test configuration and exit
    -T : test configuration, dump it and exit
    -q : suppress non-error messages during configuration testing
    -s signal : send signal to a master process: stop, quit, reopen, reload
    -p prefix : set prefix path (default: /usr/share/nginx/)
    -c filename : set configuration file (default: /etc/nginx/nginx.conf)
    -g directives : set global directives out of configuration file
    

    quit 实现worker进程优雅关闭

    关闭监听句柄
    关闭空闲连接
    在循环中等待全部连接关闭
    退出nginx所有进程
    

    reload 流程

    利用 reload 可以实现平滑修改配置并生效
    向master进程发送HUP信号(reload命令)
    master进程校验配置语法是否正确
    master进程打开新的监听端口
    master进程用新配置启动新的worker子进程
    master进程向老worker子进程发送QUIT信号,老的worker对已建立连接继续处理,处理完才会优
    雅退出.未关闭的worker旧进程不会处理新来的请求
    老worker进程关闭监听句柄,处理完当前连接后结束进程
    

    平滑升级和回滚

    有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时
    Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级

    平滑升级流程

    将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
    向master进程发送USR2信号
    master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
    master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx
    主进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master
    进程的PID存放至新生成的pid文件nginx.pid
    向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
    向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
    如果发现升级有问题,可以回滚∶向老master发送HUP,向新master
    方送QUIT
    

    平滑升级和回滚案例

    #改pid存放路径
    [root@sz-kx-centos8 ~/nginx-1.20.1]# vim /apps/nginx/conf/nginx.conf
    pid        /apps/nginx/run/nginx.pid;
    
    #创建并授权
    [root@sz-kx-centos8 ~/nginx-1.20.1]# mkdir -p /apps/nginx/run
    [root@sz-kx-centos8 ~/nginx-1.20.1]# chown -R nginx.nginx /apps/nginx/run
    
    重启服务
    [root@sz-kx-centos8 ~/nginx-1.20.1]# systemctl restart nginx
    
    [root@sz-kx-centos8 ~]# wget http://nginx.org/download/nginx-1.20.1.tar.gz
    
    [root@sz-kx-centos8 ~]# tar xf nginx-1.20.1.tar.gz 
    [root@sz-kx-centos8 ~]# cd nginx-1.20.1/
    [root@sz-kx-centos8 ~/nginx-1.20.1]# nginx -V
    nginx version: nginx/1.18.0
    built by gcc 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC) 
    built with OpenSSL 1.1.1g FIPS  21 Apr 2020
    TLS SNI support enabled
    configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
    
    [root@sz-kx-centos8 ~/nginx-1.20.1]# ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
    
    #只要make无需要make install
    [root@sz-kx-centos8 ~/nginx-1.20.1]# make
    
    [root@sz-kx-centos8 ~/nginx-1.20.1]# objs/nginx -v
    nginx version: nginx/1.20.1
    
    #查看两个版本
    [root@sz-kx-centos8 ~/nginx-1.20.1]# ll objs/nginx /apps/nginx/sbin/nginx 
    -rwxr-xr-x 1 root root 7595024 Jun  9 22:10 /apps/nginx/sbin/nginx
    -rwxr-xr-x 1 root root 7727184 Jun 10 14:58 objs/nginx
    
    #把之前的旧版的nginx命令备份
    [root@sz-kx-centos8 ~/nginx-1.20.1]# mv /apps/nginx/sbin/nginx{,.bak}
    
    #把新版本的nginx命令复制过去
    [root@sz-kx-centos8 ~/nginx-1.20.1]# cp objs/nginx /apps/nginx/sbin/
    
    #检测一下有没有问题
    [root@sz-kx-centos8 ~/nginx-1.20.1]# /apps/nginx/sbin/nginx -t
    nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
    
    #USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的
    nginx
    #此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
    #此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进
    程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
    
    [root@sz-kx-centos8 ~]# cat /apps/nginx/run/nginx.pid 
    9240
    [root@sz-kx-centos8 ~]# ps auxf | grep nginx
    root       9309  0.0  0.0  12108  1064 pts/0    S+   15:30   0:00              \_ grep --color=auto nginx
    root       9240  0.0  0.2  41192  3836 ?        Ss   15:28   0:00 nginx: master process /apps/nginx/sbin/nginx
    nginx      9278  0.0  0.2  74272  4488 ?        S    15:29   0:00  \_ nginx: worker process
    
    [root@sz-kx-centos8 ~]# kill -USR2 `cat /apps/nginx/run/nginx.pid`
    
    [root@sz-kx-centos8 ~]# ps auxf | grep nginx
    root       9333  0.0  0.0  12108  1080 pts/0    S+   15:31   0:00              \_ grep --color=auto nginx
    root       9240  0.0  0.2  41192  3836 ?        Ss   15:28   0:00 nginx: master process /apps/nginx/sbin/nginx
    nginx      9278  0.0  0.2  74272  4488 ?        S    15:29   0:00  \_ nginx: worker process
    root       9330  0.0  0.3  41060  5924 ?        S    15:31   0:00  \_ nginx: master process /apps/nginx/sbin/nginx
    nginx      9331  0.0  0.2  74144  4436 ?        S    15:31   0:00      \_ nginx: worker process
    
    #先关闭旧nginx的worker进程,而不关闭nginx主进程方便回滚
    #向原Nginx主进程发送WINCH信号,它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理
    
    [root@sz-kx-centos8 ~]# ll /apps/nginx/run/nginx.pid
    -rw-r--r-- 1 root root 5 Jun 10 15:31 /apps/nginx/run/nginx.pid
    [root@sz-kx-centos8 ~]# kill -WINCH `cat /apps/nginx/run/nginx.pid.oldbin`
    
    #如果旧版worker进程有用户的请求,会一直等待处理完后才会关闭
    [root@sz-kx-centos8 ~]# ps auxf | grep nginx
    root      13947  0.0  0.0  12108   980 pts/0    S+   16:10   0:00              \_ grep --color=auto nginx
    root       9240  0.0  0.2  41192  3836 ?        Ss   15:28   0:00 nginx: master process /apps/nginx/sbin/nginx
    root       9330  0.0  0.3  41060  5924 ?        S    15:31   0:00  \_ nginx: master process /apps/nginx/sbin/nginx
    nginx      9331  0.0  0.2  74144  4436 ?        S    15:31   0:00      \_ nginx: worker process
    
    #经过一段时间测试,新版本服务没问题,最后退出老的master(慎重操作)
    [root@sz-kx-centos8 ~]# kill -QUIT `cat /apps/nginx/run/nginx.pid.oldbin`
    [root@sz-kx-centos8 ~]# ps auxf | grep nginx
    root      13972  0.0  0.0  12108   976 pts/0    S+   16:11   0:00              \_ grep --color=auto nginx
    root       9330  0.0  0.3  41060  5924 ?        S    15:31   0:00 nginx: master process /apps/nginx/sbin/nginx
    nginx      9331  0.0  0.2  74144  4436 ?        S    15:31   0:00  \_ nginx: worker process
    
    #查看版本是不是已经是新版了
    [root@sz-kx-centos8 ~]# nginx -v
    nginx version: nginx/1.20.1
    
    ##回滚(如果上面的已经操作 QUIT就没有办法回滚了)
    #如果升级的版本发现问题需要回滚,可以重新拉起旧版本的worker
    [root@centos8 nginx-1.20.1]# kill -HUP `cat /apps/nginx/run/nginx.pid.oldbin`
    
    #最后关闭新版的master
    [root@centos8 nginx-1.20.1]# kill -QUIT `cat /apps/nginx/run/nginx.pid`
    
  • 相关阅读:
    [转]CentOS安装crontab及使用方法胡益兵
    Cython: CExtensions for Python
    freetds在UBUNTU下的安装
    用python写hiveclient 改善 ITeye技术网站
    Linux下连接MS Sql server 使用ODBC/FreeTDS组合(详细)_徒步旅行者的空间_百度空间
    现代软件构建系统的使用 CMake简介
    The Ex CS Grad Student: Running HQL from Python without using the Hive Standalone Server
    muduo 与 boost asio 吞吐量对比
    cmake与autoconf+automake的对比
    通过枚举返回指定字符结果[有时,好的程序就是一种规范,一种对事物的理解和认识,一种层次]
  • 原文地址:https://www.cnblogs.com/xuanlv-0413/p/14905023.html
Copyright © 2011-2022 走看看