🐃

【Hello World⑥】Django @ Python(Apache + uWSGI編)

2024/04/07に公開

前回はDjangoと同じサーバ(コンテナ)でApacheを動かし、Apacheで受けたリクエストをmod_wsgiを介してDjangoに渡しました。今回はDjangoとは別のサーバ(別のコンテナ)でApacheを動かし、Apacheで受けたリクエストをDjangoに転送する構成で作ります。ApacheとDjangoの間のリクエストとレスポンスの受け渡しにはuWsgiを使います。

Apache + uWsgi + DjangoでPythonのWebアプリを作ります

①フォルダ・ファイルを作成

以下の構成でフォルダとファイルを作ります。

フォルダ構成
django_apache_uwsgi
 ├-web
 |  ├─httpd.conf    #(②でコンテナからコピー)
 |  └-mime.types    #(②でコンテナからコピー)
 ├─compose.yaml     # コンテナ作成時の指示を記載したファイル
 └─Dockerfile       # イメージ作成時の指示を記載したファイル

以下のコマンドでフォルダ・ファイルを作成します。

PowerShell
mkdir django_apache_uwsgi ;`
cd django_apache_uwsgi    ;`
mkdir web                 ;`
New-Item compose.yaml     ;`
New-Item Dockerfile       ;`
code compose.yaml         ;`
code Dockerfile

各ファイルは以下の内容で作成します。

compose.yaml
services:
  app:
    container_name      : django
    build               : .
    ports:
      - 8000:8000
    volumes:
      - ./app:/app
    environment:
      - PYTHONUNBUFFERED=1
    working_dir         : /app
    command             : uwsgi --http :8000 --module myproject.wsgi
  web:
    container_name      : apache
    image               : httpd:2.4
    ports:
      - 8001:8001
    volumes:
     - ./web:/usr/local/apache2/conf
    depends_on:
      - app
Dockerfile
FROM python:3.12
RUN  pip install --upgrade pip && pip install Django==4.2.7 psycopg[binary] uwsgi

②Apacheの設定ファイルを取得

以下のコマンドを実行し、コンテナ内でApacheのイメージ・コンテナを作成して、その際に作られるApacheの設定ファイルをホスト(パソコン)にコピーします。

PowerShell
docker run -it --rm -v .:/host httpd:2.4 `
bash -c "cp /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/mime.types /host/web"

③Apacheの設定ファイルを変更

以下のコマンドでhttpd.confを開き、待ち受けポートを80から8001に変更し、8000に転送する設定に変更します。

PowerShell
code web/httpd.conf
django_apache_wsgi/web/httpd.conf
#待ち受けポートを80から8001に変更
Listen 8001
django_apache_wsgi/web/httpd.conf
#末尾に追加
ServerName localhost
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyRequests    On
ProxyPass        / http://app:8000
ProxyPassReverse / http://app:8000

④Djangoのプロジェクトを作成

以下のコマンドを実行し、Djangoのプロジェクトを作ります。

PowerShell
docker compose run --rm app sh -c 'django-admin startproject myproject .'

⑤Djangoの設定ファイルを変更

以下のコマンドでDjangoの設定ファイルsettings.pyを開き、ALLOWED_HOSTSの設定値を変更します。

PowerShell
code app/myproject/settings.py
app/myproject/settings.py
ALLOWED_HOSTS = ['app','localhost']

⑥Apache + Djangoのコンテナを起動

以下のコマンドを実行し、Apache + Djangoのコンテナを起動します。

PowerShell
docker compose up -d

⑦HelloWorldが表示されることを確認

Apache(http://localhost:8001)に接続して、Djangoのロケットが表示されることを確認します。
※Django(http://localhost:8000)に直接接続しても、Djangoのロケットが表示されます。

Discussion