Django-fr

Forum

#1 09-06-2012 11:31:18

alastor
Membre
Inscription : 09-06-2012
Messages : 4

Déploiement sur serveur dédié ovh

Bonjour à tous

Après avoir passé plusieurs jours à développer mon application Django, vient maintenant le temps de la déployer.
J'ai donc suivi la doc afin de déployer mon site avec apache et mod_wsgi sur mo serveur dédié ovh (https://docs.djangoproject.com/en/1.4/h … i/modwsgi/)
J'ai rencontré pas mal de problèmes, que j'ai pu résoudre petit à petit.

Malheureusement le dernier en date me bloque :  lorsque j'essaie d'accéder à mon site, j'ai une erreur 500 "internal server error"
En consultant le error_log j'ai une erreur : ImportError: Could not import settings 'mysite.settings' (Is it on sys.path? Does it have syntax errors?): No module named settings

J'ai pourtant :
-bien installé python 2.7
-bien installé django
-Essayé depuis mon serveur un python manage.py runserver, et le serveur de test se lance correctement
-Consulté une erreur semblable sur stackoverflow.com, mais la solution ne fonctionne pas pour moi (http://stackoverflow.com/questions/4755 … -not-found)
-Essayé de boire une bière en regardant fixement mon écran

... mais je bloque


Du coup, je me demandais si quelqu'un a déja déployé une application django sur un dédié OVH via mod_wsgi, et aurait une doc des différentes étapes, ou quelques conseils à me donner...

Je sais qu'il existe des hébergeurs spécialisés (alwaysdata etc), mais j'aimerais vraiment faire fonctionner mon application sur mon dédié dans un premier temps

Merci beaucoup

Hors ligne

#2 09-06-2012 13:24:07

quinode
Membre
Lieu : Auvergne
Inscription : 14-10-2010
Messages : 89
Site Web

Re : Déploiement sur serveur dédié ovh

tu peux nous poster ta config wsgi ?
un fix classique à cette erreur pour moi était d'ajouter au PATH non seulement de dossier du projet mais aussi le dossier qui *contient* le projet

Hors ligne

#3 09-06-2012 13:25:41

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Déploiement sur serveur dédié ovh

Salut,

L'exception qui t'es remonté est un problème d'importation d'un module (en
l'occurence mysite.settings) par Python, donc ne cherche pas ailleurs c'est un
problème de résolution du chemin vers ton module depuis ton instance WSGI.

Pour qu'il puisse résoudre le chemin, il faut que tu ais le module "mysite"
accessible depuis ton PYTHONPATH, si ce n'est pas le cas et que tu ne
souhaites pas l'y ajouter, il faut alors que tu l'ajoutes à la volée dans ton
"*.wsgi" pour qu'il puisse le trouver :

    sys.path.append('/path/to/my/projects')
    os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

Où "/path/to/my/projects" est le chemin (sans slash de fin!) vers le répertoire
qui contient le module "mysite" qui contient tes settings.

Évidemment le répertoire "mysite" doit contenir un "__init__.py" mais si ce
n'était pas le cas tu aurais eu des exceptions pendant ton développement.

Note bien qu'en général ton vhost est lancé par un utilisateur (root, nobody,
wwwdata, etc..) qui ne bénéficie pas du PYTHONPATH de l'user avec lequel tu
développes ton projet, c'est pourquoi il vaut mieux éviter de se reposer sur
le PYTHONPATH et le spécifier clairement dans ton "*.wsgi" avec un
"sys.path.append(...)".

Tu peux tester que la résolution est correct, en te connectant avec un autre
utilisateur que celui avec lequel tu développes, par exemple root, tu lances
l'interpéteur Python et tu essayes d'importer le module :

>> sys.path.append('/path/to/my/projects')
>> from mysite import settings

Si ça fonctionne c'est que la résolution est correcte.

Je déploies des applications Django à tour de bras chez OVH en serveur dédié
depuis longtemps sans aucun soucis, par contre j'utilise FastCGI mais le
principe reste identique. Bref pas besoin d'hébergeur spécialisé, en général
c'est surtout pour du mutualisé qu'on va vers ce genre de solution.

Si ça ne marche toujours pas, donne nous plus de détails (fichier *.wsgi, vhost
apache, arborescence de où se trouve ton projet, etc..).

PS: en général on évite d'utiliser "settings.py" comme fichier de settings en
production, on le réserve pour le développement et on en hérite dans un
"prod_settings.py" (ou un autre nom si tu veux) où on y ajuste les settings
nécessaires pour utiliser le projet en production.

Hors ligne

#4 10-06-2012 17:38:46

alastor
Membre
Inscription : 09-06-2012
Messages : 4

Re : Déploiement sur serveur dédié ovh

Merci beaucoup pour vos réponses.
De mémoire j'avais bien inclus le sys.path.append('/path/to/my/projects') dans mon fichier wsgi, mais à force de faire des tests, installer, désinstaller des packages, changer des fichiers de config, etc je pense que j'ai mis un peu le bazar sur mon serveur.
Du coup avant toute chose je vais le réinstaller proprement, et essayer de déployer à nouveau en suivant vos conseils. Si je galère toujours (ce qui sera vraisemblablement le cas), je posterai ma config détaillée.

A bientôt donc

PS : @David : Vu que tu maitrises le déploiement chez ovh : pour être tout à fait exact, le serveur sur lequel j'essaie de déployer n'est pas un dédié, mais un RPS, avec la "release 2" d'ovh, mais je ne pense pas que ca puisse poser un pb?

Hors ligne

#5 10-06-2012 17:50:06

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Déploiement sur serveur dédié ovh

Non aucun soucis, rps ou dédié c'est relativement pareil.

Hors ligne

#6 11-06-2012 15:17:06

alastor
Membre
Inscription : 09-06-2012
Messages : 4

Re : Déploiement sur serveur dédié ovh

Bonjour,

Comme prévu, après réinstall. propre de mon serveur, j'ai essayé de déployer à nouveau mon application ... sans succès. J'ai toujours une "erreur 500" lorsque je me rends à l'adresse de mon projet

-------------- Le contenu de mon fichier wsgi : --------
import site
import sys
import os

DIRS = ['/home/my_websites']
for directory in DIRS:
    site.addsitedir(directory)
    sys.path.insert(0, directory)

root = os.path.join(os.path.dirname(__file__))

sys.path.insert(0, root)
os.environ['DJANGO_SETTINGS_MODULE']='mon_site.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
--------------------------------------------------------------


Ci-dessous, le contenu de mon error_log :

[Mon Jun 11 15:57:00 2012] [notice] suEXEC mechanism enabled (wrapper: /usr/local/apache/bin/suexec)
[Mon Jun 11 15:57:00 2012] [notice] Apache/2.2.20 (Unix) mod_ssl/2.2.20 OpenSSL/0.9.8o mod_wsgi/3.3 Python/2.4.4 configured -- resuming normal operations
[Mon Jun 11 15:57:04 2012] [error]  mod_wsgi (pid=27543): Target WSGI script '/home/my_websites/mon_site/wsgi/wsgi.py' cannot be loaded as Python module.
[Mon Jun 11 15:57:04 2012] [error]  mod_wsgi (pid=27543): Exception occurred processing WSGI script '/home/my_websites/mon_site/wsgi/wsgi.py'.
[Mon Jun 11 15:57:04 2012] [error]  Traceback (most recent call last):
[Mon Jun 11 15:57:04 2012] [error]  File "/home/my_websites/mon_site/wsgi/wsgi.py", line 15, in ?
[Mon Jun 11 15:57:04 2012] [error]  import django.core.handlers.wsgi
[Mon Jun 11 15:57:04 2012] [error]  ImportError: No module named django.core.handlers.wsgi


En voyant "No module named django.core" j'ai pensé que le système ne trouve pas Django dans le path.
Du coup j'ai ajouté dans mon fichier wsgi la ligne :

sys.path.append('/usr/local/lib/python2.7/site-packages')


Après cela, j'ai toujours une erreur 500, mais un peu différente :
[Mon Jun 11 16:05:27 2012] [error] [client 109.164.243.26] mod_wsgi (pid=27540): Target WSGI script '/home/my_websites/mon_site/wsgi/wsgi.py' cannot be loaded as Python module.
[Mon Jun 11 16:05:27 2012] [error] [client 109.164.243.26] mod_wsgi (pid=27540): Exception occurred processing WSGI script '/home/my_websites/mon_site/wsgi/wsgi.py'.
[Mon Jun 11 16:05:27 2012] [error] [client 109.164.243.26] Traceback (most recent call last):
[Mon Jun 11 16:05:27 2012] [error] [client 109.164.243.26]   File "/home/my_websites/mon_site/wsgi/wsgi.py", line 16, in ?
[Mon Jun 11 16:05:27 2012] [error] [client 109.164.243.26]     import django.core.handlers.wsgi
[Mon Jun 11 16:05:27 2012] [error] [client 109.164.243.26]   File "/usr/local/lib/python2.7/site-packages/django/__init__.py", line 15
[Mon Jun 11 16:05:27 2012] [error] [client 109.164.243.26]      parts = 2 if version[2] == 0 else 3
[Mon Jun 11 16:05:27 2012] [error] [client 109.164.243.26]                 ^
[Mon Jun 11 16:05:27 2012] [error] [client 109.164.243.26]  SyntaxError: invalid syntax


D'origine, mon serveur était équipé de Python 2.4, et j'ai du installer python2.7 pour pouvoir faire mon install de Django. Mon problème n'aurait-il pas un lien avec ca?

Quelqu'un aurait une idée?
Merci

Dernière modification par alastor (11-06-2012 15:25:59)

Hors ligne

#7 11-06-2012 15:57:10

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Déploiement sur serveur dédié ovh

C'est étrange ton dernier log semble lever une exception de syntaxe invalide
sur "django/__init__.py" ce qui me semble assez étrange.. ce ne serait pas une
version modifiée ?

Et sinon le support de Python 2.4 a été droppé depuis quelques temps,
Django1.4 nécessite effectivement Python 2.6 au minimum.

Hors ligne

#8 11-06-2012 17:36:32

alastor
Membre
Inscription : 09-06-2012
Messages : 4

Re : Déploiement sur serveur dédié ovh

Non c'est un django tout  fait normal que j'ai récupéré depuis www.djangoproject.com

A toutes fin utiles, je copie / colle ci-dessous les étapes que j'ai suivies (dans l'ordre) depuis la réinstall de mon serveur :
Comme tu peux voir, j'ai installé Python 2.7 et ensuite, j'ai installé Django en appelant explicitement Python 2.7 : sudo python2.7 setup.py install    car quand je tape "python" dans le shell, ca me lance python 2.4
Je ne sais pas si cela a une incidence?

