04 Python Flask 教學10 所有文章

【Flask 教學】實作 GCP 部署 Flask + Nginx + uWSGI

GCP部署Flask_Nginx_uWSGI_Max行銷誌

前言

在 GCP 上部署 Flask 時踩了不少的雷坑,所以此篇寫得特別詳細,照著步驟走一定可以部署完成!期望能幫助到也正在學習如何在 GCP 上部署 Flask + Nginx + uWSGI 架設 Server 的朋友!

另外之前也有寫過一篇用 Docker 部署 Flask 的文章 (附完整程式碼),推薦給大家:

【Flask教學系列】實作 Docker-compose (Flask+Nginx+PostgreSQL)

一. GCP 建置虛擬主機

1.1 在 GCP 上新建立一台 VM,我們這次選用 f1-micro (1 vCPU,614 MB記憶體) 最小型的主機,每個月會花費 150 台幣左右。

1.2 作業系統選用預設的 Debian 版本是 Linux 10 (buster)

1.3 防火牆選擇開啟 HTTP 和 HTTPS ( 80 prot 和 443 port)

1.4 此次教學中會使用到 8001 port ,所以需要到 VPC 網路 > 防火牆 > 建立防火牆規則裡面新增 tcp 8001

二. 安裝套件

1.1 首先切換到 root 權限
建議以下動作都以 root 帳號執行,若在安裝過程中有遇到任何的 error 都請立即解決再繼續建置,不然可能會導致更難處理的後果

$ sudo su

1.2 安裝套件
為了讓大家比較清楚安裝了什麼套件,所以我這邊是一行一行列出來~

// 更新 apt-get
$ sudo apt-get update

// 安裝 pip3
$ sudo apt-get install python3-pip

// 安裝 Nginx
$ apt-get install nginx

// 安裝 Flask
$ pip3 install flask

// 安裝 uWSGI
$ pip3 install uwsgi

三. 開始實作 GCP 部署 Flask Server

1. 架構解說

1.1 本次的資料夾目錄結構如下,基本上跟隨著本篇的指令就會建構出一樣的架構囉

└── flask_app
    ├── app.ini
    └── main.py

1.2 建立 flask 資料夾

$ mkdir flask_app

2. 建立 Flask 的 main.py

2.1 在 flask_app 資料夾內建立 main.py

$ cd flask_app

$ vim main.py

2.2 貼上以下主程式

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return '部署'

2.3 測試 Flask 運行

$ export FLASK_APP=main.py

$ flask run --host=0.0.0.0 --port=8001

運行後,瀏覽器開啟 IP 位置 http://35.193.247.37:8001/ 就可以看到部署兩個字囉!

3. 建立 uWSGI 配置檔

3.1 在 flask_app 資料夾內建立 app.ini

$ vim app.ini

3.2 貼上以下配置參數

[uwsgi]
wsgi-file = main.py
callable = app
http= :8001
processes = 4
threads = 2
master = true
chmod-socket = 660
vacuum = true
die-on-term = true

3.3 測試使用 uWSGI 來運行 Flask

$ uwsgi --ini app.ini

運行後,瀏覽器開啟 IP 位置 http://35.193.247.37:8001/ 就可以看到部署兩個字囉!

4. 建立 Nginx 配置檔

1.1 修改 Nginx 配置

// 先刪除原本的 default 設定
$ rm -rf /etc/nginx/sites-available/default

// 然後再寫入此次的 default 設定
$ vim /etc/nginx/sites-available/default

1.2 貼上以下主程式

server{
    listen  80;
    location /{
        proxy_pass  http://127.0.0.1:8001;
    }
}

5. 運行 Flask + uWSGI + Nginx

1.1 啟動 uWSGI

$ uwsgi --ini app.ini

1.2 右上角齒輪 > 建立新的連線

1.3 啟動 Nginx

$ service nginx start

// 如果 Nginx 已經啟動,則使用重啟 restart
$ service nginx restart

都運行後,瀏覽器開啟 IP 位置 http://35.193.247.37:80/ 如果看到部署兩個字代表成功囉!

1.4 補充 Nginx 相關指令

// 停止 Nginx 運行
$ service nginx stop

// 重啟 Nginx 運行
$ service nginx restart

// 查看 Nginx access 的 log
$ tail -f /var/log/nginx/access.log

// 查看 Nginx error 的 log
$ tail -f /var/log/nginx/error.log

// 查詢 Port:80 狀態 
$ netstat -lpn |grep 80

// 查詢 Nginx 狀態
$ ps -ef | grep nginx

// 刪除 Port 
$ kill PID 

後記:分享此次踩到的 uWSGI 雷坑

▍uWSGI 錯誤訊息:invalid request block size

invalid request block size: 21573 (max 4096)...skip

解決方法:請確認 Nginx 配置的協議是否與 uWSGI 配置的協議相同,以下列了三種不同的配置方法

解決方法 1. 使用 http 協議

Nginx 配置

server{
    listen  80;
    location /{
        proxy_pass  http://127.0.0.1:8001;
    }
}

uWSGI 配置

[uwsgi]
wsgi-file = main.py
callable = app
http= :8001
processes = 4
threads = 2
master = true
chmod-socket = 660
vacuum = true
die-on-term = true

解決方法 2. 使用 uwsgi 協議

Nginx 配置

server{
    listen  80;
    location /{
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8001;
    }
}

uWSGI 配置

[uwsgi]
wsgi-file = main.py
callable = app
socket = :8001
processes = 4
threads = 2
master = true
chmod-socket = 660
vacuum = true
die-on-term = true

解決方法 3. 使用 socket

Nginx 配置

server{
    listen  80;
    location /{
        include uwsgi_params;
        uwsgi_pass  unix:/home/maxlist2020/flask_app/uwsgi.sock;
    }
}

uWSGI 配置

[uwsgi]
wsgi-file = main.py
callable = app
socket = /home/maxlist2020/flask_app/uwsgi.sock
processes = 4
threads = 2
master = true
chmod-socket = 660
vacuum = true
die-on-term = true

運行 uwsgi --ini app.ini 後,資料夾會自動產生 uwsgi.sock

└── flask_app
    ├── __pycache__
    ├── app.ini
    ├── main.py
    └── uwsgi.sock (這個會自動生成)

最後~

每次要遷移主機,都需要重新部署實在太累了!所以筆者推薦此篇利用 Docker 就可以一個指令完成快速架起 Server

【Flask教學系列】實作 Docker-compose (Flask+Nginx+PostgreSQL)

▍回顧本篇我們介紹了的在 GCP 實作部署 Flask 大綱:

  • GCP 建置虛擬主機
  • 安裝套件
  • 進入正題 – 開始實作 GCP 部署 Flask Server
    1. 架構解說
    2. 建立 uWSGI 配置檔
    3. 建立 Nginx 配置檔
  • 後記:分享此次踩到的 uWSGI 雷坑

關於 Flask 教學的延伸閱讀:

▍關於 Flask 教學系列目錄:

▍其他 Flask 相關教學:

那 【Flask 教學】實作 GCP 部署 Flask + Nginx + uWSGI 的介紹就到這邊告一個段落囉!有任何問題可以在以下留言~

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *