mod_wsgi python2.5 ubuntu 11.04 问题
我在我的amd64平台上使用ubuntu 11.04时,配置如下:
- 从源代码构建python2.5,并安装到/usr/local/python2.5
- 在/home/se7en/.virtualenvs/e-py25创建了一个虚拟环境
另外,我还重新编译了mod_wsgi.so,以便与自定义的python一起使用:
se7en@se7en-System-Product-Name:~$ ldd /usr/lib/apache2/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007fff5af6c000)
libpython2.5.so.1.0 => /usr/lib/libpython2.5.so.1.0 (0x00007f7bed14b000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7becf2d000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7becd28000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f7becb25000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7bec8a0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7bec50b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7bed717000)
django.wsgi
#/usr/local/python2.5/bin/python
# -*- coding: utf-8 -*-
import os, sys
sys.stdout = sys.stderr
dn = os.path.dirname
PROJECT_ROOT = os.path.abspath( (dn(__file__)) )
#DJANGO_PROJECT_ROOT = os.path.join(PROJECT_ROOT, 'apps')
DJANGO_PROJECT_ROOT = PROJECT_ROOT
sys.path.insert(0, '/usr/local/python2.5/lib/python2.5/site-packages' )
sys.path.insert(0,'/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages')
sys.path.insert(0, DJANGO_PROJECT_ROOT )
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
print sys.version #return 2.5.5 (r255:77872, Apr 15 2011, 22:12:51
print sys.path
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
apache网站配置:
<VirtualHost 192.168.1.3>
ServerAdmin admin@wsgi.debianworld.ru
ServerName wsgi.debianworld.ru
ErrorLog /home/se7en/workspace/lxchg/logs/error_log
CustomLog /home/se7en/workspace/lxchg/logs/access_log common
WSGIScriptAlias / /home/se7en/workspace/lxchg/django.wsgi
Alias "/media/" "/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/django/contrib/admin/media/"
<Location "/media/">
SetHandler None
</Location>
Alias "/main_media/" "/home/se7en/workspace/lxchg/main_media/"
<Location "/main_media/">
SetHandler None
</Location>
</VirtualHost>
WSGIPythonHome /home/se7en/.virtualenvs/e-py25
#WSGIPythonExecutable /usr/local/python2.5/bin/python
我在错误日志中遇到了一个错误:
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] mod_wsgi (pid=2955): Exception occurred processing WSGI script '/home/se7en/workspace/lxchg/django.wsgi'.
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] Traceback (most recent call last):
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] File "/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/django/core/handlers/wsgi.py", line 248, in __call__
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] response = self.get_response(request)
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] File "/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/django/core/handlers/base.py", line 141, in get_response
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] return self.handle_uncaught_exception(request, resolver, sys.exc_info())
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] File "/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/django/core/handlers/base.py", line 176, in handle_uncaught_exception
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] if resolver.urlconf_module is None:
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] File "/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/django/core/urlresolvers.py", line 239, in _get_urlconf_module
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] self._urlconf_module = import_module(self.urlconf_name)
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] File "/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/django/utils/importlib.py", line 35, in import_module
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] __import__(name)
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] File "C:\\workspace\\sdl\\lxchg\\urls.py", line 3, in <module>
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] File "/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/django/views/generic/create_update.py", line 1, in <module>
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] from django.forms.models import ModelFormMetaclass, ModelForm
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] File "/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/django/forms/__init__.py", line 17, in <module>
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] from models import *
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] File "/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/django/forms/models.py", line 6, in <module>
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] from django.db import connections
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] File "/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/django/db/__init__.py", line 77, in <module>
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] connection = connections[DEFAULT_DB_ALIAS]
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] File "/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/django/db/utils.py", line 92, in __getitem__
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] backend = load_backend(db['ENGINE'])
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] File "/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/django/db/utils.py", line 50, in load_backend
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] raise ImproperlyConfigured(error_msg)
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] ImproperlyConfigured: 'django.db.backends.mysql' isn't an available database backend.
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] Try using django.db.backends.XXX, where XXX is one of:
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] 'dummy', 'mysql', 'oracle', 'postgresql', 'postgresql_psycopg2', 'sqlite3'
[Wed Jun 22 13:45:54 2011] [error] [client 192.168.1.3] Error was: /home/se7en/.virtualenvs/e-py25/lib/python2.5/lib-dynload/array.so: undefined symbol: PyUnicodeUCS2_FromUnicode
然后我通过manage.py runserver启动项目时可以正常工作,但通过mod_wsgi就不行了。请帮忙!
2 个回答
它正在加载系统自带的Python。你需要使用 $LD_LIBRARY_PATH
来指向虚拟环境中的Python。想了解更多细节,可以查看 ld.so(8)
的手册。
在Linux系统上,操作系统自带的Python版本是为UCS4的Unicode字符宽度编译的。如果你自己从源代码编译Python,默认情况下会是UCS2,除非你特别指定。这样一来,你的系统Python 2.5和在/usr/local下的本地版本就对Unicode字符的宽度有不同的期待。由于Unicode函数的名称里包含了UCS类型,当你用一个Python编译的对象去调用另一个Python的对象时,就会出现一些不明的错误。
造成这个问题的原因,正如其他回答提到的,mod_wsgi.so实际上是使用了系统范围内的UCS4的libpython2.5.so文件,而不是/usr/local/lib下的UCS2版本。虽然你可以设置LD_LIBRARY_PATH,让程序优先在/usr/local/lib中查找,但在Apache下这样做会比较麻烦。更好的办法是重新从源代码编译mod_wsgi,并执行以下操作:
make distclean
./configure --with-python=/usr/local/bin/python2.5
LD_RUN_PATH=/usr/local/lib make
sudo make install
通过在执行'make'命令时设置LD_RUN_PATH这个环境变量,链接器会把/usr/local/lib直接嵌入到mod_wsgi.so的库搜索路径中。这样在运行时就能找到正确的libpython2.5.so,而不需要设置LD_LIBRARY_PATH。你可以通过对生成的mod_wsgi.so运行'ldd'命令来确认是否成功,它应该能从/usr/local/lib中找到正确的库。