在CentOS 5上尝试使Django应用与mod_wsgi一起工作
我正在使用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>
1 个回答
SystemError: dynamic module not initialized properly
是一种错误,表示一个动态链接库(dll 或 .so 文件)在加载时没有正确初始化。这个错误是在 Python/importdl.c
文件中的 _PyImport_LoadDynamicModule
函数里抛出的,感兴趣的朋友可以去看看。
这里提到的动态链接库(在 Python 中称为 动态模块)是 _functools.so
,它是 Python 标准库的一部分。我看到它是从 /opt/python2.6 加载的,所以我们知道这不是系统自带的 Python。我的猜测是,这个 Python 版本和 mod_wsgi 编译时使用的版本不一致。要检查这一点,可以运行 ldd mod_wsgi.so
命令,看看返回的 libpython
是什么。
因此,我的建议是要么重新编译 mod_wsgi,使其与 /opt/python2.6 中的解释器匹配,可以在 wsgi_mod 源代码目录下运行:
./configure --with-python=/opt/python2.6/bin/python2.6
要么确保 sys.prefix
指向 mod_wsgi 期望的 Python 安装路径,可以通过设置 WSGIPythonHome
目录的值来实现。
更新:根据 ldd 输出
ldd 输出的第二行显示,mod_wsgi 加载的是 /usr/lib
中的 pythonlib,而不是 /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