在共享主机上使用FastCGI的CherryPy(或其他Python框架)

5 投票
4 回答
2255 浏览
提问于 2025-04-15 15:37

我正在尝试在Apache上用FastCGI(其实是fcgid)配置Python的一个小框架CherryPy。我是在一个共享主机上,所以我无法访问httpd.conf文件,只能使用htaccess。我按照这些教程尝试过,但都没有成功:

我总是遇到500错误,Apache的日志里显示“脚本头部提前结束”。我尝试了各种方法(权限、shebang、完整路径、守护进程模式、非守护进程模式)。我知道Apache能够正确执行我的.fcgi文件,因为我能从Python打印到错误日志,但就这些了。有没有人成功在共享主机上安装过CherryPy或其他框架?非常感谢你的帮助。谢谢。

4 个回答

1

Apache、Bluehost、fastcgi、cherrypy和wsgi这些东西组合在一起,确实有点复杂。我真希望能花一年时间为你写一本详细的指南,但可惜没有那么多时间。不过,你可以从这个相当长的邮件列表讨论中获得一些启发,这个讨论也和你发的那些链接有关。

1

一个建议:确保你的 .fcgi 文件的第一行指向正确的 Python 执行程序:

#!/usr/bin/python

我在 Bluehost 上用 fcgi 和 apache 运行 Django 时,发现使用了错误的 Python 环境是我的问题(在命令行下可以运行,但在网页/apache 上不行)。

除此之外,如果你能从代码中打印错误日志,能否确认当你访问网页时,代码是正确执行的,没有任何异常?(而不是在命令行下运行时)。

1

Bluehost的文章是最好的资源,但我没有仔细阅读关于获取最新补丁的部分(步骤3的开头)。在这篇文章发布时,甚至现在使用CherryPy版本3.1.2,你无法使用“动态模式”的fcgi(当apache启动进程时)。更多信息可以在这里找到。动态模式对于共享主机来说基本上是必不可少的。

我查看了主干版本(3.2.0rc1),经过一些折腾,终于让它工作了。我按照bluehost文章中的步骤5,方法C进行了操作。以下是我在cherryd.fcgi中的主要内容:

if __name__ == '__main__':
    cherrypy.config.update({
        'server.socket_port': None,
        'server.socket_host': None,
        'server.socket_file': None
    })
    start( daemonize=False, fastcgi=True, imports=["hello"])

另外,在cherrypy/process/servers.py中,我还需要修改以下一行:

# from this
# if not hasattr(socket.socket, 'fromfd'):

# to this
if not hasattr(socket, 'fromfd'):

所以,虽然可以让它工作,但感觉有点像是临时解决方案。你应该等到3.2.0的正式发布,或者像我一样去看看Web.py。我很容易就能在我的共享主机上让它工作(文档对fastcgi/htaccess的解释很清楚)。

撰写回答