web-dev-qa-db-fra.com

Le script WSGI cible ne peut pas être chargé en tant que module Python

J'essaie de déployer mod_wsgi avec Apache pour exécuter une application Django, mais j'obtiens une erreur d'erreur de serveur interne 500. Les journaux Apache indiquent:

[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] mod_wsgi (pid=16142): Exception occurred processing WSGI script '/home/user/bms/Apache/Django.wsgi'.
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] Traceback (most recent call last):
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64]   File "/home/user/bms/Apache/Django.wsgi", line 13, in <module>
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64]     import Django.core.handlers.wsgi
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] ImportError: No module named Django.core.handlers.wsgi

Mon hôte virtuel Apache est le suivant:

<VirtualHost *:80>

    DocumentRoot /home/user/bms

    <Directory /home/user/bms>
        Order allow,deny
        Allow from all
    </Directory>

WSGIDaemonProcess bms user=user group=user processes=2 threads=25 python-path=/usr/local/lib/python2.7/site-packages


    WSGIProcessGroup bms

    WSGIScriptAlias / /home/user/bms/Apache/Django.wsgi

</VirtualHost>

Et le fichier wsgi référencé dans mon répertoire d'application avec les autorisations 0777:

import os
import sys

path = '/home/user/bms'
if path not in sys.path:
    sys.path.append(path)

os.environ['Django_SETTINGS_MODULE'] = 'bms.settings'

import Django.core.handlers.wsgi
application = Django.core.handlers.wsgi.WSGIHandler()

J'ai entendu dire que c'est peut-être parce que l'utilisateur Apache ne dispose pas des autorisations appropriées. Cependant, je ne sais pas comment résoudre ce problème. J'ai également essayé de démarrer le démon avec l'utilisateur www-data et cela n'a pas résolu le problème.

MODIFIER:

J'ai résolu ce problème en copiant le fichier d'hôtes virtuels dans le fichier par défaut, puis en désactivant l'ancien avec a2dissite. Je ne sais pas comment je peux le faire "correctement" et le configurer pour qu'Apache se rende sur l'hôte virtuel que je souhaite.

44
Adam Thomas

Pour moi, le problème était celui de la non correspondance des versions de python wsgi. J'utilisais python 3, donc:

$ Sudo apt-get remove libapache2-mod-python libapache2-mod-wsgi
$ Sudo apt-get install libapache2-mod-wsgi-py3

Avertissement de @alxs avant de copier/coller ces commandes:
Si des projets python 2 exécutés sur le serveur utilisent wsgi et Apache, les commandes ci-dessus les arrêteront.

47
nima

Pour moi, le problème était que le script WSGI n'était pas exécutable.

Sudo chmod a+x Django.wsgi

ou juste

Sudo chmod u+x Django.wsgi

tant que vous avez le bon propriétaire

17
Gerry

J'ai eu un problème similaire avec ce message d'erreur dans les journaux:

Le script WSGI cible '/home/web2py/wsgihandler.py' ne peut pas être chargé en tant que module Python.

