2012-07-15 9 views
10

Después de trabajar con el servidor de desarrollo de django durante los últimos dos meses, finalmente llegó el momento de pasar a apache + mod_wsgi.Django/Apache/mod_wsgi: Ningún módulo llamado importlib

El problema es que cuando voy a mi sitio (llamémoslo junux), a la URL asignada a la aplicación django, las cosas no parecen funcionar. Cuando se ejecuta el servidor de desarrollo en el servidor, las cosas funcionan correctamente.

La línea de fondo del error me es dado en el error_log de apache:

ImportError: Could not import settings 'junux_site.settings' (Is it on sys.path?): No module named importlib

Soy consciente de que esto es similar a muchas otras preguntas sobre el asunto (hay tantos que ganaron' incluso los cito aquí), pero aún no he encontrado la respuesta. He leído bastantes guías sobre cómo moverme a la producción, incluidos los documentos de implementación de django, las guías de mod_wsgi, algunas presentaciones de Pycon y he estado buscando el problema todo el día ...

A continuación, se muestran muchos detalles divertidos y emocionantes.

Cualquier ayuda será apreciada. Gracias de antemano.


La configuración:

  • Apache 2.2.15 con mod_wsgi en CentOS 6
  • Python 2.7.3 compilado desde el código fuente
  • El sitio utiliza un virtualenv

Este es la página de error apache devuelve:

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 

El Apache error_log revela la siguiente información:

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 

La relevante 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() 

Y httpd.conf: (más cosas aquí desde el archivo de configuración de Apache por defecto)

<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 

Hay un WSGIScriptAlias a /test para proporcionar una verificación de cordura de que mod_wsgi realmente funciona. Lo hace. Al abrir esa URL, la aplicación (muy simple) funciona (un mundo hola típico).

he puesto permisos a chmod o+r en mi archivo wsgi y chmod o+rx en todo el /var/www/junux_dev dir, como se indica en la presentación PyCon-Sydney-2010 referido a partir de here.

Respuesta

15

¿Con qué versión de Python se compiló el mod_wsgi? Parece que puede tener varias instalaciones de Python en el sistema y su entorno virtual está utilizando Python 2.7, pero su mod_wsgi está compilado contra 2.6.

Estoy basándose en esta suposición de que importlib solo se agregó en Python 2.7, por lo que si mod_wsgi se compiló para 2.6 y utiliza esa instalación base, no podrá encontrar importlib.

cheques de ejecución:

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

+1

Buena atrapada! Resulta que apache estaba vinculado al pitón que venía de forma predeterminada con CentOS 6 (2.6.6), en lugar del que yo compilé (2.7.3). Además, instalé mod_wsgi (3.2) desde 'yum', que probablemente me dio la versión que es compatible con el paquete predeterminado de python, por lo tanto, no cumple con el 2.7.3 que estaba tratando de usar. Desactivado para configurar python nuevamente y recompilar mod_wsgi ... Gracias. – scooz

Cuestiones relacionadas