返回顶部

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进程特有的其他环境变量。

posted @ 2018-09-24 19:51  公梓小白  阅读(1601)  评论(0编辑  收藏  举报