一、环境
推荐uwsgi在虚拟环境里安装,
二、注意事项
uwsgi 配置绑定在socket协议时,在浏览器是打不开的,要通过代理转发接入
所以根据运行协议,部署有2种方式
1、uwsgi 绑定在http协议,此时uwsgi直接当作web服务器;
2、uwsgi 绑定在socket协议,需要使用nginx代理接入;
细说来有三种协议,
http :独立部署;
http-socket :webserver不支持uwsgi时;
socket: webserver支持uwsgi协议;
三、supervisor
主要作用是方便管理uwsgi应用,及时监控、拉起服务,特别是应用数量不止1个的时候
四、3者的配置样例
1、flask应用样例
代码语言:javascript复制# f.py
from flask import Flask, request, abort
from flask import Blueprint, render_template
app = Flask(__name__)
f = Blueprint('f', __name__, url_prefix='/f')
@f.route('/')
def hello_world():
return 'hello world'
@f.route('/test')
def helloTest():
return 'hello test'
app.register_blueprint(f)
# 在测试时使用python f.py直接运行, 在uwsgi部署不需要这几行
#if __name__ == '__main__':
# 在开发模式下运行应用
# app.run(host='0.0.0.0',port=8080, debug=True)
2、uwsgi
/root/myapp.ini
a、uwsgi单独部署时的配置
代码语言:javascript复制[uwsgi]
uid=root
gid=root
#启用主进程
master = true
# 处理器数 工作进程的数量
processes = 1
#启用线程
enable-threads = true
# 线程数
threads = 1
pidfile = /root/f.pid
#当服务器退出的时候自动删除unix socket文件和pid文件
vacuum = true
# uwsgi 启动时所使用的地址与端口,也可以使用.sock文件的方式
http = 0.0.0.0:8080
# 指向网站目录
chdir = /root/python/project1
# python 启动程序文件
wsgi-file = f.py
# python 程序内用以启动的 application 变量名
callable = app
#状态检测地址
stats = 0.0.0.0:8081
buffer-size = 65536
#项目flask日志文件, 一般使用 daemonize
#logto = run.log
#使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
daemonize = run.log
b、使用supervisor调度的配置:
代码语言:javascript复制[uwsgi]
uid=root
gid=root
#启用主进程
master = true
# 处理器数 工作进程的数量
processes = 1
#启用线程
enable-threads = true
# 线程数
threads = 1
pidfile = /root/f.pid
#当服务器退出的时候自动删除unix socket文件和pid文件
vacuum = true
# uwsgi 启动时所使用的地址与端口,也可以使用.sock文件的方式
socket = 0.0.0.0:8080
#状态检测地址
stats = 0.0.0.0:8081
# 指向网站目录
chdir = /root/python/project1
# python 程序内用以启动的 application 变量名
callable = app
# 64K
buffer-size = 65536
mount=/f=f.py
manager-script-nmae=true
3、supervisor
放在 /etc/supervisor/conf.d/myapp.conf 目录下就可以注册成supervisor管理的服务
代码语言:javascript复制# myapp.conf
[program:myapp]
# myapp在管理任务时使用的名字: supervisorctl start myapp
# 启动命令入口
command=/root/.virtualenvs/uwsgi --ini /root/myapp.ini
# 命令程序所在目录
directory=/root/python/project1
#运行命令的用户名
user=root
# 进程名称
#process_name=myapp
#pidfile=%(program_name).pid
# # 日志级别,默认info
loglevel = info
# # 把stderr输入到stdout文件上
redirect_stderr=true
autostart=true
autorestart=true
#日志地址
stdout_logfile=/root/run.log
# 每文件最大100MB,默认是50MB
stdout_logfile_maxbytes=10MB
# # 文件存10份
stdout_logfile_backups=10
# # 每文件最大100MB,超出存到新文件
stdout_capture_maxbytes=10MB
4、nginx
代码语言:javascript复制 location ^~ /f/ {
include uwsgi_params;
uwsgi_pass 0.0.0.0:8080;
}
uwsgi_pass 结尾不能加/, 这里访问nginx的 xxxx/f 会把 /f 带到uwsgi里去,参考应用里加的前缀。如果应用程序里不加前缀,转发到uwsgi应用的请求会404
代码语言:javascript复制f = Blueprint('f', __name__, url_prefix='/f')
有些做法在nginx里还写 UWSGI_PYHONE 、UWSGI_CHDIR、 UWSGI_SCRIPT 这些选项,如
代码语言:javascript复制
location ^~ /f/ {
include uwsgi_params;
uwsgi_pass 0.0.0.0:8080;
uwsgi_param UWSGI_PYHONE /a;
uwsgi_param UWSGI_CHDIR /a;
uwsgi_param UWSGI_SCRIPT xx:app;
}
我觉得十分不好,代理就干代理的事,别管应用的配置,写上就交叉混乱了,
一些命令:
开启关闭全部supervisor服务
supervisorctl start all
supervisorctl stop all
只开启关闭myapp supervisor服务
supervisorctl start myapp
supervisorctl stop myapp
后记
简化一点 ng uwsgi , uwsgi 使用socket 或者http协议都行, 转发时不同写法