zoukankan      html  css  js  c++  java
  • 基于CentOS7+supervisor+logrotate部署nginx+uwsgi

    在尝试了 docker 和 supervisor 之后,感觉我目前的使用场景下 supervisor 更加便捷,之前的 nginx 和 uwsgi 都是通过 daemon 的方式挂在后台,然后加一个挂在 crond 上的脚本来当看门狗,觉得这样还是不太规范,于是将这两个服务都搬到 supervisor 上了,不过和其他大部分的任务不同,这两个都自带了 daemon ,所以需要一些修改,在此记录

    一般情况下,supervisor 用如下九行都足够了,其中第 4 和第 9 行不是必须的,在前文 基于Centos7+Flask+Nginx+uWSGI+Python3的服务器网页搭建教程 中,直接开启uwsgi的代码中有 -d /root/uwsgi.log 一个参数,其中 -d 表示 daemon ,在用 supervisor 时不能添加此参数,去除后 log 在 stdout_logfile 中输出,路径可以自行修改

     /etc/supervisord.d/uwsgi.ini

     1 [program:uwsgi_supervisor]
     2 stdout_logfile=/root/flask/log/uwsgi_supervisor.out.log
     3 stderr_logfile=/root/flask/log/uwsgi_supervisor.out.err
     4 directory=/usr/local/bin
     5 command=/usr/local/bin/uwsgi --ini /root/uwsgi.ini
     6 user=root
     7 autostart=true
     8 autorestart=true
     9 redirect_stderr=true

     同理,nginx也需要关闭daemon,方法为添加参数  -g 'daemon off;'  

    /etc/supervisord.d/nginx.ini

    1 [program:nginx_supervisor]
    2 stdout_logfile=/root/flask/log/nginx_supervisor.out.log
    3 stderr_logfile=/root/flask/log/nginx_supervisor.out.err
    4 directory=/usr/local/nginx/sbin
    5 command=/usr/local/nginx/sbin/nginx -g 'daemon off;' -c /usr/local/nginx/conf/nginx.conf
    6 user=root
    7 autostart=true
    8 autorestart=true
    9 redirect_stderr=true

    文件名可以自行更改,保证路径正确即可,在新增两个文件后,如果已经开启了nginx和uwsgi,需要关闭,否则会提示端口已经占用

    killall -9 uwsgi
    killall -9 nginx

    然后更新supervisor,就可以在web管理器上看到了

    supervisorctl update

    如果出现了fatal error,分析下日志一般都能找到问题所在

     

    而在daemon方式部署uwsgi中,滚动日志是比较麻烦的,因为如果直接修改log文件会导致uwsgi不再写入log,因此需要触发重新写入,而笔者是用python对所有日志进行自动整理,因此做了个小的取巧,即关闭uwsgi,重命名和归档之后重新打开uwsgi,实际上几乎感知不到,但是这终归不是很好的解决办法,而用supervisor托管之后就不存在这个问题了,因为supervisor的日志是可以直接用logrotate滚动的,直接创建任务文件

    /etc/logrotate.d/uwsgi

    /root/flask/log/uwsgi_supervisor.out.log {
        daily
        copytruncate
        rotate 60
        dateext
        missingok
        notifempty
        nocompress
        postrotate
        endscript
    }

    注意文件中的路径需要和上面的路径匹配,这是一个很简单的logrotate模板,解释如下,如需更多命令可以自行查找

    daily 每日触发
    
    copytruncate 复制后清空原文件而不是新建文件,对应的是create命令
    
    rotate 60 保留60份日志,即两个月日志,如果不添加这一行,历史日志就没了
    
    dateext 使用日期作为扩展名
    
    missingok 忽略错误,如文件不存在
    
    notifempty 忽略空文件
    
    nocompress 不需要压缩
    
    postrotate endscript 这两个命令之间可以添加一段脚本,在执行完滚动日志之后执行,比如重启服务或移动日志

    至此,可以用  logrotate -v /etc/logrotate.d/uwsgi  命令尝试手动执行一次,当然,你会发现,有输出,但没有任何反应(

    问题在于,文件路径不在 /var/log 下,selinux阻止了操作,于是方法1,将log改到 /var/log 下,笔者没试过是否可以做到,方法2,增加log文件标识,笔者也没有试过,方法可以自行查找,方法3, -f 啦,没有什么事情是强制执行不能解决的啦,修改文件

    /etc/cron.daily/logrotate

    #!/bin/sh
    
    /usr/sbin/logrotate -f -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
    EXITVALUE=$?
    if [ $EXITVALUE != 0 ]; then
        /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
    fi
    exit 0

    新增强制执行,就不存在任何障碍了,当然,觉得这样不太好的话可以用 crontab -e 新增上述手动执行的带 -f 的命令,定期“手动”执行即可,此外,cron.daily中的命令带了 -s ,意为使用status文件来记录上次的滚动情况

    感谢

    运维工作笔记
    https://www.cnblogs.com/he-ding/p/10270268.html
  • 相关阅读:
    Android应用程序注冊广播接收器(registerReceiver)的过程分析
    智能生活 “视”不可挡——首届TCL杯HTML5智能电视开发大赛等你来挑战
    点滴的积累---J2SE学习小结
    公开课
    iOS学习之 plist文件的读写
    【STL】关联容器 — hash_set
    《Pro Android Graphics》读书笔记之第三节
    第一章. ActionScript 语言基础
    JAVA数组的定义及用法
    MS-SQLSERVER中的MSDTC不可用解决方法
  • 原文地址:https://www.cnblogs.com/Pyrokine/p/13611338.html
Copyright © 2011-2022 走看看