djangoの本番環境のために、nginx(Webサーバ+リバースプロキシ)とgunicorn(アプリサーバ)をdockerに用意する
laravel(PHP)の場合は、もともとWebサーバでC言語を動作させたい!という要求から生まれた言語なので、生粋のWebサーバサイド言語。そのため、何もしなくてもWebサーバで動作する。
しかし、pythonは違う。Webサーバで動作する仕組みがない。なのでWebサーバ(nginx)とAPサーバ(gunicorn)が分離している。
[ブラウザ (JavaScript)]
⇅ HTTP通信
[Webサーバ (HTML, PHP)]
⇅ API通信 or リバースプロキシ
[APサーバ (Django, Python)]
⇅ SQL/ORM
[DBサーバ (SQL)]
WSGI(Web Server Gateway Interface)は、インターフェース(仕様)で
そのWSGIを実装したのが、gunicorn(グリーン・ユニコーン)、ガンダム・ユニコーンみたいな字面
0, .envファイルを導入(laravelと違って、djangoには最初から入ってないので自分で導入する必要がある)
同じ値で、.env.exampleファイルも用意しておく
1 2 3 4 5 6 7 8 9 10 |
# Django設定 DJANGO_SECRET_KEY=YOUR_SECRET_KEY_HERE DEBUG=True # DB接続用 DB_NAME=mydb DB_USER=user DB_PASSWORD=password DB_HOST=db DB_PORT=5432 |
1, requirements.txt に gunicorn(pythonアプリサーバ)と.env用ライブラリ を追加
1 2 3 4 |
Django>=5.2 psycopg2-binary>=2.9 gunicorn python-dotenv |
1 2 |
# gunicorn をインストールした状態のDockerイメージを再構築 docker-compose build |
2, Webサーバ(リバースプロキシ)のnginx設定ファイル(nginx/default.conf)を追加
1 2 3 4 5 6 7 8 9 10 |
server { listen 80; server_name localhost; location / { proxy_pass http://web:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } |
2, docker-compose.ymlに、Web(gunicorn), DB(postgre), nginx(リバースプロキシ)を記述する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
services: web: build: . container_name: django_web # command: python manage.py runserver 0.0.0.0:8000 # Dockerfileに記述しているから実は不要? command: gunicorn myproject.wsgi:application --bind 0.0.0.0:8000 volumes: - .:/app expose: - "8000" depends_on: - db db: image: postgres:15 container_name: postgres_db environment: POSTGRES_DB: mydb POSTGRES_USER: user POSTGRES_PASSWORD: password volumes: - postgres_data:/var/lib/postgresql/data nginx: image: nginx:latest container_name: nginx_proxy ports: - "80:80" volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - web volumes: postgres_data: |
Dockerfileの最後のサーバ起動を修正(標準の簡易サーバからgunicorn)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# ベースイメージ FROM python:3.11-slim # 作業ディレクトリを設定 WORKDIR /app # 必要ファイルをコピー COPY requirements.txt . # パッケージインストール RUN pip install --no-cache-dir -r requirements.txt # プロジェクト全体をコピー COPY . . # ポート開放 EXPOSE 8000 # 本番サーバーはgunicornで起動 CMD ["gunicorn", "myproject.wsgi:application", "--bind", "0.0.0.0:8000"] # デフォルトコマンド(サーバ起動) # CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] |
動作を確認
1 2 |
# docker再起動 docker-compose up |