Dockerを使ったNginxとWSGI構成によるFlaskアプリのデプロイ

Flask

この記事では、FlaskアプリケーションをDockerを使ってデプロイする方法を解説します。
WSGIとNginxを組み合わせた構成で、プロダクション環境に適した形で動作させることを目標とします。

Nginx+WSGI+Flask構成の概要

以下の3つの役割をそれぞれ分けて構築します。

  1. Nginx
    • クライアントからのリクエストを受け取るリバースプロキシ。
    • 静的ファイルの配信やGunicornへのプロキシ機能を提供します。
  2. WSGI
    • WSGI (Web Server Gateway Interface) とは、Python製のWebアプリケーションとWebサーバー間の通信を標準化するためのインターフェース規格です。
      WSGIは、PythonアプリケーションがWebサーバーからのリクエストを受け取り、レスポンスを返す仕組みを定義しています。
      WSGIには、GunicornuWSGIなどがあります。
    • Gunicornの特徴
      「Python専用」のシンプルなWSGIサーバー。
      主にFlaskやDjangoのようなPython Webフレームワーク向けに設計。
      シンプルさと使いやすさを重視し、最低限の機能に特化しています。
    • uWSGIの特徴
      Pythonに限らず、複数の言語やプロトコルをサポートする汎用アプリケーションサーバー
      高度な機能(プロセスマネージャー、リバースプロキシ、ロードバランサーなど)をサポート。
      柔軟性と拡張性を重視しています。
  3. Flask
    • アプリケーション本体を担当し、クライアントからのリクエストを処理します。

コンテナ構成

Nginx+Gunicorn+Flask構成の場合

必要なファイルとディレクトリ構成

以下のディレクトリ構成を用意します。

各ファイルの内容

Flaskアプリケーション (app.py)

Flaskで簡単なWebアプリケーションを作成します。

Gunicorn設定ファイル (gunicorn_config.py)

Gunicorn (Green Unicorn) の設定を定義するためのPythonスクリプトです。

 依存関係リスト (requirements.txt)

Pythonプロジェクトで使用する外部ライブラリや依存関係を一覧化したファイルです。

Dockerfile

Dockerfile は、Dockerコンテナ(イメージ)を作成するための設計図となるテキストファイルです。
ここでは、Flaskアプリケーション用のDockerfileを作成します。

Nginx設定ファイル (nginx/nginx.conf)

nginx.conf は、Webサーバーソフトウェア Nginx の動作を制御するためのメイン設定ファイルです。このファイルを通じて、Nginxがどのようにリクエストを処理し、どのポートで待ち受けるか、どのようなルールでファイルを提供するかなどを設定します。

Docker Composeファイル (docker-compose.yml)

docker-compose.yml は、複数のDockerコンテナを定義し、まとめて管理・実行するための設定ファイルです。
Docker Composeを使うことで、複数のサービス(例: Webサーバー、データベース、キャッシュサーバーなど)を簡単に構築・起動できます。

Nginx+uWSGI+Flask構成への変更

GunicornからuWSGIに変更する場合、Gunicorn固有の設定をuWSGI固有の設定に置き換える必要があります。

gunicorn_config.py の削除とuwsgi.iniの作成

gunicorn_config.py を削除し、uwsgi.iniを作成します。

Dockerfileの変更

Dockerfileを以下の通りに変更します。

変更点:

  1. ビルドツールのインストール:
    • uWSGIはCで実装されているため、ビルドにはgccbuild-essentialが必要です。
  2. 起動コマンドの変更:
    • Gunicorn用コマンドをuWSGI用に置き換えます。

requirements.txtの変更

Nginx設定

Nginx設定(nginx.conf)は変更は不要です。

コンテナの起動

Dockerイメージをビルドしてコンテナを起動

以下のコマンドを実行するとコンテナが起動します。

構成のポイント

  • Nginx:
    • クライアントからのリクエストを受け取り、Gunicornに転送。
    • 静的ファイルの配信にも対応可能。
  • Gunicorn:
    • 複数のワーカーで並列処理を行い、Flaskアプリを効率的に動作。
  • Flask:
    • アプリケーション本体を構築し、ビジネスロジックを実装。

以上で、FlaskアプリケーションをDockerを使って本番環境に近い形でデプロイできます。

タイトルとURLをコピーしました