🐃
【Hello World⑥】Django @ Python(Apache + uWSGI編)
前回は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