🐂

【Hello World⑤】Django @ Python(Apache + mod_wsgi編)

2024/04/05に公開

前回作成したDjangoのHello Worldアプリは、Webサーバとして開発用のWebサーバ機能(runserverコマンドで起動するサーバ)を使いました。今回はWebサーバにApacheを使う構成で作ります。
Djangoと同じサーバ(コンテナ)にApacheをインストールし、HTTPのリクエストはApacheで受け付けます。ApacheとDjangoの間のインタフェース(リクエストとレスポンスの受け渡し)にはmod_wsgiを使います。

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

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

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

フォルダ構成
django_apache_wsgi
 ├-web
 │  └-apache2.conf  # Apacheの設定ファイル(②でコンテナからコピー)
 ├─compose.yaml     # コンテナ作成時の指示を記載したファイル
 └─Dockerfile       # イメージ作成時の指示を記載したファイル

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

PowerShell
mkdir django_apache_wsgi  ;`
cd django_apache_wsgi     ;`
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
      - ./web/apache2.conf:/etc/apache2/apache2.conf
      - ./web/log:/var/log/apache2
    working_dir         : /app
    environment:
      - PYTHONUNBUFFERED=1
      - APACHE_RUN_DIR=/var/run/apache2
      - APACHE_PID_FILE=/var/run/apache2/apache2.pid
      - APACHE_RUN_USER=www-data
      - APACHE_RUN_GROUP=www-data
      - APACHE_LOG_DIR=/var/log/apache2
Dockerfile
FROM python:3.12
RUN  apt update \
 &&  apt install -y apache2 apache2-dev \
 &&  mkdir -p /var/run/apache2 \
 &&  pip install --upgrade pip \
 &&  pip install Django==4.2.7 psycopg[binary] mod_wsgi 
CMD ["apache2","-D","FOREGROUND"]

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

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

PowerShell
docker build -t app .; `
docker run --rm -v ${PWD}:/host app `
sh -c 'cp /etc/apache2/apache2.conf /host/web/apache2.conf'

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

Apache2.confの末尾に以下の内容を追記します。Apacheは8000ポートでリクエスト受けて、mod_wsgiに渡します。

django_apache_wsgi/web/apache2.conf
Listen 8000
ServerName localhost:8000
LoadModule wsgi_module /usr/local/lib/python3.12/site-packages/mod_wsgi/server/mod_wsgi-py312.cpython-312-x86_64-linux-gnu.so
WSGIPythonHome /usr/local
WSGIPythonPath /app
<VirtualHost *:8000>
  WSGIScriptAlias / /app/myproject/wsgi.py
  <Directory /app/myproject>
    <Files wsgi.py>
      Require all granted
    </Files>
  </Directory>
</VirtualHost>

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

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

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

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

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

PowerShell
docker compose up -d

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

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

Discussion