试图让 django 应用程序在 CentOS 5 上使用 mod_wsgi
Posted
技术标签:
【中文标题】试图让 django 应用程序在 CentOS 5 上使用 mod_wsgi【英文标题】:Trying to get django app to work with mod_wsgi on CentOS 5 【发布时间】:2011-01-26 23:12:25 【问题描述】:我正在运行 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>
【问题讨论】:
您的 .wsgi 似乎没有被找到。 /data/hosting/cubedev/apache/django.wsgi 确实存在... 我将 django.wsgi 的权限从 644 更改为 755,但仍然出现相同的错误... 【参考方案1】:SystemError: dynamic module not initialized properly
是当正在加载的 dll(或 .so)无法正确初始化时引发的异常。在Python/importdl.c
的函数_PyImport_LoadDynamicModule
中,以防万一有人感兴趣。
现在,有问题的 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
或通过使用WSGIPythonHome
目录设置其值来确保sys.prefix
指向mod_wsgi 期望的python 安装。
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
【讨论】:
也不要通过在 WSGIPythonPath 中列出 Python 安装模块路径、WSGIDaemonProcess 的 python-path 选项或手动更改 WSGI 脚本中的 sys.path 来手动混合 Python 安装模块路径。混合来自不同 Python 安装的模块可能会导致意外结果。 mod_wsgi 已经用 /opt/python2.6 编译。我在上面添加了 ldd 的输出。抛出 SystemError 是否还有其他原因? 我更新了我的答案以响应 ldd 输出。 或者在构建 mod_wsgi 时,将其构建为 'LD_RUN_PATH=/opt/python2.6/lib make'。这样就不必在运行时设置 LD_LIBRARY_PATH。 按照建议重新编译了 mod_wsgi,但我仍然得到完全相同的错误...我更新了上面 ldd 的输出。以上是关于试图让 django 应用程序在 CentOS 5 上使用 mod_wsgi的主要内容,如果未能解决你的问题,请参考以下文章
centos 6.5 上 Apache 2.2.15 上的 Django
Django1.5 forloop.counter 不在模板中递增
centos6.5+Django+mysql+nginx+uwsgi