linuxtarn.org

Association Tarnaise des Utilisateurs de GNU/LINUX et de Logiciels libres
Contact Calendier Messages diffusés
Visioconférence
  • Comment déployer un projet Django sur un serveur en production ?

    déploiement de Django pour les serveurs et applications Web en python
    denis [Superviseur] 17 octobre 2023 08:45

    WSGI ASGI supervisor nginx daphne gunicorn

    Le déploiement de Django pour les serveurs et applications Web en python:
    • WSGI (Web Server Gateway Interface) application synchrone
      On utilisera alors le paquet gunicorn
    • ASGI (Asynchronous Server Gateway Interface) application asynchrone et synchrone
      On utilisera le paquet daphne
    Dans les 2 cas on utilise supervisor pour lancer le serveur et nginx comme reverse proxy. Dans tous les cas, préparer le serveur (dédié ou VPS).
    Un domaine devra pointer l'adresse publique du serveur ex: shop.domain.com. On accède au serveur par ssh.
    Voici la liste non exhaustive des tâches sur un serveur debian:
    • Le minimum pour compiler et installer des libraries python et outils système
      #> apt -y install build-essential git wget curl unzip python3-venv python3-pip
      #> apt -y install libz-dev libjpeg-dev libfreetype6-dev python-dev
      #> apt -y install supervisor nginx redis openssl libnss3-tools ssl-cert
      #> apt -y install certbot python3-certbot-nginx
      #> apt -y install iptables fail2ban
      #> apt -y install sqlite3
                  
    • On génère la clef dhparam pour compléter la certification
      #> openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
                  
    • Créer un utilisateur shop par ex:
      #> adduser shop
      #> adduser shop www-data (ajouter shop au groupe de nginx)
                  
      Copier par ftp ou git le projet derrière /home/shop
    • On se logue en tant que shop
      #> su - shop
                  
      On se retrouve donc en donc /home/shop
      • Comme en mode développement on installe l'environnement python
        (.venv) $> pip install django gunicorn
      • On modifie le settings.py
        DEGUG = False
        ALLOWED_HOSTS = ['127.0.0.1', 'shop.domain.com']
      • Faire la migration pour créer la base de donées (sqlite3 par défaut):
        (.venv) $> python manage.py migrate
      • Créer le super utilisateur pour l'administration du back end:
        (.venv) $> python manage.py createsuperuser
      • Générer les fichiers de type static
        (.venv) $> python manage.py collectstatic
      • Tout est prêt pour lancer l'application

    Application synchrone

    • Extrait du fichier de configuration de /etc/supervisor/conf.d/demo.conf:
      [program:shop]
      directory = /home/shop
      command=/home/shop/.venv/bin/gunicorn
              --chdir /home/shop/demo
              --bind 127.0.0.1:8000
              --user shop
              --group www-data
              --log-level error
               demo.wsgi:application
      user=root
      stopasgroup=true
      stopsignal=SIGINT
      autostart=true
      autorestart=true
      redirect_stderr=true
      redirect_stdout=true
                  
    • Configurer l'application dans supervisor
      #> supervisorctl reread
      #> supervisorct update
      	       
    • Lancer ou relancer le serveur
      #> supervisorct restart shop
      	       
    • Extrait du fichier de configuration de /etc/nginx/sites-enabled/demo.conf
      # virtualhost
      server {
          if ($host = shop.domain.com) {
              return 301 https://$host$request_uri;
          }
          listen                  80;
          listen                  [::]:80;
          server_name             shop.domain.comg;
          return                  https://$host$request_uri;
      }
      
      server {
          listen                  443 ssl http2;
          listen                  [::]:443 ssl http2;
          server_name             shop.domain.com;
      
          set $base_path          /home/shop;
          keepalive_timeout       5;
          client_max_body_size    4G;
      
          access_log              /var/log/nginx/shop.domain.com-access.log;
          error_log               /var/log/nginx/shop.domain.com-error.log;
          ssl_certificate         /etc/letsencrypt/live/shop.domain.com/fullchain.pem;
          ssl_certificate_key     /etc/letsencrypt/live/shop.domain.com/privkey.pem;
          ssl_dhparam             /etc/letsencrypt/ssl-dhparams.pem;
          include                 /etc/letsencrypt/options-ssl-nginx.conf;
      
          set $root_path          $base_path/demo;
          root $root_path;
      
          location /static/ {
              alias $root_path/staticfiles/;
          }
      
          location /media/ {
              alias $root_path/media/;
          }
      
          location /favicon.ico {
              alias $root_path/staticfiles/img/logo.png;
          }
      
          location /robots.txt {
              alias $root_path/staticfiles/robots.txt;
          }
      
          location / {
              include proxy_params;
              proxy_redirect off;
              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
              proxy_pass http://127.0.0.1:8000;
          }
      }
      	       
    • Lancer ou relancer le serveur
      #> systemctl restart nginx
                 
    • L'application est maintenant disponible en https://shop.domain.com

    Application asynchrone

    Installer daphne dans l'environnement
    $> pip install django daphne
    Il faudra aussi porter daphne en première position de INSTALLED_APPS dans le settings.py
    INSTALLED_APPS = [
        'daphne',
        ...
        ]
            
    • Extrait du fichier de configuration de /etc/supervisor/conf.d/demo.conf
      [program:demo]
      directory = /home/shop
      command=/home/shop/.venv/bin/daphne
              --bind 127.0.0.1
              --port 8000
              --access-log -
              --proxy-headers
               demo.asgi:application
      user=root
      stopasgroup=true
      stopsignal=SIGINT
      autostart=true
      autorestart=true
      redirect_stderr=true
      redirect_stdout=true
                  
    • Configuration nginx comme synchrone

Politique des cookies

Ce site nécéssite l'acceptation préalable des cookies en particulier celui qui permettra de mémoriser votre choix.
En accédant à ce site, vous acceptez implicitement l'utilisation des cookies uniquement nécessaires à l'application.

Logiciels libres

Publications

Vers le haut
Linuxtarn: Association tarnaise des utilisateurs de gnu/linux et logiciels libres. Partenaire de Linuxedu

CONTACT

Veillez compléter la fiche ci-dessous:

Votre demande concerne

captcha Je suis un humain en reproduisant les 4 caractères ci-contre.

×

Guide

Développer ou non les infos avec les commandes suivantes
  • Gauche ou droit
  • Clic sur l'icon du titre des articles
  • Devant un titre signale cette action
Autres infos
  • n Indique le nombre d'éléments