通過Gunicorn部署flask應用(阿里雲伺服器:Ubuntu 16.04)

kk_miles發表於2018-01-13

有用 Python 編寫的流行伺服器來容納 WSGI 應用並提供 HTTP 服務。這些伺服器在執行時是獨立的:你可以從你的 web 伺服器設定到它的代理。 Gunicorn ‘Green Unicorn’ 是一個給 UNIX 用的 WSGI HTTP 伺服器。

1. 安裝pip、virtualenv

sudo apt-get install python-pip python-virtualenv
複製程式碼

2. 安裝nginx

sudo apt-get install nginx
複製程式碼

3. 新建測試專案

在 '/var/www/' 下新建測試專案資料夾:

cd /var/www
sudo mkdir test
複製程式碼

使用scp上傳本地專案檔案至遠端伺服器:

scp -r test.py root@your.ip.address:/var/www/test  //@後填伺服器的公網IP
複製程式碼

這裡,我們用一個最小專案來測試,test.py:

# file_name='test.py'
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    from werkzeug.contrib.fixers import ProxyFix
    app.wsgi_app = ProxyFix(app.wsgi_app)
    app.run(host='0.0.0.0',port=5000)   # 設定外部訪問限制,本例表示所有ip均可訪問,埠為5000
複製程式碼

4. 配置專案環境

這裡推薦使用virtualenv和pip工具來配置我們專案的環境,pip可以方便的安裝Python有關的工具、框架等,virtualenv可以為我們每個專案都配置一個獨立的工作環境,使不同專案的依賴相互隔離,更方便管理,互相不影響。

在專案路徑 '/var/www/test' 下建立virtualenv環境:

virtualenv -p /usr/bin/python3.6 venv   //這裡我使用了python3.6的版本,如果使用的是系統預設的python版本,則只需輸入:virtualenv venv
複製程式碼

然後啟用環境:

source venv/bin/activate
複製程式碼

如果命令列前面多出來一個: '(venv)' 則表示環境啟用成功。

然後,以下安裝的所有框架、工具都是隻針對這個專案,與其他專案無關。

  • 安裝flask:
pip install flask
複製程式碼
  • 安裝Gunicorn
pip install gunicorn
複製程式碼
  • 根據requirements.txt安裝專案依賴
pip install -r requirements.txt
複製程式碼

5. 啟動專案

  • 簡單快速啟動:
gunicorn test:app
複製程式碼

這裡的test是我們的入口模組名,app是flask例項名稱。

  • 引數啟動:
gunicorn -w 4 -b 127.0.0.1:5000 test:app
複製程式碼
  • 後臺啟動
nohup gunicorn -w 4 -b 127.0.0.1:5000 test:app&     //關閉遠端連線時程式在後臺繼續執行
複製程式碼

用四個 worker 程式來執行一個 Flask 應用( -w 4 ),繫結到 localhost 的5000 埠( -b 127.0.0.1:5000 )

注意: 如果是部署在伺服器上,除了需要設定相關埠(如5000)的安全組,還需要將上面的啟動程式碼中的地址:'127.0.0.1' 改為你的伺服器的私有IP,或者'0.0.0.0',否則外部無法訪問到專案!

6. 配置

有時我們需要nginx代理請求,接下來我們配置nginx以實現通過請求80埠獲取flask專案的服務:

首先備份nginx的配置檔案:

sudo cp /etc/nginx/sites-available/default default.bak
複製程式碼

然後修改nginx的配置檔案:

sudo nano /etc/nginx/sites-available/default
複製程式碼

將其改為:

# file_name=default
server {
    listen 80;
    server_name example.org; # 這是HOST機器的外部域名,用地址也行

    location / {
        proxy_pass http://your.私有IP:5000; # 指向 gunicorn host 的服務地址,注意,這裡填我們伺服器的私有IP
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }
複製程式碼

其中的location塊程式碼表示將80埠的請求傳送到proxy_pass表示的地址,這裡我們要填入我們的私有IP和專案所在的埠!

現在,我們對公網IP的http請求就可以對映到我們的部署在Gunicorn的flask專案上了。

完成

退出虛擬環境:

deactivate
複製程式碼

關閉gunicorn:

pkill gunicorn  //關閉gunicorn
複製程式碼

檢視gunicorn程式:

pstree -ap|grep gunicorn
複製程式碼

相關文章