Table
前言
在 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 都請立即解決再繼續建置,不然可能會導致更難處理的後果
1 |
$ sudo su |
1.2 安裝套件
為了讓大家比較清楚安裝了什麼套件,所以我這邊是一行一行列出來~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 更新 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 本次的資料夾目錄結構如下,基本上跟隨著本篇的指令就會建構出一樣的架構囉
1 2 3 |
└── flask_app ├── app.ini └── main.py |
1.2 建立 flask 資料夾
1 |
$ mkdir flask_app |
2. 建立 Flask 的 main.py
2.1 在 flask_app 資料夾內建立 main.py
1 2 3 |
$ cd flask_app $ vim main.py |
2.2 貼上以下主程式
1 2 3 4 5 6 7 |
from flask import Flask app = Flask(__name__) @app.route("/") def index(): return '部署' |
2.3 測試 Flask 運行
1 2 3 |
$ 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
1 |
$ vim app.ini |
3.2 貼上以下配置參數
1 2 3 4 5 6 7 8 9 10 |
[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
1 |
$ uwsgi --ini app.ini |
運行後,瀏覽器開啟 IP 位置 http://35.193.247.37:8001/ 就可以看到部署兩個字囉!
4. 建立 Nginx 配置檔
1.1 修改 Nginx 配置
1 2 3 4 5 |
// 先刪除原本的 default 設定 $ rm -rf /etc/nginx/sites-available/default // 然後再寫入此次的 default 設定 $ vim /etc/nginx/sites-available/default |
1.2 貼上以下主程式
1 2 3 4 5 6 |
server{ listen 80; location /{ proxy_pass http://127.0.0.1:8001; } } |
5. 運行 Flask + uWSGI + Nginx
1.1 啟動 uWSGI
1 |
$ uwsgi --ini app.ini |
1.2 右上角齒輪 > 建立新的連線
1.3 啟動 Nginx
1 2 3 4 |
$ service nginx start // 如果 Nginx 已經啟動,則使用重啟 restart $ service nginx restart |
都運行後,瀏覽器開啟 IP 位置 http://35.193.247.37:80/ 如果看到部署兩個字代表成功囉!
1.4 補充 Nginx 相關指令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// 停止 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
1 |
invalid request block size: 21573 (max 4096)...skip |
解決方法:請確認 Nginx 配置的協議是否與 uWSGI 配置的協議相同,以下列了三種不同的配置方法
解決方法 1. 使用 http 協議
Nginx 配置
1 2 3 4 5 6 |
server{ listen 80; location /{ proxy_pass http://127.0.0.1:8001; } } |
uWSGI 配置
1 2 3 4 5 6 7 8 9 10 |
[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 配置
1 2 3 4 5 6 7 |
server{ listen 80; location /{ include uwsgi_params; uwsgi_pass 127.0.0.1:8001; } } |
uWSGI 配置
1 2 3 4 5 6 7 8 9 10 |
[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 配置
1 2 3 4 5 6 7 |
server{ listen 80; location /{ include uwsgi_params; uwsgi_pass unix:/home/maxlist2020/flask_app/uwsgi.sock; } } |
uWSGI 配置
1 2 3 4 5 6 7 8 9 10 |
[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
1 2 3 4 5 |
└── flask_app ├── __pycache__ ├── app.ini ├── main.py └── uwsgi.sock (這個會自動生成) |
最後~
每次要遷移主機,都需要重新部署實在太累了!所以筆者推薦此篇利用 Docker 就可以一個指令完成快速架起 Server
【Flask教學系列】實作 Docker-compose (Flask+Nginx+PostgreSQL)
▍回顧本篇我們介紹了的在 GCP 實作部署 Flask 大綱:
- GCP 建置虛擬主機
- 安裝套件
- 進入正題 – 開始實作 GCP 部署 Flask Server
- 架構解說
- 建立 uWSGI 配置檔
- 建立 Nginx 配置檔
- 後記:分享此次踩到的 uWSGI 雷坑
關於 Flask 教學的延伸閱讀:
▍關於 Flask 教學系列目錄:
▍其他 Flask 相關教學:
- 【Flask教學系列】Flask 為甚麼需要 WSGI 與 Nginx
- 【Flask教學系列】實作 Flask CORS
- 【Flask教學系列】實作 Flask CSRF Protection
- 【Flask教學系列】實作 Docker-compose (Flask+Nginx+PostgreSQL)
那 【Flask 教學】實作 GCP 部署 Flask + Nginx + uWSGI 的介紹就到這邊告一個段落囉!有任何問題可以在以下留言~