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