Dopo aver lavorato con il server di sviluppo di django negli ultimi due mesi, è finalmente giunto il momento di passare ad apache + mod_wsgi.Django/Apache/mod_wsgi: nessun modulo di nome importlib
Il problema è quando vado nel mio sito (chiamiamolo junux), all'URL mappato all'app django, le cose non sembrano funzionare. Quando si esegue il server di sviluppo sul server, le cose funzionano correttamente.
La linea di fondo dell'errore viene dato a me nel error_log apache:
ImportError: Could not import settings 'junux_site.settings' (Is it on sys.path?): No module named importlib
Sono consapevole questo è simile a molte altre questioni in materia (ci sono così tante che ho vinto' li cito anche qui), ma non ho ancora trovato la risposta. Ho letto alcune guide sul passaggio alla produzione, inclusi i documenti di implementazione di django, le guide di mod_wsgi, alcune presentazioni di Pycon e ho cercato su Google tutto il giorno ...
Un sacco di dettagli divertenti ed eccitanti di seguito.
Qualsiasi aiuto sarà apprezzato. Grazie in anticipo.
La configurazione:
- Apache 2.2.15 con mod_wsgi su CentOS 6
- Python 2.7.3 compilato dai sorgenti
- Il sito utilizza un virtualenv
Questo è il ritorno della pagina di errore Apache:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Apache/2.2.15 (CentOS) Server at junux.net Port 80
L'apache error_log
rivela le seguenti informazioni:
mod_wsgi (pid=22502): Create interpreter 'junux.net|/dev'.
mod_wsgi (pid=22502): Exception occurred processing WSGI script '/var/www/junux_dev/junux_site/wsgi.py'.
Traceback (most recent call last):
File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 219, in __call__
self.load_middleware()
File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 39, in load_middleware
for middleware_path in settings.MIDDLEWARE_CLASSES:
File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner
self._setup()
File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
self._wrapped = Settings(settings_module)
File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 95, in __init__
raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
ImportError: Could not import settings 'junux_site.settings' (Is it on sys.path?): No module named importlib
Il relativo wsgi.py
:
import os
import sys
import site
# use our virtual environment
SITE_DIR = os.path.dirname(__file__)
PROJECT_ROOT = os.path.dirname(SITE_DIR)
site_packages = os.path.join(PROJECT_ROOT, 'venv/lib/python2.7/site-packages')
site.addsitedir(os.path.abspath(site_packages))
sys.path.insert(0, SITE_DIR)
sys.path.insert(1, PROJECT_ROOT)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "junux_site.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
E httpd.conf
: (più roba qui dal file di configurazione di default di Apache)
<VirtualHost *:80>
ServerName junux.net
ServerAlias junux.net
ServerAdmin [email protected]
WSGIScriptAlias /test /var/www/test/hello.py
WSGIScriptAlias /dev /var/www/junux_dev/junux_site/wsgi.py
<Directory /var/www/test >
Order allow,deny
Allow from all
</Directory>
<Directory /var/www/junux_dev >
Options FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
LogLevel info
C'è un a /test
per fornire un controllo di integrità che mod_wsgi funziona davvero. Lo fa. Quando si apre quell'URL, l'applicazione (molto semplice) funziona (un tipico mondo Hello).
Ho impostato le autorizzazioni per chmod o+r
sul mio file WSGI e chmod o+rx
sull'intero /var/www/junux_dev
dir, come indicato nella presentazione PyCon-sydney-2010 riferisce a da here.
Bella cattura! Si scopre che apache era legato al pitone che veniva fornito di default con CentOS 6 (2.6.6), invece di quello che ho compilato (2.7.3). Inoltre, ho installato mod_wsgi (3.2) da 'yum', che probabilmente mi ha dato la versione compatibile con il pacchetto python predefinito, quindi non conforme al 2.7.3 che stavo cercando di usare. Off per configurare nuovamente python e ricompilare mod_wsgi ... Grazie. – scooz