Se hai un'app Django con Gunicorn e il servizio si blocca inaspettatamente, ci sono diverse soluzioni che puoi adottare per rilevare e mitigare il problema. Ecco alcune opzioni:
1. Configurare Gunicorn come Servizio di Systemd
Se Gunicorn non è già configurato come servizio di systemd
, fallo. Questo ti consente di utilizzare funzionalità come il riavvio automatico. Ecco un esempio di file di servizio:
sudo nano /etc/systemd/system/gunicorn.service
Contenuto del file:
[Unit]
Description=Gunicorn instance to serve Django After=network.target
[Service]
User=youruser
Group=yourgroup
WorkingDirectory=/path/to/your/django/project
ExecStart=/path/to/your/venv/bin/gunicorn --workers 3 --bind unix:/path/to/your/django/project.sock your_project.wsgi:application
Restart=always
RestartSec=3
Environment="PATH=/path/to/your/venv/bin"
[Install]
WantedBy=multi-user.target
- Chiave importante:
Restart=always
fa sì che il servizio venga riavviato automaticamente se si arresta.
Poi attiva e avvia il servizio:
sudo systemctl enable gunicorn sudo systemctl start gunicorn
2. Usare un Processo Supervisor
Strumenti come Supervisor o systemd possono monitorare Gunicorn e riavviarlo automaticamente in caso di arresto.
Per installare Supervisor:
sudo apt update sudo apt install supervisor
Configurare Gunicorn in Supervisor:
sudo nano /etc/supervisor/conf.d/gunicorn.conf
Contenuto del file:
[program:gunicorn]
command=/path/to/your/venv/bin/gunicorn --workers 3 --bind unix:/path/to/your/django/project.sock your_project.wsgi:application directory=/path/to/your/django/project user=youruser
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn.err.log
stdout_logfile=/var/log/gunicorn.out.log
Riavvia Supervisor:
bash
CopiaModifica
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start gunicorn
3. Configurare un Health Check con un Monitor
Puoi impostare un health check per il sito web e monitorarlo con uno strumento come:
- UptimeRobot (cloud-based)
- Nagios (on-premises)
- Prometheus con Alertmanager (monitoraggio avanzato)
Ad esempio, un health check periodico potrebbe verificare se l'URL del tuo sito è raggiungibile.
Esempio di script semplice:
Crea uno script in /usr/local/bin/check_gunicorn.sh
:
#!/bin/bash
if ! curl -s --head http://127.0.0.1 | grep "200 OK" > /dev/null; then echo "Gunicorn down! Restarting..." systemctl restart gunicorn fi
Rendi lo script eseguibile:
chmod +x /usr/local/bin/check_gunicorn.sh
E pianifica un cron job per eseguirlo ogni minuto:
crontab -e
Aggiungi:
* * * * * /usr/local/bin/check_gunicorn.sh
4. Gestire il Carico con un Reverse Proxy (Nginx o Apache)
Se usi Nginx come reverse proxy, puoi configurare un comportamento di fallback per gestire il carico e ridurre i downtime:
Configurazione di Nginx:
Aggiungi una direttiva per verificare se il socket di Gunicorn è attivo:
nginx
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://unix:/path/to/your/django/project.sock;
proxy_read_timeout 60s;
proxy_connect_timeout 60s;
error_page 502 = @fallback;
}
location @fallback {
return 503;
}
}
Riavvia Nginx:
sudo systemctl restart nginx
5. Abilitare il Logging e il Debug
Analizzare i log può aiutarti a identificare il problema.
- Gunicorn:
journalctl -u gunicorn
- Nginx (se usato):
sudo tail -f /var/log/nginx/error.log
6. Scalare con un Load Balancer
Se il sito ha molto traffico, considera di scalare Gunicorn con più worker o bilanciando il carico su più server. Configura Gunicorn con più worker:
gunicorn --workers 4 --bind unix:/path/to/your/project.sock your_project.wsgi:application
7. Usare una Soluzione Cloud
Piattaforme come AWS Elastic Beanstalk, Google Cloud Run, o Heroku possono gestire automaticamente la disponibilità e il riavvio delle tue applicazioni.
Hai già una configurazione particolare o preferiresti implementare uno dei metodi sopra? 😊
Iscriviti alla nostra newsletter
Iscriviti alla nostra newsletter per non perderti nessuna novità!