天天看點

Flask + Gunicorn + Nginx 部署

最近很多朋友都在問我關于 Flask 部署的問題,說實在的我很樂意看到和回答這樣的問題,至少證明了越來越多人開始用 Flask 了。

之前我曾發表過一篇在 Ubuntu 上用 uwsgi + nginx 的 Flask 部署方法,說實在的 uwsgi 是個大坑可能用在 Django 上還好吧,不過用在 Flask 上未必就如此。至少 , uwsgi 是個極為折騰人的東西。總之,我是一直認為複雜的東西未必不好,但一定是不好用的。

我自己也經過多番的糾結與嘗試,也終于找到了一個 Flask 上靠譜的部署方案。我現在公司的微信後端平台也采用這種部署方案。如果有興趣的朋友也不妨一看,或者給我提些更好的方案,畢竟知識隻有共享了才知道是否有價值。

我在 Flask 官方文檔中找到其中一個有意思的内容,這裡是原諒連結:Standalone WSGI Containers ,其中并沒有 uwsgi 的身影。悻然,但是找到了一個不用折騰的 Flask 部署方案了 —— Gunicorn。

Ubuntu 上的準備

假定你是在騰迅雲或者阿裡雲購買了VPS,那麼直接執行以下指令吧,其它的不多解釋了,無非就是準備一下 python 環境。

$ sudo apt-get update
$ sudo apt-get install python-dev python-pip python-virtualenv
           

然後安裝 nginx

$ 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 [email protected]:/var/www/myflask
           

域名就改成位址或者你的伺服器正在使用的域名,我這裡是用

root

使用者進入的,你得按你的伺服器的使用者來修改。兩大雲的預設根使用者是:

  • 騰迅 :ubuntu
  • 阿裡 :root

Gunicorn

Gunicorn 綠色獨角獸 是一個Python WSGI UNIX的HTTP伺服器。這是一個pre-fork worker的模型,從Ruby的獨角獸(Unicorn )項目移植。該Gunicorn伺服器大緻與各種Web架構相容,隻需非常簡單的執行,輕量級的資源消耗,以及相當迅速。

我曾經Google 過 Gunicorn 與 uwsgi ,都說uwsgi 的性能要比 gunicorn 高,是以最終結果就杯具了。不過,現在回過頭來看這隻 “獨角獸”還為時不晚吧。

安裝 Gunicorn

Gunicorn 應該裝在你的 virtualenv 環境下,關于 virtualenv 就不多說了,如果沒用過那就趕快腦補吧。安裝前記得激活 venv

(venv) $ pip install gunicorn
           

運作 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 我也就不詳細講了,我們就直奔主題,殺入 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
           

将 Gunicorn 作為服務運作

這就是最後一步了,我們在此将采用 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 來完成這個部署過程的話那麼就是純自動化部署了喔,值得嘗試的。

版權聲明:本文為CSDN部落客「weixin_33810006」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_33810006/article/details/91872428