Deploy in Produzione
Il deploy di unâapplicazione Django in produzione richiede una serie di configurazioni specifiche per garantire sicurezza, prestazioni e stabilita. In questa guida vedremo come preparare il progetto per la produzione utilizzando Gunicorn, Nginx e le impostazioni di sicurezza raccomandate.
Checklist di Produzione
Django include un comando per verificare le impostazioni di sicurezza:
python manage.py check --deploy
Questo comando segnala potenziali problemi nella configurazione di produzione.
Impostazioni Fondamentali
# settings.py (produzione)
import os
DEBUG = False
ALLOWED_HOSTS = ["miosito.com", "www.miosito.com"]
SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY")
Non usare mai DEBUG = True in produzione: espone informazioni sensibili e consuma piu risorse.
Variabili dâAmbiente
Usa variabili dâambiente per le configurazioni sensibili. Il pacchetto django-environ semplifica la gestione:
pip install django-environ
# settings.py
import environ
env = environ.Env()
environ.Env.read_env(BASE_DIR / ".env")
SECRET_KEY = env("DJANGO_SECRET_KEY")
DEBUG = env.bool("DJANGO_DEBUG", default=False)
ALLOWED_HOSTS = env.list("DJANGO_ALLOWED_HOSTS", default=[])
DATABASES = {
"default": env.db("DATABASE_URL"),
}
File .env di esempio:
DJANGO_SECRET_KEY=la-tua-chiave-segreta-molto-lunga
DJANGO_DEBUG=False
DJANGO_ALLOWED_HOSTS=miosito.com,www.miosito.com
DATABASE_URL=postgres://utente:password@localhost:5432/mio_database
Configurazione del Database
In produzione, usa PostgreSQL invece di SQLite:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": os.environ.get("DB_NAME"),
"USER": os.environ.get("DB_USER"),
"PASSWORD": os.environ.get("DB_PASSWORD"),
"HOST": os.environ.get("DB_HOST", "localhost"),
"PORT": os.environ.get("DB_PORT", "5432"),
}
}
File Statici con WhiteNoise
WhiteNoise permette a Django di servire i file statici direttamente, senza bisogno di Nginx per gli static:
pip install whitenoise
# settings.py
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"whitenoise.middleware.WhiteNoiseMiddleware", # Subito dopo SecurityMiddleware
# ...
]
STATIC_URL = "/static/"
STATIC_ROOT = BASE_DIR / "staticfiles"
STORAGES = {
"staticfiles": {
"BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
},
}
Raccogli tutti i file statici:
python manage.py collectstatic --noinput
WSGI con Gunicorn
Gunicorn e il server WSGI consigliato per Django in produzione:
pip install gunicorn
Avvia lâapplicazione:
gunicorn mio_progetto.wsgi:application --bind 0.0.0.0:8000 --workers 3
Il numero di worker consigliato e (2 * CPU) + 1.
ASGI con Uvicorn
Per applicazioni asincrone, usa Uvicorn come server ASGI:
pip install uvicorn
uvicorn mio_progetto.asgi:application --host 0.0.0.0 --port 8000 --workers 3
Configurazione Nginx
Nginx funziona come reverse proxy davanti a Gunicorn:
server {
listen 80;
server_name miosito.com www.miosito.com;
location /static/ {
alias /percorso/progetto/staticfiles/;
expires 30d;
}
location /media/ {
alias /percorso/progetto/media/;
expires 30d;
}
location / {
proxy_pass http://127.0.0.1:8000;
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;
}
}
Impostazioni di Sicurezza
# settings.py (produzione)
# HTTPS
SECURE_SSL_REDIRECT = True
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
# Cookie sicuri
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
# Protezione HSTS
SECURE_HSTS_SECONDS = 31536000 # 1 anno
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
# Altre protezioni
SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = "DENY"
Service Systemd
Crea un servizio systemd per avviare Gunicorn automaticamente:
# /etc/systemd/system/django-app.service
[Unit]
Description=Django Application (Gunicorn)
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/percorso/progetto
ExecStart=/percorso/venv/bin/gunicorn mio_progetto.wsgi:application --bind 127.0.0.1:8000 --workers 3
Restart=always
EnvironmentFile=/percorso/progetto/.env
[Install]
WantedBy=multi-user.target
Abilita e avvia il servizio:
sudo systemctl enable django-app
sudo systemctl start django-app
Conclusione
Il deploy di Django in produzione richiede attenzione a sicurezza, prestazioni e affidabilita. Usa DEBUG=False, configura ALLOWED_HOSTS, proteggi le credenziali con variabili dâambiente e attiva tutte le impostazioni di sicurezza HTTPS. Con Gunicorn come server WSGI, Nginx come reverse proxy e WhiteNoise per i file statici, avrai una configurazione solida e pronta per gestire il traffico reale.