Mod_wsgi pylons (ckan) 安装失败

7 投票
4 回答
3235 浏览
提问于 2025-04-16 14:43

我正在按照这些说明设置CKAN,这是一个基于pylons的应用程序:http://packages.python.org/ckan/deployment.html

但是,当我通过IP地址或主机名访问服务器时(还没有设置DNS),我只看到Apache的欢迎页面,这说明CKAN应用程序没有被加载。

这是我的mod_wsgi脚本:

import os
instance_dir = '/home/flavio/var/srvc/ckan.emap.fgv.br'
config_file = 'ckan.emap.fgv.br.ini'
pyenv_bin_dir = os.path.join(instance_dir, 'pyenv', 'bin')
activate_this = os.path.join(pyenv_bin_dir, 'activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
from paste.deploy import loadapp
config_filepath = os.path.join(instance_dir, config_file)
from paste.script.util.logging_config import fileConfig
fileConfig(config_filepath)
application = loadapp('config:%s' % config_filepath)

这是我的虚拟主机配置:

<VirtualHost *:80>

ServerName dck093

ServerAlias dck093

WSGIScriptAlias / /home/flavio/var/srvc/ckan.emap.fgv.br/pyenv/bin/ckan.emap.fgv.br.py
# pass authorization info on (needed for rest api)
WSGIPassAuthorization On

ErrorLog /var/log/apache2/ckan.emap.fgv.br.error.log
CustomLog /var/log/apache2/ckan.emap.fgv.br.custom.log combined
<Directory /home/flavio/var/srvc/ckan.emap.fgv.br/pyenv/bin>
    Order deny,allow
    Allow from all
</Directory>
</VirtualHost>

我尝试禁用000-default站点(用a2dissite命令),但这没有帮助。这样做后,我得到了一个内部服务器错误页面。在修复了一些权限后,我成功获得了这个Pylons错误日志:

sudo tail /var/log/apache2/ckan.emap.fgv.br.error.log 
[Wed Mar 30 12:38:32 2011] [error] [client 10.250.48.110]     app_iter = self.application(environ, start_response)
[Wed Mar 30 12:38:32 2011] [error] [client 10.250.48.110]   File "/usr/lib/pymodules/python2.6/repoze/who/middleware.py", line 107, in __call__
[Wed Mar 30 12:38:32 2011] [error] [client 10.250.48.110]     app_iter = app(environ, wrapper.wrap_start_response)
[Wed Mar 30 12:38:32 2011] [error] [client 10.250.48.110]   File "/home/flavio/var/srvc/ckan.emap.fgv.br/pyenv/lib/python2.6/site-packages/pylons/middleware.py", line 201, in __call__
[Wed Mar 30 12:38:32 2011] [error] [client 10.250.48.110]     self.app, environ, catch_exc_info=True)
[Wed Mar 30 12:38:32 2011] [error] [client 10.250.48.110]   File "/home/flavio/var/srvc/ckan.emap.fgv.br/pyenv/lib/python2.6/site-packages/pylons/util.py", line 94, in call_wsgi_application
[Wed Mar 30 12:38:32 2011] [error] [client 10.250.48.110]     app_iter = application(environ, start_response)
[Wed Mar 30 12:38:32 2011] [error] [client 10.250.48.110]   File "/usr/lib/pymodules/python2.6/weberror/evalexception.py", line 226, in __call__
[Wed Mar 30 12:38:32 2011] [error] [client 10.250.48.110]     "The EvalException middleware is not usable in a "
[Wed Mar 30 12:38:32 2011] [error] [client 10.250.48.110] AssertionError: The EvalException middleware is not usable in a multi-process environment

有没有人能告诉我我缺少了什么?

4 个回答

1

我对“粘贴”环境不是很专业,但应该不是:

from paste.deploy.loadwsgi import loadapp
3

你的第一个问题是,在Apache中使用基于名称的虚拟主机时,必须有一个在DNS或本地的/etc/hosts文件中能解析到Apache服务器IP的主机名。

第二个问题是,因为在多进程服务器配置中不能使用EvalException。可以参考一下:

http://code.google.com/p/modwsgi/wiki/DebuggingTechniques#Browser_Based_Debugger

你可以选择禁用EvalException,或者配置mod_wsgi,使其使用守护进程模式,并设置为单进程的'default'(不要使用processes=1)。

如果想了解Apache/mod_wsgi中各种进程/线程配置的背景,可以查看:

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

你需要使用的配置是'wsgi.multiprocess'设置为False。

16

因为你是在apache上部署,所以要确保你没有处于交互式调试模式,这种模式会使用EvalException。在你的Pylons配置文件(ckan.emap.fgv.br.ini)中,确保你有以下内容:

[app:main]
set debug = false

撰写回答