Chuyển đến nội dung chính

第 20 課:生產部署與監控

部署 Django + Nginx + Gunicorn。 Sentry 錯誤追蹤、結構化日誌記錄。 Prometheus 指標、Grafana 儀表板。 Django 健康檢查、擴展策略、零停機部署。

💻 程式設計 — 第 20 課 第 20 課:生產部署與監控

Django:從基礎到高級

第 5 部分:測試、部署和生產

亞洲開發網

1.Nginx+Gunicorn

upstream django {
    server web:8000;
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

    client_max_body_size 10M;

    location /static/ {
        alias /app/staticfiles/;
        expires 30d;
    }

    location /media/ {
        alias /app/media/;
    }

    location / {
        proxy_pass http://django;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
# gunicorn.conf.py
import multiprocessing

bind = '0.0.0.0:8000'
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'gthread'
threads = 2
timeout = 120
accesslog = '-'
errorlog = '-'
loglevel = 'info'

2.哨兵錯誤追蹤

pip install sentry-sdk
import sentry_sdk

sentry_sdk.init(
    dsn=os.environ['SENTRY_DSN'],
    traces_sample_rate=0.1,
    profiles_sample_rate=0.1,
    environment=os.environ.get('ENVIRONMENT', 'production'),
)

3. 結構化日誌記錄

# settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'json': {
            '()': 'pythonjsonlogger.jsonlogger.JsonFormatter',
            'format': '%(asctime)s %(name)s %(levelname)s %(message)s',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'json',
        },
    },
    'loggers': {
        'django': {'handlers': ['console'], 'level': 'WARNING'},
        'apps': {'handlers': ['console'], 'level': 'INFO'},
    },
}

4. 健康檢查

pip install django-health-check
INSTALLED_APPS = [
    ...,
    'health_check',
    'health_check.db',
    'health_check.cache',
    'health_check.contrib.celery',
    'health_check.contrib.redis',
]

urlpatterns = [
    path('health/', include('health_check.urls')),
]

5.普羅米修斯和格拉法納

pip install django-prometheus
INSTALLED_APPS = [..., 'django_prometheus']
MIDDLEWARE = [
    'django_prometheus.middleware.PrometheusBeforeMiddleware',
    ...
    'django_prometheus.middleware.PrometheusAfterMiddleware',
]

urlpatterns = [
    path('', include('django_prometheus.urls')),
]

6. 零停機部署

#!/bin/bash
# deploy.sh
set -e
git pull origin main
docker compose build web
docker compose up -d --no-deps web
docker compose exec web python manage.py migrate --noinput
docker compose exec web python manage.py collectstatic --noinput
# Restart workers gracefully
docker compose exec web kill -HUP 1
echo "Deploy completed!"

恭喜您完成系列 Django:從基礎到高級! 🎉