mod_fcgid + Python + Apache 2.2 / RHEL 5:输出到 error_log,而不是浏览器

mod_fcgid + Python + Apache 2.2 / RHEL 5:输出到 error_log,而不是浏览器

我正在尝试获取 Django +mod_fcgid设置工作(mod_wsgi 很棘手,因为我有一个静态链接的 Python。别问。)虽然这在我的 Mac OS X 开发机上很简单,但让它在服务器上运行,到目前为止,已经被证明是不可能的。

使用以下配置

LoadModule fcgid_module modules/mod_fcgid.so

FCGIDSocketPath run/mod_fcgid
FCGIDSharememPath run/mod_fcgid/fcgid_shm

ScriptAliasMatch  /apps/([^/]+)(/.*)? /var/www/apps/$1/apache/dispatch.fcgi$2

<DirectoryMatch ^/var/www/apps/([^/]+)/apache>
  SetHandler fcgid-script
  Order allow,deny
  Allow from all
  Options +ExecCGI
</DirectoryMatch>

这个例子dispatch.fcgi

#!/usr/bin/python
import sys

sys.path.insert(0, '/var/www/lib/python2.5/site-packages/flup-1.0.2.egg')

def myapp(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['This is my hello world test!\n']

if __name__ == '__main__':
    from flup.server.fcgi import WSGIServer
    WSGIServer(myapp).run()

浏览我的测试页面出现 500 错误,在我的 Apache 错误日志中,我得到:

WSGIServer: missing FastCGI param REQUEST_METHOD required by WSGI!
WSGIServer: missing FastCGI param SERVER_NAME required by WSGI!
WSGIServer: missing FastCGI param SERVER_PORT required by WSGI!
WSGIServer: missing FastCGI param SERVER_PROTOCOL required by WSGI!
Status: 200 OK
Content-Type: text/plain
Content-Length: 29

This is my hello world test!
[Wed Sep 30 11:09:18 2009] [notice] mod_fcgid: process /var/www/apps/test/apache/dispatch.fcgi(31043) exit(server exited), terminated by calling exit(), return code: 0

这是我的输出,看起来很棒 - 除了 Apache 的错误日志,而不是我的浏览器窗口。

当我删除SetHandler指令时,输出就会出现在我想要的位置;显然,它运行在普通的 CGI 模式下。这对于我的 Django 应用来说性能不够高,因为在这种配置下,页面加载时间为 1-2 秒。

到目前为止,我已经尝试过:

  • 弗卢普1.0.2、flup 1.0.3开发版本,以及flup作者编写的随机fcgi.py
  • 我的 FastCGI 服务器的线程和预分叉版本
  • mod_fcgid 的 RPM 版本和 Apache 的 SVN 版本
  • Python 2.4 和 Python 2.5(py2.4 不是一个现实的部署选项,但用于测试......)
  • AliasMatch/ScriptAliasMatch/mod_rewrite

似乎没有什么区别,除了使用 AliasMatch 向我显示了源代码,这正如我预期的那样。

再次强调,这在 Mac OS X 上绝对是小菜一碟。它只需具有可比配置即可工作。

除了获得更好的 Python 并使用 mod_wsgi(虽然很麻烦,但这也是可能的)之外,我该如何让它工作?

答案1

问题:某些 SELinux 策略。我不够专业,无法诊断,但可以这样做:

/usr/sbin/setenforce 0

使一切顺利进行。

相关内容