Merci d'avance


============== INSTALLER setuptools ========
wget http://pypi.python.org/packages/source/ … c11.tar.gz
tar xzvf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
python setup.py install
=============================================

============== INSTALLER virtualenv ==========
easy_install virtualenv
virtualenv my_websites
source my_websites/bin/activate
==============================================

============== INSTALLER mysql python ========
easy_install mysql-python
==============================================

============== INSTALLER pil ========
easy_install pil
=====================================

============ INSTALLER python 2.7 ===
wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tgz
tar xzvf Python-2.7.3.tgz
cd Python-2.7.3
./configure
make
make install
======================================

========= INSTALLER django =====
wget https://www.djangoproject.com/download/1.4/tarball
tar xzvf Django-1.4.tar.gz
cd Django-1.4
sudo python2.7 setup.py install
================================

== INSTALLER mod_wsgi POUR APACHE ===========
wget http://modwsgi.googlecode.com/files/mod_wsgi-3.3.tar.gz
tar xzvf mod_wsgi-3.3.tar.gz
cd mod_wsgi-3.3
./configure --with-apxs=/usr/local/apache/bin/apxs
make
make install
=============================================


vi /usr/local/apache/conf/httpd.conf

--------------- Dans la section LoadModule du Httpd.conf ajouter ------
LoadModule wsgi_module modules/mod_wsgi.so
-----------------------------------------------------------------------

