Déploiement d'un site Django

Le problème exposé dans ce sujet a été résolu.

Bonjour,

J’ai fini de développer un petit site personnel avec Django. J’en suis maintenant à l’étape qui me rebute le plus car je ne l’ai jamais réussie : le déploiement d’un site dynamique sur un serveur web.

Voici ce que j’ai fait pour le moment :

  • J’ai pris un abonnement chez o2switch ;
  • J’ai configuré FileZilla pour pouvoir me connecter au serveur ;
  • J’ai (après une bonne journée de galère) réussi à obtenir l’accès SSH ;
  • En utilisant CPanel, j’ai créé une application Python dont voici la configuration :
Configuration de l'app Python
Configuration de l'app Python

À vrai dire, je ne pense pas que cette dernière étape soit nécessaire et qu’il vaudrait mieux tout faire par SSH. Fin bon. Que dois-je faire ensuite ?

Merci à vous !

Salut, Je ne connais pas o2switch, mais pour déployer un site Django j’avais rédigé (en partie) ceci sur le wiki de mon asso (il faut éventuellement adapter, hésite pas si tu as des questions):

Concernant Django

Pour Django, on doit utiliser le module '’'mod_wsgi’'' :

 sudo a2enmod wsgi

Si le module n’existe pas, il faudra installer le paquet :

 sudo apt-get install libapache2-mod-wsgi

De plus, on doit indiquer à apache de servir vos fichiers static et media. Pour cela il suffit d’ajouter les lignes suivantes dans le fichier du Virtual Host

   Alias /static/ /var/www/monsite/static
   Alias /media/ /var/www/monsite/static

   WSGIDaemonProcess monsite threads=2 display-name=%{GROUP}
   WSGIProcessGroup monsite
   WSGIScriptAlias / /var/www/monsite/monprojet/wsgi.py

à consulter : https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/modwsgi/

[…]

Déploiement d’applications Django dans un Virtualenv

Pour certaines raisons (par exemple faire rager [un nom]), on peut vouloir déployer des sites en Django en utilisant des bibliothèques récentes. Une solution pour cela est d’installer lesdites bibliothèques '’via’' Pip. Le problème prend une autre dimension lorsque l’on souhaite faire cohabiter plusieurs sites avec différentes versions de Python ou de bibliothèques. Un outil très pratique est alors virtualenv. Il permet de créer un environnement Python dédié au site.

Supposons que vous ayez développé '’xxx’'.

Prérequis

  • virtualenv installé
  • Apache avec mod_wsgi installé

Récupération du projet et installation de l’environnement

On va travailler en sudo

 sudo -Es
 cd /var/www
 # On récupère votre site tout beau
 git clone url_de_votre_depot
 # On crée un environnement virtuel dédié au site
 virtualenv env_xxx -p /chemin/vers/python # Par exemple /usr/bin/python3
 # On l'active
 source env_xxx/bin/activate
 # On installe les dépendances. Si vous êtes une personne de qualité qui utilise la puissance de pip freeze,
 pip install -r requirements.txt
 # Vous pouvez vérifier que votre site est prêt à marcher en lançant dans le répertoire du site un
 ./manage.py check

Configuration côté Apache

On va utiliser un virtual host comme décrit dans la section Mise en place de VirtualHost. Par exemple pour xxx.rezometz.org :

 <VirtualHost *:80>
    ServerName xxx.rez
    ServerAlias xxx.rezometz.org xxx
 
    LogLevel info
    ErrorLog ${APACHE_LOG_DIR}/xxx-error.log
    CustomLog ${APACHE_LOG_DIR}/xxx-access.log combined 
  
    <Directory /var/www/xxx>
    Order allow,deny
    Allow from all
    </Directory>
  
    WSGIScriptAlias / /var/www/xxx/xxx/wsgi.py
    WSGIProcessGroup www-data
    WSGIDaemonProcess www-data processes=2 threads=16 maximum-requests=1000 display-name=xxx
 </VirtualHost>

