Flask_uwsgi_nginx_ubuntu19_centos8_apt安装
转载注明来源: 本文链接 来自osnosn的博客,写于 2019-12-21.
通过 apt 安装 flask (ubuntu 19.04)
- apt install nginx python3
- apt install virtualenv python3-virtualenv
- apt install python3-flask
- 如要使用虚拟环境,还需要: apt install python3-dev
- 指定用py3: virtualenv --python=python3 venv
- apt install uwsgi uwsgi-plugin-python3
通过 yum 安装 flask (CentOS 7/8)
- yum install nginx python3
- yum install python3-virtualenv
- yum install python3-flask
- 如要使用虚拟环境,还需要: yum install python3-devel
- 指定用py3: virtualenv --python=python3 venv
- pip3 install uwsgi
通过 pip3 安装 flask (ubuntu19/centos7/8) [推荐的]
- apt install nginx python3 python3-pip / yum install nginx python3 python3-pip
- 这一步会安装很多比较大的依赖包(下载100多MB,安装后占350多MB)。用apt或yum安装flask不需要装这些依赖包。
这些依赖包包括但不限于:perl-modules-5.28 libperl5.28(3MB) libc6-dev cpp-8(8MB) libatomic1 libgcc-8-dev gcc-8(9MB) g++-8(9MB) libpython3.7-dev(48MB)
- 这一步会安装很多比较大的依赖包(下载100多MB,安装后占350多MB)。用apt或yum安装flask不需要装这些依赖包。
pip3 install --upgrade pip 可以考虑把 pip 升级到最新。- pip3 install virtualenv
- 启动虚拟环境。(可选项.启动方法见下文)
- pip3 install flask ,
- 装在系统中
/usr/local/lib(64)/python3.6/site-packages/
- 或虚拟环境中
虚拟环境目录/lib(64)/python3.6/site-packages/
- 装在系统中
- pip3 install uwsgi ,
- 装在系统中
/usr/local/bin/
- 或虚拟环境中
虚拟环境目录/bin/
- 装在系统中
- 创建项目目录。在里头写flask程序。在里头启动uwsgi。
其他注意事项
- pip3 install uwsgi 如果失败,则需要安装python3-dev(centos:python3-devel)
- uwsgi 如果不支持 -x 参数,则需安装 libxml2-dev(centos:libxml2-devel)
- pip3 uninstall uwsgi 然后 pip3 install --no-cache-dir uwsgi 否则不会重新编译。
- uwsgi 如果不支持 -x ,可以用 --ini ,使用 ini 格式的配置文件。
- pip3 换镜像/代理。代理使用命令行参数
--proxy=http://usr:pwd@ip:port
,或者设置用户配置文件~/.pip/pip.conf
。
[global]
timeout = 60 #缺省是15秒
#更换镜像源
index-url = https://mirrors.huaweicloud.com/repository/pypi/simple
#proxy = socks5://usr:pwd@192.168.1.22:1080
proxy = http://usr:pwd@192.168.1.22:88
此用户配置文件,在虚拟环境中也有效。
- 如果出现
ERROR: Could not find a version that satisfies the requirement XXXX (from versions: none)
ERROR: No matching distribution found for XXXX
- 则执行
pip3 install --no-cache-dir XXXX
, 或删除缓存目录rm -rf ~/.cache/pip/
。
通过 uwsgi 启动 flask
- 建议使用虚拟环境
- 创建虚拟环境的父目录(比如 /myflask),并进入这个目录(cd /myflask)
virtualenv test1
(创建目录test1并在目录中创建虚拟环境。仅需执行一次)virtualenv test1
这个虚拟环境不包含系统安装的py包。(import时找不到,除非在虚拟环境中用pip3再装一次)virtualenv test1 --system-site-packages
这个虚拟环境包含系统安装的py包。(可以import)
cd test1
- test1为虚拟环境目录,与flask的项目目录,互不相干。分别可以放在任意位置。只是激活虚拟环境,需要执行
test1/bin/activate
,所以test1目录一般放在项目目录边上,方便输入激活虚拟环境的命令。
- test1为虚拟环境目录,与flask的项目目录,互不相干。分别可以放在任意位置。只是激活虚拟环境,需要执行
source bin/activate
(激活虚拟环境)- 虚拟环境中 pip3 也使用
~/.pip/pip.conf
配置文件。
- 虚拟环境中 pip3 也使用
- 如果不想用全局的 flask,uwsgi, 可以在虚拟环境中用 pip3 再装一次。
- 根据项目需要,在虚拟环境中
pip3 install
各种支持包。 uwsgi -x config.xml
或uwsgi --ini config.ini
(启动uwsgi)- apt或yum装的uwsgi的配置文件在/etc/中,并有服务启动脚本,可以用
service
命令启动。不过uwsgi的版本较低。 - pip3装的uwsgi,没有默认配置文件,不能用service命令启动。只能用
uwsgi -x config.xml
启动。
- apt或yum装的uwsgi的配置文件在/etc/中,并有服务启动脚本,可以用
- 去项目目录中,创建/修改flask程序,启动/重启/停止uwsgi进程。
- deactivate (退出虚拟环境,要进入虚拟环境之后才有这个指令,其实就是个shell的func)
flask 本地运行测试
- 如果修改了程序,暂时不使用 uwsgi 启动。可以直接运行 .py 程序执行(要求程序最后两行如下所示)。
if __name__ == '__main__':
app.run(debug=True) #默认是127.0.0.1:5000
#函数原型 run(self, host=None, port=None, debug=None, **options)
配置参考
- uwsgi-config.ini
[uwsgi]
chdir=/home/u01/flask01/mysite ("wsgi-file="相对位置,"/templates/"目录位置)
home=/home/u01/flask01 (虚拟环境目录)
wsgi-file=mysite.py (相对chdir目录)
callable=app
master=true
processes=2
threads=4
#socket=%(chdir)/mysite.sock
socket=127.0.0.1:8081
chmod-socket=666
logfile-chmod=644
daemonize=%(home)/uwsgi.log
pidfile=%(home)/uwsgi.pid
uid=u01
gid=u01
#指定静态文件映射
static-map=/mydir/mystat=/home/u01/flask01/mysite/static
- nginx.conf, location{ },
# 需要 @app.route('/flk/hello')
location /flk/ {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8081;
}
templates 文件存放目录
app = Flask(__name__,template_folder='templates')
,可以用template_folder=
修改
static 静态文件目录
(Flask 1.1.2 , uwsgi 2.0.18)
- 静态文件存放目录,
app = Flask(__name__,static_folder='static')
,可以用static_folder=
修改 - 静态文件的 URL 访问位置
app = Flask(__name__,static_url_path='/mydir/mystat')
,可以用static_url_path=
修改 - 提供静态文件访问支持
- 如果是本地运行测试,则由 Flask 自己提供就好。
- 可以由 Flask 自身提供。
app.run(... , debug=True)
无论 debug 是 True 还是 False。都能提供静态文件支持。但性能不佳。
Flask返回头多出cache-control:,etag:,expires:
,uwsgi返回头没有。 - 可以由 uwsgi 提供。用
static-map=
参数指定(见上面的配置例子)。但性能不佳,比 Flask 好一点。 - 由 nginx 或 apache 提供。这是推荐的配置,性能最佳。
使用静态文件 url 路径 (flask-1.1.2)
- 在 templates 中
<img src="{{url_for('static',filename='img.jpg')}}">
<img src="{{url_for('static',filename='')}}img.jpg">
- 在 py 程序中
from flask import url_for
url=url_for('static',filename='img.jpg')
url=url_for('static',filename='')+'img.jpg'
程序分成多个文件
- 用装饰器
import otherfile
@app.route('/path1')
def path1_func():
return otherfile.appfunc()
- 用
add_url_rule()
import otherfile
app.add_url_rule('/path2',view_func=otherfile.appfunc)
路由写到多个文件
- 用蓝图
blueprint
, 自行搜索用法。
参考:
Ubuntu+Nginx+uWSGI+Flask应用
简单的方法部署Flask + uwsgi + nginx到ubuntu 16.04服务器
Docs » uWSGI选项使用virtualenv, uwsgi, nginx来布署flask
ubuntu部署python项目: virtualenv + flask + uwsgi + nginx + python3.6
在flask中使用蓝图将路由分开写在不同文件,Blueprint简介
Lazily Loading Views
flask--app.add_url_rule()函数 和 类视图详解