使用uWSGI、Nginx與Docker Compose部署Python Web Application(Flask, Django) — 最終章

林育銘
5 min readApr 1, 2021

--

上一個章節,已經說明了關於uWSGI與Nginx的參數配置,可以參考這裡。本節我們將透過Docker Compose來進行Python的Web Application的最終部署,由於篇幅的關係,關於Docker與Docker Compose的下載安裝便不贅述,請讀者自行參考其他文章。

Docker Compose的參數配置

我們來創建docker-compose.yml,存放Docker相關的配置。

$ vim docker_develop/docker-compose.yml

version: "3"services:
flask:
container_name: flask
build:
context: ../
dockerfile: Dockerfile
command: uwsgi — ini uwsgi.ini
env_file: hotel.env
expose:
- "8700"
sysctls:
- net.core.somaxconn=4096
ports:
- "8700:8700"
# uwsgitop
- "5002:5002"
nginx:
container_name: nginx
image: nginx:1.19.5-alpine
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/sites-enabled/nginx.conf
- ./nginx/site_enabled/default.conf:/etc/nginx/conf.d/default.conf
restart: always

關於Flask的Container,我們會撰寫Dockerfile以Build出Flask的Image,而Nginx的Container則會自動去Docker Hub下載nginx:1.19.5-alpine image。

Flask的Container會暴露8700 Port,作為uWSGI接收Nginx轉發HTTP請求的管道;5002 Port則是方便我們查看每個process的狀況。Nginx容器則預設開啟80 Port,接收前端發送的請求。

透過env_file的參數配置,我們可以創建XXX.env檔案,將Secret Key、Password等敏感的環境變量設定於此(不能放到GitHub);Python的Web Application可以透過os.environ.get獲取所設定的環境變量。

net.core.somaxconn則是指Flask的Container能夠被外界同時訪問的上限次數,默認是128個,如服務流量相當高,則需調高預設值以處理高併發的狀況,同時該值必須大於uwsgi.ini中listen的參數

待flask的容器建置完畢後,便會執行uwsgi --ini uwsgi.ini,啟動Web Application。

接著,我們創建Dockerfile文件vim Dockerfile

FROM python:3.6-onbuild
RUN pip install — upgrade pip
RUN pip install — upgrade setuptools
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY requirements.txt /usr/src/app/
RUN pip install — no-cache-dir -r requirements.txt
COPY . /usr/src/app
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh

請注意requirements.txt由讀者們依專案需求自行配置(需添加uWSGI與uwsgitop這兩個Python套件),接著配置entrypoint.sh vim entrypoint.sh

#!/bin/bash
set -e
exec "$@"

至此便已經完成程序部署的前置作業,如對目錄結構不清楚者,可查看上篇文章,或者是以下GitHub專案(Flask部署, Django部署)。

Web 部署

首先,我們進入docker_develop的目錄下,就可以透過Docker Compose進行部署了!

$ cd docker_develop
$ sudo docker-compose up --build -d

輸入上述命令後,Docker Compose便會自動建立Flask與Nginx的Container,至此,部署完成,讓我們熟悉Docker的簡單操作。

# 查看當前docker進程
$ sudo docker ps
# 查看flask container最近20筆的log
$ sudo docker-compose logs --tail=20 -f flask
# 停止flask容器進程
$ sudo docker stop flask
# 重啟flask容器進程
$ sudo docker restart flask
#進入容器
$ sudo docker exec -it flask /bin/bash

我們可以查看每個進程處理請求的狀況。

$ uwsgitop 127.0.0.1:5002

至此便介紹完Python Web Application的部署,關於如何透過supervisor套件對uWSGI進行後台管理,以及透過Prometheus蒐集Web Application處理狀況,筆者會再找時間和大家分享。如讀者認為該篇文章有所助益,可多多分享並且拍手,表示對我的支持與鼓勵。

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

林育銘
林育銘

Written by 林育銘

Graduated from NTU, and worked as backend engineer. Github:https://github.com/LinYuMingBejing

No responses yet

Write a response