LoginSignup
1
1

Docker上に uWSGIを使ったFlask環境を構築し、Apache経由で接続する

Posted at

はじめに

図のような構成です。

uwisgi.png

①uWSGIを使ってFlask環境を構築
②Apache経由で接続する(http://host/api で接続)
で書き進めます。

確認環境

  • WSL2(Ubuntu22.04.3 LTS)
  • Docker (24.0.6)
  • Docker Compose (2.4.1)
  • Python 3.12.1
  • Apache 2.4.58

①uWSGIを使ってFlask環境を構築

フォルダ構成

[projectfolder]
 ├─ Dockerfile
 ├─ compose.yml
 └─ api
      ├─ main.py
      └─ uwsgi.ini

各コード

Dockerfile
# ビルドイメージ
FROM python:3.12-slim-bookworm

# パッケージ更新
RUN apt-get -y update
RUN apt-get -y install \
    gcc 

# Flaskとuwsgiをpipで取得
RUN python -m pip install Flask uwsgi

compose.yml
services:
  app:
    build:
      context: .
    volumes:
      - ./api:/usr/local/src/api
    ports:
      - "8000:8000"
    tty: true
    entrypoint: >
      sh -c "
        cd /usr/local/src/api &&
        uwsgi --ini uwsgi.ini
      "
api/main.py
from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/hello")
def hello():
    return jsonify({
        "message": "Hello World!"
    })
api/uwsgi.ini
[uwsgi]
# ソケット設定
socket=0.0.0.0:8000

# HTTPで実行もできる
# http=0.0.0.0:8000

# 実行するuswgiファイル
wsgi-file=./main.py
# wsgi-fileで実行するアプリケーション
callable=app

# マスターモード指定
master=true

コンテナ立ち上げ

bash実行
cd [projectfolder]
docker compose up -d --build

ざっくり解説

  • pythonが3.13.X になると、uwsgiがインストールできない
    ※ 3.11.7 でもインストール可能なことは確認済み
  • gccを入れないとpipでuwsgiがインストールできない

②Apache経由で接続する

フォルダ構成

こちらを参照

各設定ファイル(上記リンク先からの修正分のみ)

compose.yml ※同一端末内想定
    extra_hosts:
      - host.docker.internal:host-gateway 
conf/httpd.conf ※以下をコメントアウトして、モジュール追加
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
conf/extra/proxy-html.conf ※リバースプロキシ追加設定
<Location /api/>
	ProxyPass uwsgi://host.docker.internal:8000/
    ProxyPassReverse uwsgi://host.docker.internal:8000/
</Location>

確認

http://localhost/api/hello にブラウザで接続して、リクエストしてください。

最後に

Apacheの情報少ない…

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1