最近不少朋友都在问我关于 Flask 部署的问题,说实在的我很乐意看到和回答这样的问题,至少证实了愈来愈多人开始用 Flask 了。html
以前我曾发表过一篇在 Ubuntu 上用 uwsgi + nginx 的 Flask 部署方法,说实在的 uwsgi 是个大坑可能用在 Django 上还好吧,不过用在 Flask 上未必就如此。至少 , uwsgi 是个极为折腾人的东西。总之,我是一直认为复杂的东西未必很差,但必定是很差用的。python
我本身也通过多番的纠结与尝试,也终于找到了一个 Flask 上靠谱的部署方案。我如今公司的微信后端平台也采用这种部署方案。若是有兴趣的朋友也不妨一看,或者给我提些更好的方案,毕竟知识只有共享了才知道是否有价值。nginx
我在 Flask 官方文档中找到其中一个有意思的内容,这里是原谅连接:Standalone WSGI Containers ,其中并无 uwsgi 的身影。悻然,可是找到了一个不用折腾的 Flask 部署方案了 —— Gunicorn。shell
假定你是在腾迅云或者阿里云购买了VPS,那么直接执行如下指令吧,其它的很少解释了,无非就是准备一下 python 环境。flask
$ sudo apt-get update $ sudo apt-get install python-dev python-pip python-virtualenv
而后安装 nginxubuntu
$ sudo apt-get install nginx
在 /var/www
目录下创建一个 myflask
的文件夹(你的项目目录),而后用 chmod
改一下权限后端
$ sudo mkdir /var/www/myflask $ sudo chmod 777 /var/www/myflask
注:固然你可使用 nginx 的默认网站目录
/usr/share/nginx/html
服务器
而后用 scp
指令直接将本机上的 flask 项目传到服务器:微信
$ scp -r myflask root@www.mydomain.com:/var/www/myflask
域名就改为地址或者你的服务器正在使用的域名,我这里是用 root
用户进入的,你得按你的服务器的用户来修改。两大云的默认根用户是:app
Gunicorn 绿色独角兽 是一个Python WSGI UNIX的HTTP服务器。这是一个pre-fork worker的模型,从Ruby的独角兽(Unicorn )项目移植。该Gunicorn服务器大体与各类Web框架兼容,只需很是简单的执行,轻量级的资源消耗,以及至关迅速。
我曾经Google 过 Gunicorn 与 uwsgi ,都说uwsgi 的性能要比 gunicorn 高,因此最终结果就杯具了。不过,如今回过头来看这只 “独角兽”还为时不晚吧。
Gunicorn 应该装在你的 virtualenv 环境下,关于 virtualenv 就很少说了,若是没用过那就赶快脑补吧。安装前记得激活 venv
(venv) $ pip install gunicorn
(venv) $ gunicorn -w 4 -b 127.0.0.1:8080 wsgi:application
That's all! 它的安装就这么简单。不过这里得做一个解释。就是最后的那个参数 wsgi:application
这个是程序入口,我得写个小小的范例来讲明一下:
新建一个 wsgi.py
的文件, 注意,这里和 Flask 项目中经常使用的 manage.py
引导脚本是没有半点毛关系的。(这是我笨,之前一直没分清被uwsgi搞糊涂了)
# wsgi.py from flask import Flask def create_app(): # 这个工厂方法能够从你的原有的 `__init__.py` 或者其它地方引入。 app = Flask(__name__) return app application = create_app() if __name__ == '__main__': application.run()
好了,这个 wsgi:application
参数就很好理解了, 分两部:wsgi
就是引导用的 python 文件名称(不包括后缀/模块名)application
就是 Flask 实例的名称。这样 gunicorn 就会找到具体要 host 哪个 flask 实例了。
从这里开始就能够体现 gunicorn 的好了,咱们根本不用配什么配置文件的,一个指令就能够将它起动。
关于 Nginx 我也就不详细讲了,咱们就直奔主题,杀入 Nginx 的默认配置文件
sudo nano /etc/nginx/site-avalidable/default
暴力修改为为如下的内容
建议先备份一下
default
文件
sudo cp /etc/nginx/site-avalidable/default /etc/nginx/site-avalidable/default.bak
server { listen 80; server_name example.org; # 这是HOST机器的外部域名,用地址也行 location / { proxy_pass http://127.0.0.1:8080; # 这里是指向 gunicorn host 的服务地址 proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
记得完成 nginx 须要从新起动 nginx 服务喔!
sudo service nginx restart
这就是最后一步了,咱们在此将采用 UpStart 配置Flask程序做为服务程序在Linux起动时运行。首先创建起动配置文件:
sudo nano /etc/init/myflask.conf
而后加入以下配置
description "The myflask service" start on runlevel [2345] stop on runlevel [!2345] respawn setuid root setgid www-data env PATH= /var/www/myflask/venv/bin chdir /var/www/myflask/ exec gunicorn -w 4 -b 127.0.0.1:8080 wsgi:application
OK 大功告成,启动 myflask 服务
sudo service myflask start
这里有一点必须补充的,请留意在 myflask.conf
中的
env PATH= /var/www/myflask/venv/bin chdir /var/www/myflask/
这里所指向的地址就是你的项目路径和 virtualenv 的路径
这个部署过程感受比我以前所介绍的 uwsgi 那种简单不少吧。这里给一点小 Tips 若是你用 Fabric 来完成这个部署过程的话那么就是纯自动化部署了喔,值得尝试的。