---------------  Dans httpd.conf ajouter à la fin : ----------
WSGIScriptAlias /mon_site /home/mon_site/wsgi/wsgi.py
<Directory /home/mon_site/>
    Order deny,allow
    Allow from all
</Directory>
--------------------------------------------------------------

-------------- Créer un fichier wsgi.py pour test --------
def application(environ, start_response):
    status = '200 OK'
    output = 'Hello Django'
    response_headers = [('Content-type', 'text/plain'),
    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]
--------------------------------------------------------------

<redémarrer Apache>

Se rendre à l'adresse http://XXXXX.ovh.net/mon_site et vérifier que mod_wsgi et apache tournent (la page affiche Hello Django)


-------------- Remplacer le contenu du fichier wsgi de test par --------
import site
import sys
import os

sys.path.append('/usr/local/lib/python2.7/site-packages')

DIRS = ['/home/my_websites']
for directory in DIRS:
    site.addsitedir(directory)
    sys.path.insert(0, directory)

root = os.path.join(os.path.dirname(__file__))

sys.path.insert(0, root)
os.environ['DJANGO_SETTINGS_MODULE']='mon_site.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
--------------------------------------------------------------

Hors ligne

#9 11-06-2012 18:05:30

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Déploiement sur serveur dédié ovh

Ah si tu installé une version de Python en parallèle et que c'est pas celui
configuré par défaut sur ton système (eg accessible directement pas la commande
"python") c'est fort probablement Python2.4 qui est utilisé par wsgci pour
lancer ta webapp.

Tu devrais au moins vérifier ce point déjà.

Hors ligne

Pied de page des forums