博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于nginx信号控制的“故障”案例
阅读量:6615 次
发布时间:2019-06-24

本文共 3636 字,大约阅读时间需要 12 分钟。

  关于nginx信号控制的“故障”案例

   最近几天发现nginx的日志老切割不成功,遂来查找问题。

    最开始以为是logrotate的脚本问题,遂手动切割,运行以下的命令

 
  1. logrotate -vf /etc/logrotate.d/nginx  

    发现运行这个是没有问题的,终于,在service nginx restart后,发现了问题

    问题是在用service nginx restart后,nginx.pid文件才会自动消失,于是,仔细检查脚本,发现一些端倪啊,一个字眼出现了

 
  1. killproc $prog -QUIT 

-QUIT从容关闭,也就是说这个进程是慢慢关闭的,不是立即关闭的,于是验证。如图

查看进程如下

可以看到,nginx正在shutdown之中,但没有一下子全部关闭了。

随着时间的推移,nginx老的进程在继续关闭中……

到最后,nginx之前的老进程全部关闭……

这时,nginx.pid文件没有了

到此,nginx.pid文件神奇消失的问题终于被找出来了。

  继续分析-----日志分割,依靠的是nginx.pid获取nginx的进程号,分割成功后,出现的情况是nginx依然昨天的日志,不写分割后的日志。

   那么现在需要对这个脚本进行修改,把stop函数中的-QUIT改为-TERM 立即关闭。(话说我这个脚本是来自官网改造的,看来官网也不是100%的准确哦,做运维要细心啊

   官方脚本地址

  再次运用此脚本重启

 
  1. service nginx restart 

  问题不再重现,已经解决了。

总结,一个小小的参数,可能会引发无限大的问题,所以,学知识要细心啊!

=============================================================

附录一:nginx的信号控制

 
  1. TERM,INT 快速关闭; 
  2. QUIT  从容关闭 
  3. HUP  平滑重启,重新加载配置文件; 
  4. USER1  重新打开日志文件,在切割日志的时候用途较大; 
  5. USER2  平滑升级可执行程序; 
  6. WINCH  从容关闭工作进程; 

附录二:nginx的启动脚本如下

 
  1. #!/bin/sh 
  2. # nginx - this script starts and stops the nginx daemon 
  3. # chkconfig:   - 85 15  
  4. # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \ 
  5. #               proxy and IMAP/POP3 proxy server 
  6. # processname: nginx 
  7. # config:      /etc/nginx/nginx.conf 
  8. # config:      /etc/sysconfig/nginx 
  9. # pidfile:     /var/run/nginx.pid 
  10.   
  11. # Source function library. 
  12. #. /etc/rc.d/init.d/functions 
  13.   
  14. # Source networking configuration. 
  15. #. /etc/sysconfig/network 
  16.   
  17. # Check that networking is up. 
  18. green='\e[0;32m'  
  19. red='\e[0;31m' 
  20. NC='\e[0m'  
  21.   
  22. nginx="/usr/sbin/nginx" 
  23. prog=$(basename $nginx) 
  24.   
  25. NGINX_CONF_FILE="/etc/nginx/nginx.conf" 
  26. pidfile="/var/run/nginx.pid" 
  27. lockfile=/var/lock/subsys/nginx 
  28.   
  29. make_dirs() { 
  30.    # make required directories 
  31.    user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` 
  32.    if [ -z "`grep $user /etc/passwd`" ]; then 
  33.        useradd -M -s /bin/nologin $user 
  34.    fi 
  35.    options=`$nginx -V 2>&1 | grep 'configure arguments:'` 
  36.    for opt in $options; do 
  37.        if [ `echo $opt | grep '.*-temp-path'` ]; then 
  38.            value=`echo $opt | cut -d "=" -f 2` 
  39.            if [ ! -d "$value" ]; then 
  40.                # echo "creating" $value 
  41.                mkdir -p $value && chown -R $user $value 
  42.            fi 
  43.        fi 
  44.    done 
  45.   
  46. start() { 
  47.     [ -x $nginx ] || exit 5 
  48.     [ -f $NGINX_CONF_FILE ] || exit 6 
  49.     make_dirs 
  50.     echo -e "Starting $prog ...................................\c" 
  51.     $nginx -c $NGINX_CONF_FILE >/dev/null 2>&1 
  52.     retval=$? 
  53.    echo 
  54.     [ $retval -eq 0 ] && touch $lockfile &&    echo -e "Started  $prog ...................................[ ${green}OK${NC} ]"  
  55.     [ $retval != 0 ]  && echo -e "Started  $prog ................................[ ${red}Falied${NC} ]\r" 
  56.    return $retval 
  57.   
  58. stop() { 
  59.     echo -e "Stopping $prog ...................................\c" 
  60.     PID=`cat $pidfile` 
  61.     killproc $prog -TERM
  62.     retval=$? 
  63.     echo 
  64.     [ $retval -eq 0 ] && rm -f $lockfile && echo -e "Stoped   $prog ...................................[ ${green}OK${NC} ]\r"  
  65.     [ $retval != 0 ]  && echo -e "Stoped  $prog ................................[ ${red}Falied${NC} ]\r" 
  66.     return $retval 
  67. status(){  
  68.     if [ -e $pidfile ]  
  69.        then  
  70.         PID=`cat $pidfile`  
  71.         echo  "Nginx (pid $PID) is running..."  
  72.        else  
  73.         echo  "Nginx is stopped"  
  74.     fi  
  75.   
  76. restart() { 
  77.     configtest || return $? 
  78.     stop 
  79.     sleep 1 
  80.     start 
  81.   
  82. reload() { 
  83.     configtest || return $? 
  84.     echo -n $"Reloading $prog: " 
  85.     killproc $nginx -HUP 
  86.     RETVAL=$? 
  87.     echo 
  88.   
  89. configtest() { 
  90.   $nginx -t -c $NGINX_CONF_FILE >/dev/null  2>&1 
  91.    
  92. case "$1" in 
  93.     start) 
  94.         $1 
  95.         ;; 
  96.     stop) 
  97.         $1 
  98.         ;; 
  99.     status) 
  100.         $1 
  101.         ;; 
  102.     restart) 
  103.         $1 
  104.         ;; 
  105.     reload) 
  106.         $1 
  107.         ;; 
  108.     configtest) 
  109.         $1 
  110.         ;; 
  111.     *) 
  112.         echo $"Usage: $0 {start|stop|status|restart|reload|configtest}" 
  113.         exit 2 
  114. esac 

附录三:日志切割脚本如下

 
  1. # cat /etc/logrotate.d/nginx  
  2. /var/log/nginx/*.log { 
  3. daily 
  4. rotate 7 
  5. missingok 
  6. create 600 www www 
  7. notifempty 
  8. sharedscripts 
  9. postrotate 
  10. if [ -f /var/run/nginx.pid ]; then 
  11. kill -USR1 $(cat /var/run/nginx.pid) 
  12. fi 
  13. endscript 

 

本文转自it你好 51CTO博客,原文链接:http://blog.51cto.com/itnihao/957631,如需转载请自行联系原作者

你可能感兴趣的文章
实战 SSH 端口转发(转)
查看>>
在 Rolling Update 中使用 Health Check - 每天5分钟玩转 Docker
查看>>
vim技巧
查看>>
我的友情链接
查看>>
c# 获取程序路径
查看>>
【Android】如何实现 Android 项目的 Gradle 插件
查看>>
【Android随记】-- 全局获取context
查看>>
rpm 查询服务包的信息
查看>>
数据库删掉重复数据
查看>>
8月第一周B2B类网站排名:阿里巴巴持续领先
查看>>
IDC评述网:12月下旬国内域名注册商净增量Top10
查看>>
5月第一周全球域名解析商Top15:万网升至第7名
查看>>
架构优化 - 应用,MQ Broker,业务处理分层
查看>>
我的软件过程,一年再读
查看>>
3月第3周网络安全报告:被篡改.COM网站占74.3%
查看>>
Windows系统封装限制
查看>>
jpush设置标签别名
查看>>
【实操手册】一篇文章教你快速开始使用视频点播
查看>>
NFS网络文件共享服务
查看>>
samba配置
查看>>