🐃

【Hello World⑦】Django @ Python(nginx + Gunicorn編)

2024/04/09に公開

前回前々回はDjangoのWebサーバにApacheを使いました。今回はWebサーバにnginxを使います。nginxとDjangoのインタフェースにはgunicornを使います。

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

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

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

フォルダ構成
django_nginx_gunicorn
 ├-web
 |  └─nginx.conf
 ├─compose.yaml     # コンテナ作成時の指示を記載したファイル
 └─Dockerfile       # イメージ作成時の指示を記載したファイル

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

PowerShell
mkdir django_nginx_gunicorn ;`
cd django_nginx_gunicorn    ;`
mkdir web                   ;`
New-Item compose.yaml       ;`
New-Item Dockerfile         ;`
New-Item web/nginx.conf     ;`
code compose.yaml           ;`
code Dockerfile             ;`
code web/nginx.conf

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

compose.yaml
services:
  app:
    container_name      : django
    build               : .
    ports:
      - 8000:8000
    volumes:
      - ./app:/app
    environment:
      - PYTHONUNBUFFERED=1
    working_dir         : /app
    command             : gunicorn myproject.wsgi --bind 0.0.0.0:8000
  web:
    container_name      : nginx
    image               : nginx:1.25.3
    ports:
      - 8001:8001
    volumes:
      - ./web:/etc/nginx/conf.d
    depends_on:
      - app
Dockerfile
FROM python:3.12
RUN  pip install --upgrade pip && pip install Django==4.2.7 psycopg[binary] gunicorn
nginx.conf
upstream django {
  server app:8000;  # djangoのサービス名とポート
}
server {
  listen 8001;      # nginxの待ち受けポート
  location / {
    proxy_pass http://django;    # リクエストをdjangoに転送
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_redirect off;
  }
}

②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 = ['localhost']

④nginx + Djangoのコンテナを起動

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

PowerShell
docker compose up -d

⑤Djangoのデフォルト画面が表示されることを確認

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

※Django(http://localhost:8000)に直接接続しても、Djangoのロケットが表示されます。

Discussion