On va ensuite éditer le wsgi.py afin de charger l’environement virtuel. Pour cela on se base sur le wsgi.py que Django a écrit pour nous.

 import os
 import sys
  
 VIRTUALENV_LOC = '/var/www/xxx/env_xxx'
  
 # Activation de l'environnement virtuel
 activate_env=os.path.join(VIRTUALENV_LOC, 'bin/activate_this.py')
 exec(compile(open(activate_env, "rb").read(), activate_env, 'exec'), {'__file__':activate_env})
  
 # Ajout du répertoire du site au PATH
 sys.path.append('/var/www/xxx')
 sys.path.append('/var/www/xxx/xxx')
  
 # Les trucs par défaut de Django
 from django.core.wsgi import get_wsgi_application
  
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxx.settings")
 application = get_wsgi_application()

Pour finir il suffit d’ajouter le site aux enabled et de restart le serveur comme décrit plus haut. Pensez à vérifier les droits sur le répertoire du site.

Salut !

Normalement, il est possible de spécifier l’environnemet Python à utiliser directement dans la configuration d’Apache. Voilà la config que j’utilisais pour Goose (juste un peu modifiée ici, en prod j’ai aussi la configuration du HTTPS sur le port 443). À adapter selon le nom du site et l’emplacement des fichiers bien sur. :)

Dans mon cas, c’était organisé comme ceci.

  • Tous les projets dans /websites/
  • Tout ce qui concerne un même projet dans un dossier : /websites/<nom-du-projet>/.
  • L’environnement virtuel dans /websites/<nom-du-projet>/venv/.
  • Le dossier de Django dans /websites/<nom-du-projet>/<nom-du-projet>/.
<VirtualHost *:80>
        ServerName goose-sear.ch
        ServerAlias www.goose-sear.ch
        ServerAlias localhost

        ErrorLog ${APACHE_LOG_DIR}/goose/error.log
        CustomLog ${APACHE_LOG_DIR}/goose/access.log combined

        # Redirige "goose-sear.ch/static" vers "/websites/goose/goose/static".
        Alias /static /websites/goose/goose/static
        <Directory /websites/goose/goose/static>
            Require all granted
        </Directory>

        <Directory /websites/goose/goose/goose>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>

        # Indique l'environnement Python à utiliser.
        WSGIDaemonProcess goose-sear.ch python-path=/websites/goose/goose python-home=/websites/goose/goose-env
        WSGIProcessGroup goose-sear.ch
        WSGIScriptAlias / /websites/goose/goose/goose/wsgi.py process-group=goose-sear.ch
</VirtualHost>
+3 -0

@klafyvel : Non en effet, il contient juste ceci.

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "goose.settings")

application = get_wsgi_application()

Ça remonte à un moment, mais je crois que je m’étais basé sur ce tuto : https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-apache-and-mod_wsgi-on-ubuntu-14–04

Cela dit, l’exemple que j’ai fourni contient peut-être quelques erreurs ou mauvaises pratiques, j’ai très peu d’expérience en sysadmin (en fait, il s’agissait de ma première mise en prod).

+1 -0

Merci à vous !

J’ai donc suivi vos conseils et avec l’aide du support en plus je m’en suis sorti. Désormais les pages qui ne demandent pas accès à la base de donnée sont servies sans encombre. Vous vous en doutez, j’ai un problème avec ma base de donnée.

Lorsque j’essaye de faire mes migrations ou alors d’accéder à une page qui à besoin de faire des requêtes à la base de donnée, j’obtiens le message suivant :

"Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)"

J’ai donc demandé au support qui m’a répondu:

Cette erreur indique que vous tentez de vous connecter en localhost et non sur <adresse de la bdd>. Il vous faut donc faire les changements nécessaires au niveau de votre code pour pointer sur le bon serveur.

Voici donc mon fichier mysql.cnf :

[client]
database = <database>
host = <adresse de la bdd>
port = 3306
user = <user>
password = <password>
default-character-set = utf8

et voici comment je l’utilise dans mon setup.py :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '../mysql.cnf',
        },
    }
}

Où est l’erreur ? Peut être que ça vient de la variable INTERNAL_IPS qui est toujours sur ['127.0.0.1'] ? Si oui, que dois-je ajouter ?

Merci encore !

Ça vient peut-être pas de là, mais méfies-toi de comment tu indiques le fichier ici :

        'read_default_file': '../mysql.cnf',

Wizix

Essaie d’utiliser os.path.join plutôt. Dans ton settings.py tu as une variable BASE_DIR de laquelle partir. Quelque chose comme

os.path.join(BASE_DIR, "mysql.cnf")

devrait être mieux.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte