Back to Blog

Flask+Nginx+Gunicornの環境をDockerで構築する方法

flask

2024年7月6日

こんにちは。

今回の記事では、Flask+Nginx+Gunicornの環境をDockerで構築する方法について解説します。

Webアプリケーションを開発・デプロイする際に、Flask、Nginx、Gunicornを組み合わせることで、高性能な環境を構築できます。

さらに、Dockerを利用することで、環境の依存関係を簡単に管理し、同一の環境を複数のマシンで再現することができます。

本記事では、FlaskアプリケーションをNginxとGunicornを用いてDocker上で構築する手順を詳細に解説します。

Flask+Nginx+Gunicornの環境をDockerで構築する方法

ここから、Flask+Nginx+Gunicornの環境をDockerで構築する方法について解説します。

Flask+Nginx+Gunicorn構成のメリット

Flask+Nginx+Gunicornの組み合わせは、スケーラブルなWebアプリケーションを構築するためによく使う構成です。

Gunicorbは、Python WSGI HTTPサーバーであり、マルチプロセスで動作するため、高いパフォーマンスを発揮します。必要に応じてGunicornのワーカー数を増やすことで、リクエストの処理能力を簡単に向上させることができます。

また、Nginxは負荷分散機能を提供し、複数のGunicornインスタンス間でトラフィックを分散することができます。

ディレクトリ構造

次に、デイレクトリ構造をみていきましょう。

どのデイレクトリとファイルを作成するのかを確認します。今回の構成では、以下のようになります。

flask_app
├── app.py
├── nginx/
│   ├── nginx.conf
│   ├── cert.pem
│   └── key.pem
├── gunicorn_config.py
├── Dockerfile
├── docker-compose.yml
└── requirements.txt

各ディレクトリとファイルの説明は以下の通りです。

  • app.py・・・Flaskのアプリケーションの設定ファイルです。
  • nginxディレクトリ・・・Nginxの設定ファイルや必要な証明書などを保存します。
  • gunicorn_config.py・・・gunicornの設定ファイル
  • Dockerfile・・・Dockerイメージをビルドするための設定ファイル
  • docker-compose.yml・・・コンテナを起動するための設定ファイル
  • requierments.txt・・・Flaskで必要なパッケージを記載します。

それぞれのディレクトリとファイルの作成方法と設定内容を解説します。

Flaskの設定

Flaskの設定に必要なファイルを解説します。

app.py

app.pyはappディレクトリに配置します。以下の例では、”Hello, World!”と出力する簡単なWebサイトを想定しています。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0')

requirements.txt

Flaskで必要なパッケージを記載します。

Flask
gunicorn

gunicorn_config.py

gunicorn_config.pyは、gunicornの設定ファイルです。

bind = '0.0.0.0:5000'
workers = 3

Nginxの設定

NginxはWebサーバーとして動作させます。今回はhttpsでアクセスできるように設定します。HTTPSでアクセスするためには、サーバー証明書と鍵が必要なので、必要に応じて準備しましょう。

nginx.conf

events {}

http {
    upstream flask {
        server flask-app:5000;  # flask-appはdocker-compose.ymlで定義したFlaskアプリのサービス名
    }

    server {
        listen 80;
        server_name localhost;

        location / {
            return 301 https://$host$request_uri;  # HTTPリクエストをHTTPSにリダイレクト
        }
    }

    server {
        listen 443 ssl;
        server_name localhost;

        ssl_certificate /etc/nginx/certs/cert.pem;
        ssl_certificate_key /etc/nginx/certs/key.pem;

        location / {
            proxy_pass http://flask;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            # SSL設定
            proxy_ssl_session_reuse off;
            proxy_ssl_verify off;
        }
    }
}

サーバー証明書の発行は、ZeroSSLというサイトを使うと便利です。ブラウザからGUI操作で証明書を発行できます。

Dockerの設定

Dockerfile

DockerfileにアプリケーションのDockerイメージをビルドするための設定を記載します。

# ベースイメージを指定
FROM python:3.8-slim

# 作業ディレクトリを設定
WORKDIR /app

# 必要なファイルをコピー
COPY requirements.txt /app
COPY app.py /app
COPY nginx/nginx.conf /etc/nginx/nginx.conf
COPY gunicorn_config.py /app

# Flaskアプリの依存関係をインストール
RUN pip install --no-cache-dir -r requirements.txt

# GunicornでFlaskアプリを起動
CMD ["gunicorn", "--config", "gunicorn_config.py", "app:app"]

docker-compose.yml

docker-compose.ymlを作成し、FlaskとNginxのコンテナを連携させます。

version: '3'
services:
  flask-app:
    build:
      context: .
    ports:
      - "5000:5000"
    restart: always
    networks:
      - frontend
    volumes:
      - ./:/app

  nginx:
    image: nginx:latest
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/cert.pem:/etc/nginx/certs/cert.pem:ro   # SSL証明書をマウント
      - ./nginx/key.pem:/etc/nginx/certs/key.pem:ro     # 秘密鍵をマウント
    ports:
      - "80:80"
      - "443:443"
    restart: always
    depends_on:
      - flask-app
    networks:
      - frontend

networks:
  frontend:
    driver: bridge

コンテナのビルドと起動

設定ファイルの準備が完了したら、コンテナを起動します。

docker-compose up -d

ブラウザでhttps://[URL]にアクセスし、「Hello, World!」と表示されれば、環境構築は成功です。

まとめ

今回の記事では、Flask、Nginx、GunicornをDocker上で構築する方法を解説しました。

この構成により、効率的でスケーラブルなWebアプリケーションのデプロイが可能となります。さらに、Dockerを利用することで、環境の依存関係を一元管理でき、開発・運用の効率化が図れます。

今後は、この基盤をもとに、より高度な機能の追加や、運用監視の仕組みを整えることで、より実践的なアプリケーション開発を進めていくことができます。

今回の記事がWeb開発のお役に立てれば幸いです。

ここまでお読みいただきありがとうございました。

Webの知識を作りながら学ぶ
Flask WebAcademy

SNSアプリやチャットアプリ、さまざまなアプリを作りながら学べる実践的なカリキュラム

詳細を見る