Home Flask项目部署记录(uwsgi)
Post
Cancel

Flask项目部署记录(uwsgi)

Flask是一个使用Python编写的轻量级Web应用框架。基于它可以很方便地搭建起一个Web应用,但其内建服务器不适用于生产环境。所以当在本地完成了一个Flask应用,为了更高效、安全、稳定地把它展示给全世界,是时候部署它了!

本页记录我把一个Flask应用部署到腾讯云服务器上的操作过程,用到了uwsgi

再进一步地,为了支持高性能、高并发,还可以用到nginx。但这一步我暂时还没弄清楚,等后续有机会实操并成功后再做记录。

服务器准备

在腾讯云租用一个服务器,会分配一个公网ip地址。

  • (首次连接前,需要)配置服务器的SSH用户名和密码
    • 我租用的是一台“轻量级服务器”,它的SSH配置指南见这里
      • :star:**关于端口**
        • 创建实例时默认已开通22端口,可供SSH连接使用。
        • 其他端口放行情况可见服务器详情的”防火墙“栏,我们后续搭建Flask应用会使用已默认放行的3389端口。
  • 配置本地和服务器的SSH连接

ok,可以开始我们的开发了!

Flask应用搭建和它的裸奔

以一个最简单的Flask应用为例,新建main.py

1
2
3
4
5
6
7
8
9
10
11
# main.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "Hello World!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=3389)

执行

1
python main.py

输出:

1
2
3
4
5
6
7
 * Serving Flask app 'main'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:3389
 * Running on http://10.0.4.2:3389
Press CTRL+C to quit

这时,我们本地登录 http://服务器公网ip:3389,即可以看到如下界面

Well done! 咱们的Flask应用可以访问了!但是可以看到终端输出的警告:

1
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

这是由于Flask内建服务器不够高效、安全、稳定,所以不适用于生产环境。按照提示,我们使用WSGI server来部署它。

WSGI server部署Flask应用

安装uwsgi

  • 常规的方法是用pip安装 参考

    1
    
    pip install uwsgi
    
  • 如果使用的是Conda虚拟环境,可以从conda forge安装 参考,如

    1
    
    conda install -c "conda-forge/label/cf202003" uwsgi
    

基于uwsgi运行flask应用

参考

新建uwsgi.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[uwsgi]
; 指定ip和端口,应保持和之前main.py中app的定义一致 (此时main.py中的ip/端口定义可以略去)
http = 0.0.0.0:3389

; 指定flask项目启动文件地址 
chdir = path/to/your/flask_project
wsgi-file = main.py

; 显式指明main.py中定义的callable <== app = Flask(__name__)
callable = app 

; 
master = true

; 指定进程/线程数目
processes = 4
threads = 2

; 指定虚拟环境地址
virtualenv = /path/to/virtual/environment

注:

  • 如果uwsgi.iniflask项目启动文件在同一目录下,chdir项可省略。
  • 如果是在虚拟环境中运行uwsgi,则virtualenv项需要指定。参考
    • 注意,当前运行所处的虚拟环境,应该与virtualenv项保持一致!
    • 终端使用 echo $CONDA_PREFIX 可以得到当前虚拟环境的本机路径。
  • master项的具体含义可以参考这里,暂时还不太理解。如果没有指定master = true的话,会有WARNING: you are running uWSGI without its master process manager

执行

1
uwsgi uwsgi.ini

会有一堆输出。如果没有报错,则本地登录 http://服务器公网ip:3389,再次出现

成功!

This post is licensed under CC BY 4.0 by the author.

格式化输出小节

【WIP】推理图优化方法小结