Featured image of post flask项目通过uwsgi+nginx部署上线

flask项目通过uwsgi+nginx部署上线

项目:机翻文章标题作为slug的一个接口

链接:咕大厨的鸽子汤

填坑了,挖坑于:百度通用翻译API

主要是想学习了解一下flask+uwsgi+nginx真正上线是如何部署的,于是便有了这边篇文章~

原理

flask、django自带的wsgi只是用于开发时方便进行测试,而uwsgi作为专门的web服务器,在性能等方面都比这些框架自带的wsgi更好。

  • uwsgi:作为web服务器启动flask项目
  • nginx:反向代理uwsgi启动的web服务

环境配置

在虚拟环境中安装flask

  1. 安装python3-venv
1
sudo apt install python3-venv
  1. 创建虚拟环境
1
python3 -m venv /home/ubuntu/venv/flask
  1. 激活虚拟环境
1
source /home/ubuntu/venv/flask/bin/activate
  1. 安装flask
1
pip3 install flask
  1. 退出虚拟环境
1
deactivate

服务器默认环境中安装uwsgi

不要在虚拟环境中安装,别问我为什么!

1
pip3 install uwsgi

配置uwsgi

通过ini文件的方式对uwsgi进行配置,并将uwsgi作为服务用systemd进行管理

uwsgi配置文件

如果不懂建议直接用以下配置,因为有将uwsgi作为服务用systemd进行管理,比如设置了daemonize会导致服务状态为dead

参考:uWSGI 2.0 中文文档

编辑uwsgi配置文件

1
vim /home/ubuntu/flask/uwsgi.ini

内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[uwsgi]
# 启动的协议,http用于测试时访问,socket用于nginx反向代理
http=:8000
socket=:8001
# 指定python虚拟环境
home=/home/ubuntu/venv/flask
# 指定flask项目目录
chdir=/home/ubuntu/flask
# 指定flask项目启动文件
wsgi-file=app.py
# 指定flask项目启动文件中用以启动的app的变量名
callable=app
# 主进程,用于管理其他进程,kill此进程会关闭全部进程
master=true
# 同时启动的uwsgi进程数
processes=4
# 启用线程
enable-threads=true
# 每一个进程下的启动的线程数
threads=8

uwsgi设置为服务用systemd进行管理

  1. 编辑/etc/systemd/system/uwsgi.service
1
vim /etc/systemd/system/uwsgi.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[Unit]
Description=uWSGI flask
After=network.target

[Service]
Restart=on-failure
ExecStart=/usr/local/bin/uwsgi --ini /home/ubuntu/flask/uwsgi.ini

[Install]
WantedBy=multi-user.target
  1. systemd重载所有配置文件
1
systemctl daemon-reload
  1. 启动uwsgi,即用uwsgi启动flask项目
1
systemctl start uwsgi.service
  1. 查看uwsgi服务状态,显示 active (running)就是正常启动了
1
systemctl status uwsgi.service

停止:systemctl stop uwsgi.service

重启:systemctl restart uwsgi.service

  1. uwsgi服务设置为开机自启
1
systemctl enable uwsgi.service

配置nginx反向代理

在配置文件中添加以下内容:

1
2
3
4
location / {
      uwsgi_pass 127.0.0.1:8001;
      include uwsgi_params;
}
Licensed under CC BY-NC-SA 4.0
最后更新于 Apr 04, 2022 07:21 CST
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计