这是一个很长的问题,详细说明了我从一开始就做的一切。希望能帮助到你。 我正在研究django应用程序,需要将其部署到生产服务器上。生产服务器是由IT管理的虚拟服务器,我没有root访问权限。他们授予我管理/ swadm和/ home / swadm中模块安装的权利。 所以我计划创建以下安排:
/swadm/etc/httpd/conf
我在哪里维护httpd.conf /swadm/etc/httpd/user-modules
我在哪里维护我的apache模块(mod_wsgi)/swadm/var/www/django/app
我维护我的django代码/swadm/usr/local/python/2.6
我将使用django,south等模块维护我的python 2.6.7安装。/home/swadm/setup
我将存储所需的源代码压缩包并完成所有构建和安装。/home/swadm/workspace
我将维护正在开发的应用程序代码。系统安装了python2.4.3和python2.6.5但是如果我需要安装很多自定义模块(我会这样做),IT建议我维护自己的python安装。
所以我下载了python2.6.7源代码。我需要确保安装了python,以便其共享库可用。当我仅使用选项--enable-shared
和--prefix=/swadm/usr/local/python/2.6
运行配置脚本时,它将被安装但令人惊讶地指向系统安装python2.6.5。
$ /swadm/usr/local/python/2.6/bin/python
Python 2.6.5 (r265:79063, Feb 28 2011, 21:55:45)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
所以我按照Building Python with --enable-shared in non-standard location中的说明运行配置脚本
./configure --enable-shared --prefix=/swadm/usr/local/python/2.6 LDFLAGS="-Wl,-rpath /swadm/usr/local/python/2.6/lib"
还要确保我事先创建了目录(如链接所示)以避免预期的错误。现在键入/swadm/usr/local/python/2.6/bin/python
将启动正确的python版本2.6.7。所以我继续配置和安装mod_wsgi。我将其配置为
./configure --with-python=/swadm/usr/local/python/2.6/bin/python
创建的Makefile尝试将模块安装到/usr/lib64/httpd/modules
并且我没有写入权限,所以我修改了makefile以安装到/swadm/etc/httpd/user-modules
。 (可能有一个命令参数,但我无法弄明白)。模块创建得很好。我使用的测试wsgi脚本是
import sys
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
output = output + str(sys.version_info)
output = output + '\nsys.prefix = %s' % repr(sys.prefix)
output = output + '\nsys.path = %s' % repr(sys.path)
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
显示的输出结果令人惊讶
Hello World!(2, 6, 5, 'final', 0)
sys.prefix = '/swadm/usr/local/python/2.6'
sys.path = ['/swadm/usr/local/python/2.6/lib64/python26.zip', '/swadm/usr/local/python/2.6/lib64/python2.6/', '/swadm/usr/local/python/2.6/lib64/python2.6/plat-linux2', '/swadm/usr/local/python/2.6/lib64/python2.6/lib-tk', '/swadm/usr/local/python/2.6/lib64/python2.6/lib-old', '/swadm/usr/local/python/2.6/lib64/python2.6/lib-dynload']`
所以你看到mod_wsgi模块仍然配置了系统的python 2.6.5安装,而不是我自定义的。 我尝试了mod_wsgi documentation
中详述的各种内容WSGIPythonHome
设置为/swadm/usr/local/python/2.6
和
WSGIPythonPath
至/swadm/usr/local/python/2.6/lib/python2.6
在python配置目录中创建了一个符号链接,指向libpython2.6.so文件
$ ln -s ../../libpython2.6.so
当我ldd libpython2.6.so
时,这就是我所看到的:
$ ldd libpython2.6.so
linux-vdso.so.1 => (0x00007fffc47fc000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b666ed62000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b666ef7e000)
libutil.so.1 => /lib64/libutil.so.1 (0x00002b666f182000)
libm.so.6 => /lib64/libm.so.6 (0x00002b666f385000)
libc.so.6 => /lib64/libc.so.6 (0x00002b666f609000)
/lib64/ld-linux-x86-64.so.2 (0x00000031aba00000)
ldd mod_wsgi.so
给出了
$ ldd /swadm/etc/httpd/user-modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007fff1ad6e000)
libpython2.6.so.1.0 => /usr/lib64/libpython2.6.so.1.0 (0x00002af03aec7000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002af03b270000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002af03b48c000)
libutil.so.1 => /lib64/libutil.so.1 (0x00002af03b690000)
libm.so.6 => /lib64/libm.so.6 (0x00002af03b893000)
libc.so.6 => /lib64/libc.so.6 (0x00002af03bb17000)
/lib64/ld-linux-x86-64.so.2 (0x00000031aba00000)
我一直在尝试重新安装和重新配置python和mod_wsgi,但无济于事。请让我知道我哪里出错了。 (很抱歉很长的帖子)
TLDR ;具有非root访问权限的系统具有默认的python安装。我正在维护自己的python和python模块。 mod_wsgi使用自定义python配置和构建,当我运行打印出sys version_info和path的测试脚本时,仍然指向系统的python。
更新:
在浏览stackoverflow时(应该早点完成)我在mod_wsgi python2.5 ubuntu 11.04 problem上找到了Graham Dumpleton的这个答案,它解决了我的错误。现在当我ldd mod_wsgi.so
时,我发现它链接到正确的python共享库。我现在使用我的自定义python安装安装了Django和MySQLdb。现在我面临这个错误:
The following error occurred while trying to extract file(s) to the Python egg
cache:
[Errno 13] Permission denied: '/var/www/.python-eggs'
The Python egg cache directory is currently set to:
/var/www/.python-eggs
Perhaps your account does not have write access to this directory? You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.
所以我确实通过PYTHON_EGG_CACHE
更改了export PYTHON_EGG_CACHE=/swadm/var/www/.python-eggs
的值。但我仍然得到同样的错误。我正在调查更多。我解决这个问题时会更新。
答案 0 :(得分:2)
通过在WSGI脚本中设置环境变量来解决Egg缓存问题:
http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Access_Rights_Of_Apache_User
或在Apache配置中:
http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIPythonEggs http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess
后两者中的哪一个取决于使用emebedded模式还是守护进程模式。