由于对uwsgi不熟悉,从接触flask并部署到uwsgi用了30个小时。
使用隔离的环境
可以使用virtualenv, conda建立新的环境。我这里使用了virtualenv。
(1)安装 virtualenv
pip3 install virtualenv
(2)在项目的目录下创建虚拟环境
项目的目录:/home/simoe/Documents/flask_uwsgi
切换到目录:
cd /home/simoe/Documents/flask_uwsgi
创建一个名为venv,使用python3的环境
virtualenv -P usr/bin/python3 venv
这里有个坑,如果直接使用virtualenv venv
创建环境,默认使用python2.7。-p 表示当前路径,如果没有切换到项目的目录下,要使用
virtualenv /home/simoe/Documents/flask_uwsgi usr/bin/python3 venv
激活环境
source 环境名/bin/activate
这里环境名为venv,所以source venv/bin/activate
关闭环境 deactivate
安装flask
在激活可虚拟环境venv下安装flask才会把flask安装在这个环境中。
pip install flask
按照官方指南,建立一个很简单的应用。
新建一个test.py文件:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'hello world ! '
if __name__ == '__main__':
app.run()
直接运行这个文件然后打开浏览器,输入127.0.0.1:5000
当看到hello world !时证明安装好了。
安装uwsgi
uwsgi使用默认使用python2.7,当你将用python3 写的flash应用部署到默认使用2.7的uwsgi时,就会像我遇到解决不完的bug。
修改uwsgi的Python时很麻烦的,但是直接使用pip3去安装就把uwsgi的默认语言改为了Python3. 跨过很多坑之后知道的。
可能这里会遇到一些错误,比如GCC的版本什么的,先把环境依赖解决
sudo apt-get install build-essential python-dev
然后直接使用
pip3 install uwsgi
查看版本
uwsgi --version
查看Python版本
uwsgi --python-versioin
测试
在项目目录下新建一个uwsgi_test.py文件, 写入:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
在命令行运行:
uwsgi --http :8000 --wsgi-file uwsgi_test.py
直接运行这个文件然后打开浏览器,输入127.0.0.1:8000
当看到Hello World 时证明安装好了。
在uwsgi上部署flask应用
前面已经单独验证了flask和uwsgi能够运行成功,接下来如何将flask应用部署到uwsgi呢?
详细的原理这里不介绍,简单的一句命令就能够实现, 前提是你的环境和各个配置都已经正确。
一定要注意uwsgi默认的Python版本和你虚拟环境的版本。上面也介绍了怎么查看。
配置uwsgin_config.ini
在项目目录下新建一个名为config.ini的文件:
[uwsgi]
http = 127.0.0.1:5000
virtualenv = /home/simon/Documents/flask_uwsgi/venv # 虚拟环境的路径
wsgi-file = /home/simon/Documents/flask_uwsgi/app.py # 前面创建的app.py
processes = 2
threads = 8
buffer-size = 32768
master = true
各个参数可以参考这里 uwsgi配置详解
启动/查看/停止
启动命令
切换到项目目录和虚拟环境激活的情况下使用,不然报错
uwsgi config.ini
我修改了app.py里面的内容为:
@app.route('/')
def sys_status():
return 'server starts-up successful!'
打开浏览器输入地址127.0.0.1:5000, 如果没有看见类似下面的界面,就表示配置或者哪里有问题。
查看进程
ps -a
停止
(1)ctrl + c
(2)kill -9 进程号