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.
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