2012-07-15 15 views
10

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.

risposta

15

Quale versione di Python è stata compilata in mod_wsgi? Sembra che potresti avere più installazioni Python sul sistema e il tuo ambiente virtuale sta usando Python 2.7, ma il tuo mod_wsgi è compilato con 2.6.

Sto basando questa ipotesi sul fatto che importlib è stato aggiunto solo in Python 2.7, quindi se mod_wsgi è stato compilato per 2.6 e utilizzando quell'installazione di base, non riuscirebbe a trovare importlib.

controlli Run:

http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Python_Shared_Library http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Python_Installation_In_Use

+1

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