Please enable Javascript to view the contents

在 GCP 使用 Nginx 部署一個簡單的 Flask APP

 ·  ☕ 3 min read

事前準備

建立專案與 VM

在進入 Google Cloud Platform 之後,先建立新的專案


create new project

點選新增專案


click create new project

輸入專案名稱


create new project finished

建立完成之後,切換至剛剛新增的專案

搜尋並點選 Compute Engine (可以釘鉤到上面,方便之後快速切換)


select compute engine

建立一個 VM 執行個體


create vm

依照自己的需求去設定

如果是免費試用中,就弄好一點點吧XD


vm detail 1

開機磁碟這邊我使用 Ubuntu 20.04 LTS

select system and disk

將 HTTP 與 HTTPS 開啟

vm detail 2

再來切換至網路分頁,要來新增一個靜態 IP


vm detail 3

在外部 IP 那邊點開,選擇建立 IP 位址

vm detail 4

名稱就自己取吧

vm detail 5

最後建立 VM,一小段時間後會就建立完成

建立完成之後,先複製外部 IP


copy static ip

到自己的域名供應商設定一個 A 紀錄指向這個 IP

我設定子網域名為 app


add a record

過一陣子 app.網域名 就會對應到這個 IP 位址了

建立一個 APP

回到 VM,點選連接

選擇在瀏覽器視窗中開啟


select open in browser

會開啟一個 Terminal 視窗

覺得字太小可以點右上角齒輪調整

也可以從這邊上傳/下載檔案


terminal

OK,先進行更新

1
2
sudo apt-get update
sudo apt-get upgrade

之後會用到 Python (Ubuntu 20.04 LTS 已預裝 python 3.8)

安裝其他所需套件

1
2
sudo apt-get install python3-pip
pip3 install pipenv

創建一個資料夾,並建立 python 虛擬環境

1
2
3
4
mkdir myapp	# 建立資料夾
cd myapp # 進入該資料夾
pipenv --python 3.8	# 建立 python 3.8 虛擬環境
pipenv shell # 進入虛擬環境

virtual environment

在虛擬環境裡安裝 Flask,並建立一個 app.py

1
2
3
pipenv install flask # 安裝 flask
touch app.py # 新增 app.py 檔案
nano app.py # 以 nano 編輯器開啟 app.py

寫一個簡單的 Flask APP

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello():
    return "Hello"	# 在網頁中顯示 Hello


if __name__ == '__main__':
    app.run()	# 執行 APP,預設 Port: 5000


寫完之後按下 Ctrl + X,再按 Y 存檔,接著執行

1
python app.py

會看到一串字,Running on http://127.0.0.1:5000/

此時點選 Terminal 右上角的齒輪,開一個新連線

開啟之後輸入

1
curl http://127.0.0.1:5000

會看到回傳 Hello 就代表正常運作

但這時候外部還沒有辦法直接連線

Nginx

安裝 Nginx

1
sudo apt-get install nginx

安裝完成之後,如果已經將網域指向這個主機的話

可以開啟瀏覽器,輸入你的網域,可以看到 Nginx 的歡迎頁面


welcome to nginx

檢查設定檔,同時可以知道其位置在 /etc/nginx/nginx.conf

1
sudo nginx -t

查看設定檔內容

1
cat /etc/nginx/nginx.conf

Nginx 重要檔案與目錄

  • /etc/nginx:Nginx 的主要目錄
  • /etc/nginx/nginx.conf:主要的 Nginx 設定檔
  • /etc/nginx/sites-available:會在這裡儲存每個 Server 的配置
  • /etc/nginx/sites-enabled:啟用配置檔,會與 sites-available 資料夾內的設定檔建立連結檔
  • /var/log/nginx/access.log:儲存對 Nginx 的請求紀錄
  • /var/log/nginx/error.log:儲存 Nginx 的錯誤

Cerbot

接下來使用 Cerbot 處理憑證

Cerbot 官方網站

在網頁中間的部分,選擇 nginxUbuntu 20.04


select nginx and ubuntu

照著出現的步驟做

1
2
3
4
5
6
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo apt-get update

sudo apt-get install certbot python3-certbot-nginx

取得憑證並自動配置 Nginx

1
sudo certbot --nginx

依序輸入

  • Email
  • a (同意條款)
  • n (發送相關的電子郵件)
  • 網域名稱
  • 2 (重新導向 http -> https)

自動續約

1
sudo certbot renew --dry-run

生成的憑證位於 /etc/letsencrypt/live/網域名

這個時候就已經有 SSL 了


nginx with ssl

接下來將其指向 APP

編輯 Server 的設定檔

1
sudo nano /etc/nginx/sites-available/default

在這份設定檔中,可以看到由 Certbot 編輯過的紀錄

找到自己網域的 server_name

location / 加入 proxy_pass 指向本機的 Port 5000,存檔

1
proxy_pass http://127.0.0.1:5000;

edit site-available default

讓 Nginx 重新讀取設定檔

1
sudo nginx -s reload

就可以發現已經指向自己的 APP 了


flask app with nginx and ssl

Nginx 還有更複雜的設定需要再研究


Done

分享
您的鼓勵是我最大的動力

JIHONGO
作者
JIHONGO
A Person