🐂
【Hello World⑤】Django @ Python(Apache + mod_wsgi編)
前回作成した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