Forum Programmation.python Déployer une application Django avec apache et mod_wsgi

Posté par (page perso) . Licence CC by-sa
0
10
déc.
2016

Bonjour à tous, j'ai développé une application Django qui permet de voir et convertir des modèles 3D dans différents formats.
L'application se sert de FreeCAD et quelques autre librairies ( python-collada (.dae), ifcopenshell (.ifc) ).

Le code source est sur https://framagit.org/freecad-france/FreeCADxConvert

J'ai développé l'application sur un serveur distant sur Ubuntu 16.04 et la version de Django est celle proposé par les dépôts d'Ubuntu (donc Django version 1.8.7 et python version 2.7.12).

Ça fonctionne plutôt bien avec le serveur de développement mais j'ai un problème pour déployer mon application avec apache ( version 2.4.18 ) et mod_wsgi (version 4.3.0).
Pour formuler autrement, lorsque j’exécute la commande suivante avec mon user "normal"

python manage.py runserver 0.0.0.0:9500 

L'application est bien accessible et pleinement fonctionnelle à l'adresse freecad-france.com:9500

Pour déployer voilà ce que je fais :
Je clone le code source dans /var/www/html/

sudo git clone https://framagit.org/freecad-france/FreeCADxConvert.git FxC

J'attribue les droits nécessaire à www-data pour ce dossier

sudo chown -R :www-data FxC

Je modifie le fichier settings.py et je passe l'option DEBUG à False

Je lance la commande :

sudo python manage.py migrate

Ensuite je créé le fichier vhost (fxc.conf) pour apache ( dans /etc/apache2/site-available ) :

<VirtualHost *:80>
        ServerName fxc.freecad-france.com
        ServerAlias www.fxc.freecad-france.com
        ServerAdmin contact@freecad-france.com

        DocumentRoot /var/www/html/FxC

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

        #Django conf
        Alias /static/ /var/www/html/FxC/appFxC/static/
        Alias /media/ /var/www/html/FxC/FxC/media/

        WSGIDaemonProcess daemon-fxc user=www-data group=www-data
        WSGIProcessGroup daemon-fxc
        WSGIScriptAlias / /var/www/html/FxC/FxC/wsgi.py

        <Directory /var/www/html/FxC/FxC>
                Order deny,allow
                Allow from all
        </Directory>

        <Location "/media/">
                SetHandler None
        </Location>

</VirtualHost>

J'ai écrit le vhost à partir de divers exemples trouvé sur le net.
Et pour finir j'active le vhost et je relance apache:

sudo a2ensite fxc
sudo systemctl restart apache2

Maintenant si je tente d'accéder à fxc.freecad-france.com et bien… le comportement est aléatoire :/
Une fois ou deux ça à marché un peu, j'accède à la page index mais ça bug quand je tente d'uploader avec une erreur 500.
Des fois ça mouline pendant plusieurs seconde pour finir sur une erreur 500 et parfois 504.

error-django.log retourne :

[Sat Dec 10 15:06:10.653321 2016] [wsgi:error] [pid 7864] [client 2a01:e35:8a2d:c6b0:35af:8f1:905b:3244:51472] Timeout when reading response headers from daemon process 'daemon-fxc': /var/www/html/FxC/FxC/wsgi.py
[Sat Dec 10 15:06:16.537746 2016] [wsgi:error] [pid 7815] [client 2a01:e35:8a2d:c6b0:35af:8f1:905b:3244:51484] Truncated or oversized response headers received from daemon process 'daemon-fxc': /var/www/html/FxC/FxC/wsgi.py

acces-django.log retourne plusieurs ligne du genre :

::1 - - [10/Dec/2016:15:06:40 +0000] "OPTIONS * HTTP/1.0" 200 126 "-" "Apache/2.4.18 (Ubuntu) OpenSSL/1.0.2g mod_wsgi/4.3.0 Python/2.7.12 (internal dummy connection)"
::1 - - [10/Dec/2016:15:06:41 +0000] "OPTIONS * HTTP/1.0" 200 126 "-" "Apache/2.4.18 (Ubuntu) OpenSSL/1.0.2g mod_wsgi/4.3.0 Python/2.7.12 (internal dummy connection)"

Déjà merci d'avoir lu jusqu'ici :)
Je recherche donc de l'aide pour déployer cette application (comme ça je pourrais en faire un journal ;)

  • # Attends lundi...

    Posté par . Évalué à 2.

    Je serai au boulot, je t'enverrai une copie de mes wgsgi / config apache… J'en ai quelques uns qui tournent, des apache + wsgi + django :)

    La méthode est la suivante (de mémoire):

    • faire un virtualenv sur le serveur, y déployer les dépendances du projet (django,…)
    • dans le wsgi.py :

      • enregistrer le dossier python/site-packages dans la variable d'environnement PYTHONPATH avec addsitedir
      • enregistrer le dossier source du projet
      • charger django, lancer application
    • Dans le fichier de conf apache2 :

      • Ne pas oublier de préciser le nombre de process / thread pour mod_wsgi. En géréral, je mets 8 process et 1 thread pour une application (les threads c'est mal, ça a tendance à déborder…) avec les directive processes / threads dans la ligne WSGIDaemonProcess

    Voila, c'est juste pour patienter…

  • # port salut, c'est marqué dessus.

    Posté par . Évalué à 3.

    dans tes logs d'erreurs
    tu as

    Timeout when reading response headers from daemon process 'daemon-fxc': /var/www/html/FxC/FxC/wsgi.py

    en gros apache n'attend pas assez longtemps que ton process wsgi.py renvoie ses reponses
    soit faut que ton python tourne plus vite, soit qu'apache soit plus patient

    Truncated or oversized response headers received from daemon process 'daemon-fxc': /var/www/html/FxC/FxC/wsgi.py

    là encore c'est marqué dessus, ton django renvoie des données partielles ou trop grosses pour que ca rentre dans le buffer de wsgi
    il faut soit revoir comment fonctionne ton appli pour que les donnees soient plus petit, soit augmenté la taille du buffer wsgi.

    sinon une autre piste qui est celle qu'on avait mis en place dans mon ancien boulot
    - demarrer le serveur django comme un servir normal, comme tu le faisais en test, sur le port 8000
    - configurer apache pour juste faire reverse proxy et recevoir le publique sur le port 80 et 443, pour renvoyer ensuite les requetes à 127.0.0.1:8000 (ton process django)

    • [^] # Re: port salut, c'est marqué dessus.

      Posté par . Évalué à 3.

      en gros apache n'attend pas assez longtemps que ton process wsgi.py renvoie ses reponses
      soit faut que ton python tourne plus vite, soit qu'apache soit plus patient

      pas forcément. apache attend des données sur la sortie standard du process fils. Si apache n'a pas de réponse, ça peut aussi être parce que le fils s'est vautré, ou ne produit pas une sortie au format attendu par apache (manque de saut de ligne après les en-tête http, lignes de log du process redirigées vers la sortie standard, …). Et bien sûr, ça peut être que le traitement est trop long comme tu le mentionnes.

      Le fait qu'il y ait des messages d'erreur différents selon les cas, ça pourrait aussi être que le process fils renvoie du junk, mais que de temps en temps, ça ressemble suffisamment à ce qu'apache attend pour qu'il lise une taille random (et du coup, ça marche pas).

      Ça serait intéressant de voir le détail de ce que le process wsgi produit comme sortie.

  • # deployment checklist

    Posté par (page perso) . Évalué à 3.

    manifestement tu n'as pas lut la deployment checklist vu que la clé secrète est en clair dans ton repository

    commence par l'appliquer

    https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.