• flask的uwsgi与supervisor配置


    一、uwsgi配置

    监控uwsgi运行状态

    uwsgitop 127.0.0.1:5000

    uwsgitop输出信息

    WID -> worker id
    
    % -> percentage of served requests by the worker
    
    PID -> process id of the worker
    
    REQ -> number of managed requests
    
    RPS -> number of current requests handled per second
    
    EXC -> number of raised exceptions
    
    SIG -> number of managed uwsgi signals (NOT unix signals !!!)
    
    STATUS -> can be idle, busy, pause, cheaped or sig
    
    AVG -> average response time for the worker
    
    RSS -> RSS memory (need --memory-report)
    
    VSZ -> address space (need --memory-report)
    
    TX -> transmitted data
    
    RunT -> running time
    

    uwsgitop 后面的地址为下方的stat

    [uwsgi]
    # 允许主进程存在
    master=true
    
    # 
    chdir=/root/project
    virtualenv=/root/project/venv 
    
    # “mount”参数表示将”/”地址路由到”run.py”中,”manage-script-name”参数表示启用之前在Nginx里配置的”SCRIPT_NAME”参数。再次重启Nginx和uWSGI,你就可以通过”http://localhost/app”来访问应用了
    mount=/=run.py
    # mount和wsgi-file用其中一个就行了,最好用wsgi-file
    wsgi-file=run.py
    manage-script-name=true
    
    # 监控参数或py文件的修改,当有修改时会触发重载,生产环境不允许设为1 (只在开发时使用)
    py-autoreload=0
    
    # uWSGI试图在一切可能的情况下(滥)用 fork() 调用的写时拷贝语义。默认情况下,它会在加载你的应用之后进行fork,以尽可能的共享它们的内存。如果出于某些原因,不期望这个行为,那么使用 lazy-apps 选项。这将会指示uWSGI在每个worker的 fork() 之后加载应用
    lazy-apps=true
    
    # 设置在收到请求时,uWSGI加载的模块中哪个变量将被调用,默认是名字为“app”的变量
    callable=app
    
    # 指定uwsgi的客户端将要连接的socket的路径(使用UNIX socket的情况)或者地址(使用网络地址的情况)
    socket=127.0.0.1:5003
    
    # 使用HTTP协议绑定到指定UNIX/TCP socket上
    # http-socket=127.0.0.1:5003
    
    # 设置socket的监听队列大小
    listen = 65535
    
    # uwsgi进程数
    processes=16
    
    # 记录uwsgi的master进程的pid
    pidfile = /data/project_logs/project_uwsgi.pid
    
    # 设置请求的最大大小 (排除request-body),这一般映射到请求头的大小。默认情况下,它是4k
    buffer-size=32768
    
    # 将日志打到指定的日志文件,如果使用“daemonize =”的话会导致supervisor守护进程失败,因为设置daemonize在将日志记录到文件的同时,也会让uWSGI进程进入后台守护uWSGI,而supervisor本身就已经起到了守护进程的作用
    logto = /data/project_logs/uwsgi.log
    
    # 以固定的文件大小(单位KB),切割日志文件
    log-maxsize = 1000000
    
    # 当启动时切分日志
    log-truncate = true
    
    # 不记录请求信息request的日志。只记录错误以及uWSGI内部消息到日志中
    disable-logging = true
    
    # 将uWSGI状态作为一个JSON对象导出到一个socket,使用uwsgi --connect-and-read /data/project_logs/uwsgi_stats.sock可以获取这个json对象
    stats = /data/project_logs/uwsgi_stats.sock
    或者
    stats=127.0.0.1:5000
    
    # 启用gevent循环引擎,使用指定数目的异步核心数和优化参数
    gevent=1000
    
    # 启动时自动调用gevent.monkey.patch_all()
    gevent-monkey-patch=true
    
    # 允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程
    enable-threads = true
    
    # uwsgi的单个进程worker占用物理内存达到1024M,会自动重启这个worker(防止内存泄露导致worker所占内存越来越多)
    reload-on-rss = 1024
    
    # uwsgi的单个worker占用虚拟内存达到2048M,会自动重启这个worker(防止内存泄露导致worker所占内存越来越多)
    reload-on-as = 2048
    
    
    

    二、supervisor配置

    [program:project]
    directory=/root/project
    environment=LB_ADX_CONFIG=production
    command=/root/project/venv/bin/uwsgi --ini project_uwsgi.ini
    stopasgroup=true       
    stopsignal=QUIT 
    autostart = true
    startsecs = 5
    autorestart = true
    redirect_stderr = true
    

    配置详解:
    stopasgroup=true
    这个东西主要用于,supervisord管理的子进程,这个子进程本身还有子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变成孤儿进程。所以我们可以设置这个选项,把整个该子进程的整个进程组都干掉。 设置为true的话,一般killasgroup也会被设置为true。需要注意的是,该选项发送的是stop信号。
    如果不加这个的话,可能会有老的uwsgi进程的子进程杀不死的情况发生,从而占用端口,导致新的uwsgi进程启动不起来

    stopsignal=QUIT
    干掉进程的信号,默认为TERM,比如设置为QUIT,那么如果QUIT来干这个进程那么会被认为是正常维护,退出码也被认为是expected中的。

    之所以要设置environment参数的原因是,我在项目中要读取LB_ADX_CONFIG这个环境变量,supervisord在linux中启动默认继承了linux的环境变量,在这里可以设置supervisord进程特有的其他环境变量。

  • 相关阅读:
    ASP.Net如何用Cookies保存对象
    MS SQL语句优化
    服务消费者
    [模板]线性筛素数(欧拉筛法)
    luogu4159 迷路 (矩阵加速)
    poj1845 sumdiv (因数的和)
    luogu3674 小清新人渣的本愿 (bitset+莫队)
    luogu3621 城池攻占 (倍增)
    luogu3233 世界树 (虚树)
    bzoj4540 序列 (单调栈+莫队+rmq)
  • 原文地址:https://www.cnblogs.com/lanlingshao/p/9696391.html
Copyright © 2020-2023  润新知