2012-07-15 31 views
10

Sau khi làm việc với máy chủ dev của django trong hai tháng qua, thời gian cuối cùng đã chuyển sang apache + mod_wsgi.Django/Apache/mod_wsgi: Không có mô đun nào được đặt tên importlib

Vấn đề là khi tôi truy cập trang web của mình (hãy gọi nó là junux), với URL được ánh xạ tới ứng dụng django, mọi thứ dường như không hoạt động. Khi chạy máy chủ dev trên máy chủ, mọi thứ hoạt động bình thường.

Các mấu chốt của lỗi được đưa ra với tôi trong error_log apache:

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

Tôi biết đây là tương tự cho nhiều câu hỏi khác về vấn đề này (có được rất nhiều mà tôi thắng' t thậm chí trích dẫn họ ở đây), nhưng tôi vẫn chưa tìm thấy câu trả lời. Tôi đã đọc khá một vài hướng dẫn về chuyển sang sản xuất, bao gồm tài liệu triển khai của django, hướng dẫn của mod_wsgi, một số bản trình bày pycon và đã googling vấn đề cả ngày ...

Rất nhiều chi tiết thú vị và thú vị bên dưới.

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn trước.


Cấu hình:

  • Apache 2.2.15 với mod_wsgi trên CentOS 6
  • Python 2.7.3 biên soạn từ nguồn
  • Các trang web sử dụng một virtualenv

này là trang lỗi apache trả về:

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 

Các apache error_log tiết lộ các thông tin sau:

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 

Các liên quan 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() 

httpd.conf: (thêm nội dung từ file cấu hình apache mặc định)

<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ó một số WSGIScriptAlias đến /test để cung cấp sự kiểm tra sự thật rằng mod_wsgi thực sự hoạt động. Nó có. Khi mở URL đó, ứng dụng (rất đơn giản) hoạt động (một thế giới hello điển hình).

tôi đã thiết lập quyền để chmod o+r trong hồ sơ của tôi và wsgi chmod o+rx trên toàn bộ /var/www/junux_dev dir, theo hướng dẫn trong việc trình bày pycon-sydney năm 2010 giới thiệu đến từ here.

Trả lời

15

Phiên bản nào của Python được mod_wsgi biên soạn? Có vẻ như bạn có thể có nhiều cài đặt Python trên hệ thống và môi trường ảo của bạn đang sử dụng Python 2.7, nhưng mod_wsgi của bạn được biên dịch với 2.6.

Dựa vào dự đoán này thực tế rằng importlib chỉ được thêm vào Python 2.7, vì vậy nếu mod_wsgi được biên dịch cho 2.6 và sử dụng cài đặt cơ sở đó, thì sẽ không tìm thấy importlib.

kiểm tra Chạy:

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

+1

đẹp bắt! Bật apache đã bị ràng buộc với python mà đến theo mặc định với CentOS 6 (2.6.6), thay vì một trong tôi biên dịch (2.7.3). Ngoài ra, tôi đã cài đặt mod_wsgi (3.2) từ 'yum', có thể đã cho tôi phiên bản tương thích với gói python mặc định, do đó không tuân thủ 2.7.3 mà tôi đang cố gắng sử dụng. Tắt để thiết lập lại python và biên dịch lại mod_wsgi ... Cảm ơn bạn. – scooz

Các vấn đề liên quan