La solution consistait à supprimer une directive WSGIPythonHome incorrecte (pointant vers le répertoire de l'application) de /etc/httpd/conf.d/wsgi.conf

Je suis sur RedHat en utilisant les dépôts CentOS.

Recommandez les instructions d'installation/configuration de Graham Dumpleton. Tester la configuration par rapport à l'application helloworld m'a montré que mod_wsgi fonctionnait et que la configuration était en cause.

Cependant, le message d'erreur donnait peu d'indices sur ce qui n'allait pas.

5
user475443

J'ai eu le même problème et au début, je n'avais pas réalisé que je pouvais faire défiler l'écran plus bas et voir le message d'erreur. Dans mon cas, c'était une erreur d'importation:

ImportError: No module named bootstrap3

Après l'avoir installé via pip (installer pip Django-bootstrap3), j'ai redémarré Apache et cela a fonctionné.

4
dnmh

Je sais que cette question est assez ancienne, mais je me suis attaquée à cette question pendant environ huit heures tout à l'heure. Si vous avez un système sur lequel SELinux est activé et que vous avez placé votre virtualenv dans des emplacements particuliers, mod_wsgi ne pourra pas ajouter votre python-path spécifié aux packages de site. Cela ne soulèvera pas non plus d'erreur. dans la mesure où il s'avère que le mécanisme utilisé pour ajouter le python-path spécifié aux packages du site est associé au module Python site, plus précisément à site.adduserdir(). Cette méthode ne génère aucune erreur si le répertoire est manquant ou inaccessible. Par conséquent, mod_wsgi ne génère pas non plus d'erreur.

Quoi qu'il en soit, essayez de désactiver SELinux avec 

Sudo setenforce 0

ou en vous assurant que le processus que vous exécutez Apache contient les ACL appropriées avec SELinux pour accéder au répertoire dans lequel se trouve virtualenv.

2
Alex Van Liew

Dans mon propre cas sous windows dans xampp, je chargeais de manière incorrecte le chemin d’application dans le fichier wsgi.py comme ceci:

Incorrect:

    os.environ.setdefault("Django_SETTINGS_MODULE", "advisory_portal.settings")

    application = get_wsgi_application()
    sys.path.append('C:/xampp/htdocs/advisory_portal/advisory_portal')
    sys.path.append('C:/xampp/htdocs/advisory_portal')

Au lieu de:

Correct:

sys.path.append('C:/xampp/htdocs/advisory_portal/advisory_portal')
sys.path.append('C:/xampp/htdocs/advisory_portal')
os.environ.setdefault("Django_SETTINGS_MODULE", "advisory_portal.settings")

application = get_wsgi_application()

N'oubliez pas d'importer le paquetage sys python

1
Dev

L'avez-vous essayé sans l'option WSGIDaemonProcess?

Je n'ai eu aucun problème à configurer mod_wsgi chez moi, mais je l'ai fait sans l'option daemon. Vous avez mentionné la résolution des problèmes en déplaçant les fichiers d'hôtes virtuels et je note cette mise en garde dans la documentation de WSGIDaemonProcess:

Notez également que le nom du démon Le groupe de processus doit être unique pour le fichier serveur entier. C'est, ce n'est pas possible d'utiliser le même démon nom du groupe de processus dans différent hôtes virtuels.

Je ne sais pas si c'est une coïncidence.

1
John Pirie

Le chemin d’ajout dans wsgi.py est la direction, mais au lieu d’ajouter Django, le chemin d’ajout sys.path.append("/path/to/virtual/environment/lib/pythonX.X/site-packages") a corrigé mon cas.

Ceci est pour un projet Django utilisant python2.7 sur Ubuntu 16.04.

0
lydfen

J'ai eu le même problème et cela a été résolu en utilisant 

Sudo easy_install cx_Oracle

mais rappelez-vous de désinstaller cx_Oracle avant de l'installer en utilisant easy_install.

Commande à désinstaller: pip uninstall cx_Oracle

0
Bicky

La solution qui a finalement fonctionné pour moi, après avoir essayé sans succès bon nombre de ces options, était simple, mais insaisissable, car j’avais du mal à comprendre les chemins à suivre.

J'ai créé un projet mezzanine, basé sur Django, avec les commandes suivantes. Je les énumère ici pour rendre les chemins explicites.

/var/www/mysite$ python3 -m venv ./venv
/var/www/mysite$ source ./venv/bin/activate
(venv) /var/www/mysite$ mezzanine-project mysite
(venv) /var/www/mysite$ cd mysite
(venv) /var/www/mysite/mysite$

Le chemin d'accès au fichier wsgi.py est le suivant:

/var/www/mysite/mysite/mysite/wsgi.py

Les directives qui ont fonctionné pour cette installation dans mon fichier /etc/Apache2/sites-available/mysite.conf sont les suivantes:

...<VirtualHost...>
    ...
    WSGIDaemonProcess mysite python-home=/var/www/mysite/venv python-path=/var/www/mysite/mysite
    WSGIProcessGroup mysite
    WSGIScriptAlias / /var/www/mysite/mysite/mysite/wsgi.py process-group=accounting
    <Directory /var/www/mysite/mysite/mysite>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
    ...
</VirtualHost>...

J'ai essayé de nombreuses versions de python-home et python-path et j'ai eu à plusieurs reprises l'erreur de l'OP. Utiliser les chemins corrects ici devrait également accomplir les mêmes choses que @ Réponse de Dev sans devoir ajouter de chemins dans le fichier wsgi.py (fourni par mezzanine , et aucune édition nécessaire dans mon cas).

0
mightypile

Comme cette question est devenue en quelque sorte un pool de solutions de résolution des problèmes qui entraînent l’erreur de donner à cette question son titre, je voudrais également ajouter celle-ci.

Dans mon cas, je veux exécuter OpenStack Keystone (Ocata) en utilisant Apache et WSGI sur Ubuntu 16.04.2. Les processus démarrent mais dès que je demande la clé de voûte, je reçois

mod_wsgi (pid=20103): Target WSGI script '/opt/openstack/bin/keystone-wsgi-public' cannot be loaded as Python module.

J'ai eu deux hôtes, l'un avait

WSGIDaemonProcess keystone-public ...
WSGIProcessGroup keystone-public ...

tandis que l'autre avait

WSGIDaemonProcess keystone-admin ...
WSGIProcessGroup keystone-admin ...

J'ai résolu le problème en les renommant. Les entrées vhost se lisent maintenant:

WSGIDaemonProcess kst-pub ...
WSGIProcessGroup kst-pub ...

et

WSGIDaemonProcess kst-adm ...
WSGIProcessGroup kst-adm ...

Je n'ai pas enquêté plus loin. Résolu comme travaille pour moi.

0
user1129682

J'ai eu un problème similaire, par exemple l'erreur de journal Apache "wsgi.py ne peut pas être chargé en tant que module Python." 

Il s'est avéré que je devais arrêter puis démarrer Apache au lieu de simplement le redémarrer.

0
curtisp

Si vous installez les dépendances Python de votre projet dans virtualenv, vous devez également ajouter le chemin du répertoire de virtualenv à votre chemin Python. Pour ce faire, ajoutez un chemin supplémentaire à votre directive WSGIPythonPath, avec plusieurs chemins séparés par un signe deux-points (:) si vous utilisez un système de type UNIX ou un point-virgule (;) si vous utilisez Windows

0
dong

En ajoutant à la liste, voici comment je l'ai fait fonctionner.

J'essayais d'installer CKAN 2.7.2 sur CentOS 7 à partir des sources et je rencontrais toujours cette erreur ... Pour moi, c'était parce que SELinux était activé. Je n'avais pas besoin de le désactiver. Au lieu de cela, après avoir lu https://www.endpoint.com/blog/2010/10/13/selinux-httpd-modwsgi-26-rhel-centos-5 , j'ai constaté que l'activation de httpd_can_network_connect résolvait le problème:

setsebool -P httpd_can_network_connect on

De cette page:

httpd_can_network_connect - Permet à httpd d'établir des connexions réseau, y compris les locaux que vous ferez à une base de données

0
John Doyle

Je recevais cette erreur. J'utilise python 3 dans un environnement virtuel Trouvé dans mes journaux Apache

[Vendredi 21 décembre 08: 01: 43.471561 2018] [mpm_prefork: avis] [pid 21786] AH00163: Apache/2.4.6 (Red Hat Enterprise Linux) mod_wsgi/3.4 Python/2.7.5 configuré - reprise des opérations normales

J'avais installé wsgi en utilisant yum -y install mod_wsgi. Cela avait installé mod_wsgi compilé pour Python 2. Je l'ai donc désinstallé 

yum remove mod_wsgi

et installé mod_wsgi compilé pour python 3 en utilisant

yum install python35u-mod_wsgi

Ça a marché après ça

0
Leroy Kayanda