本文最后更新于 1632 天前,其中的信息可能已经有所发展或是发生改变。
使用 uwsgi + nginx 部署 flask。
主要需要配置 uwsgi,uwsgi 官方文档:uWSGI 2.0 中文文档
1. uwsgi 配置
安装见官方文档,需要注意的是:**有时只通过 apt install uwsgi
会导致 flask 的项目无法加载,此时再 pip install uwsgi
**就好了。
1.1 配置(flask版本):
[uwsgi]
# 项目目录
chdir=/home/pi/my_flask/app
# 指定项目的application
wsgi-file=/home/pi/my_flask/app/SSD_Mobilenet_v2.py
callable=app
# 启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程
master=true
# 进程个数
workers=2
# 线程个数
threads=2
# 支持由应用生成的线程,如果使用了多线程threads,就不需要此了
#enable-threads=true
# 启动uwsgi的用户名和用户组
uid=pi
gid=pi
# sock 的文件路径, 用于 nginx 监听
#socket = /tmp/myflask.sock
#chmod-socket = 666
# 直接使用
http = 0.0.0.0:5000
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 服务停止时自动移除 unix Socket 和 pid 文件
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 使SIGTERM信号习惯性地用于关闭应用(v2.1以下)
die-on-term=true
选项参数官方文档 uwsgi选项, 详细解释(按照修改和使用频率降序,这部分很重要所以很需要花点时间,我附了官方文档的链接):
- chdir: 加载应用前 cd 到目录*我没有搞明白有什么用处…,官方详细:uWSGI选项
- wsgi-file: 应用文件的路径(绝对路径),官方详细:uWSGI选项
- callable: 应用的名称,flask 中这么定义的:
app = Flask(__name__)
- master: 内置的预派生+线程多worker管理模式,官方详细:词汇表
- workers/processes: 同义,用于指定应用进程(也就是除master之外的进程)的数量,官方详细:uWSGI选项
- threads: 每个应用进程(也就是除master之外的进程)的线程数,官方详细:uWSGI选项
- enable-threads: 支持由应用生成的线程,如果使用了上面的多线程 threads 参数,那么自动启用线程支持。
- uid, gid: uwsgi 实例的用户,不推荐使用 root,官方详细: 需要知道的事情 (最佳实践和“问题”) 必读第?条
- http/http-socket: 如果你计划直接将uWSGI公开,那么使用
--http
,如果你想要在一个使用 http 与后端通信的web服务器后代理它,那么使用--http-socket
。官方详细: 需要知道的事情 (最佳实践和“问题”) 必读第一条, 原生HTTP支持。如果要使用其他web服务器代理,那可用的除了http-socket(http协议)、还有socket(默认协议), uwsgi-socket(uwsgi)等等,官方详细:uWSGI选项 的前几条 - 下面为非必须
- harakiri: 每个请求最长持续时间,官方详细:词汇表
- post-buffering: 自动读取HTTP请求有请求体的数据,官方详细:需要知道的事情 (最佳实践和“问题”) 必读
- vacuum: 服务停止时自动移除 unix Socket 和 pid 文件
- thunder-lock: 序列化accept(),官方详细:序列化accept(), 亦称惊群效应,亦亦称Zeeg难题
- die-on-term: 使 SIGTERM 信号按照习惯性用于关闭应用,官方解释:需要知道的事情…链接见第一条
1.2 uwsgi 其他设置
uwsgi第三方应用:玩转Perl, Eyetoy和RaspberryPi
- 协程: coroae参数,例如:
coroae=5
,协程比多进程更加节省内存 - uwsgi 共享区域: 没有找到 python 怎么使用
2. nginx 配置
官方文档:Python/WSGI应用快速入门#将它放在一个完整的web服务器之后 及 Nginx support
nginx 配置文件 server 下添加,其中 uwsgi_pass 需要与上面 uwsgi 中一致,配置样例:
location / {
uwsgi_pass unix:/tmp///myflask.sock;
include uwsgi_params;
}
3. Fatal error
3.1 socket 文件的权限
需要注意 socket 文件的权限,有时会因为此而无法与 nginx 连接
3.2 应用文件位置
需要注意应用文件位置,否则将导致 uwsgi 打开提示无 app