7

我正在运行 CentOS 5,并试图让 django 应用程序与 mod_wsgi 一起工作。我正在使用在 Ubuntu 上工作的 .wsgi 设置。我还使用 python (/opt/python2.6/) 的备用安装,因为我的 django 应用程序需要 >2.5 并且操作系统使用 2.3

这是错误:

[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] SystemError: dynamic module not initialized properly
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] mod_wsgi (pid=23630): Target WSGI script '/data/hosting/cubedev/apache/django.wsgi' cannot be loaded as Python module.
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] mod_wsgi (pid=23630): Exception occurred processing WSGI script '/data/hosting/cubedev/apache/django.wsgi'.
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] Traceback (most recent call last):
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]  File "/data/hosting/cubedev/apache/django.wsgi", line 8, in 
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]    import django.core.handlers.wsgi
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]  File "/opt/python2.6/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 1, in 
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]    from threading import Lock
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]  File "/opt/python2.6/lib/python2.6/threading.py", line 13, in 
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]    from functools import wraps
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]  File "/opt/python2.6/lib/python2.6/functools.py", line 10, in 
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]    from _functools import partial, reduce
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] SystemError: dynamic module not initialized properly

这是我的 .wsgi 文件

import os
import sys
os.environ['PYTHON_EGG_CACHE'] = '/tmp/django/' # This line was added for CentOS.
os.environ['DJANGO_SETTINGS_MODULE'] = 'cube.settings'

sys.path.append('/data/hosting/cubedev')

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

ldd /usr/lib/httpd/modules/mod_wsgi.so 的输出

linux-gate.so.1 =>  (0x00250000)
libpython2.6.so.1.0 => /opt/python2.6/lib/libpython2.6.so.1.0 (0x00be6000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00110000)
libdl.so.2 => /lib/libdl.so.2 (0x00557000)
libutil.so.1 => /lib/libutil.so.1 (0x00128000)
libm.so.6 => /lib/libm.so.6 (0x0012c000)
libc.so.6 => /lib/libc.so.6 (0x00251000)
/lib/ld-linux.so.2 (0x0039a000)

虚拟主机配置

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerAlias cube-dev.example.com
    ServerName  cube-dev.example.com
    ErrorLog logs/cube-dev.example.com.error_log
    CustomLog logs/cube-dev.example.com.access_log common
    Alias /phpMyAdmin /var/www/phpMyAdmin/
   # DocumentRoot /data/hosting/cubedev

    WSGIScriptAlias / /data/hosting/cubedev/apache/django.wsgi

    WSGIProcessGroup cubedev.example.com
    WSGIDaemonProcess cubedev.example.com

    Alias /media/ /data/hosting/cubedev/media/
    Alias /adminmedia/  /opt/python2.6/lib/python2.6/site-packages/django/contrib/admin/media/
    Alias /media /data/hosting/cubedev/media

   <Directory "/data/hosting/cubedev/media">
     Order deny,allow
     Allow from all
    </Directory>
</VirtualHost>
4

1 回答 1

7

SystemError: dynamic module not initialized properly是当正在加载的 dll(或 .so)无法正确初始化时引发的异常。以防万一有人感兴趣_PyImport_LoadDynamicModulePython/importdl.c

现在,有问题的 dll/so(Python parliance 中的动态模块_functools.so)是Python 标准库的一部分。我看到它是从 /opt/python2.6 加载的,所以我们知道这不是系统 python。我的猜测是,这不是针对其编译 mod_wsgi 的 python。要检查是否是这种情况,请运行ldd mod_wsgi.so并查看libpython返回的内容。

因此,我的建议是通过在 wsgi_mod 源目录中运行来重新编译 mod_wsgi 来重新编译 /opt/python2.6 中的解释器

./configure --with-python=/opt/python2.6/bin/python2.6

或者通过使用目录设置它的值来确保它sys.prefix指向 mod_wsgi 期望的 python 安装WSGIPythonHome

ldd 输出后更新

ldd 输出中的第二行显示 mod_wsgi 加载了 pythonlib/usr/lib而不是/opt/python2.6. 要指示 mod_wsgi 加载它,/opt/python2.6您可能应该将它添加到LD_LIBRARY_PATH环境变量中。

先在命令行上试试:

LD_LIBRARY_PATH=/opt/python2.6/lib:$LD_LIBRARY_PATH ldd mod_wsgi.so

然后确保在启动 Apache 的脚本中指定了正确的 LD_LIBRARY_PATH。

又一次更新

您必须调试您的 mod_wsgi 配置。只需尝试使用以下.wsgi文件代替您的文件,然后告诉我们您得到了什么:

def application(environ, start_response):
    status = '200 OK'
    start_response(status, [('Content-type', 'text/plain')])

    try:
        import sys
        return ['\n'.join([sys.prefix, sys.executable])]
    except:
        import traceback as tb
        return [tb.format_exc()]

如果您得到的不是 `/opt/python2.6',请尝试使用该选项

WSGIPythonHome /opt/python2.6

另请参阅http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives

于 2010-03-12T22:34:17.923 回答