最近不少朋友都在問我關於 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 來完成這個部署過程的話那麼就是純自動化部署了喔,值得嘗試的。