将Apache配置为使用Python就像CGI PHP一样

时间:2009-04-28 18:52:00

标签: python apache cgi

我认为向Apache Web服务器添加PHP的一种常见方法是将其配置为:

ScriptAlias /php5.3 /usr/local/php5.3/bin
Action application/php5.3 /php5.3/php-cgi
AddType application/php5.3 .php

现在我尝试为Python编写类似的配置:

ScriptAlias /python /usr/bin
Action application/python /python/python
AddType application/python .py

我有一个小的测试脚本,如下所示:

print "Content-Type: text/html\n\n"
print "Test"

但似乎有些错误,因为apache错误日志说明如下:

Premature end of script headers: python

所以我的第一个问题是我的python响应不对。但是有Content-Type和两个换行符。此外,使用php-cgi调用的类似PHP脚本的输出也会提供完全相同的输出。

此外,我还没有找到一个教程,展示如何让python以这种方式工作。也许这是不可能的,但后来我很好奇为什么会这样呢?或者我错过了什么?

4 个答案:

答案 0 :(得分:13)

您可以将任何类型的可执行文件用作cgi。您的问题出在您的apache配置中,看起来就像您刚刚编写的那样。查看apache文档以获取更多详细信息,但不需要Action和AddType。

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

然后将以下内容放入cgi-bin:

#!/usr/bin/python
# test.py
print "Content-Type: text/html\n\n"
print "Test"

确保它是可执行的,并在/cgi-bin/test.py

中查看结果

答案 1 :(得分:5)

“所以也许这是不可能的,但后来我很好奇为什么会这样呢?”

正确。这是不可能的。它也从未打算过。

原因1 - Python不是PHP。 PHP - 作为一个整体 - 期望成为CGI。 Python没有。

原因2 - Python本质上不是CGI。这是一个(几乎)没有环境期望的翻译。

原因3 - Python从未被设计为CGI。这就是为什么Python通常嵌入到小包装器(mod_python,mod_wsgi,mod_fastcgi)中,它可以以对正在运行的Python程序更有意义的形式封装CGI环境。

答案 2 :(得分:1)

如果在使用CRLF字符换行而不是Unix LF的Windows程序中编辑.py文件,则会出现错误“脚本标题过早结束:”。

某些程序(如Dreamweaver)在首选项中具有换行符类型。记事本也使用CRLF。

如果您的主机有文件编辑器,您可以通过退回当前换行符并通过该编辑器重新输入它们进行测试,该编辑器只会将任何CRLF更改为LF。 Notepad ++只能使用LF。

答案 3 :(得分:0)

当您打开示例http://localhost/test.py时,您希望Apache以某种方式启动进程/usr/bin/python /var/www/test.py(即具有单个命令行参数的解释器)。但这不是发生的事情,因为Apache使用 no 参数调用cgi脚本。相反,它通过CGI标准化的环境变量提供所有信息。

正如其他人已经指出使用python一样普通的cgi是低效的,但如果出于教育原因你仍然喜欢这样做,你可以试试这个。

假设默认的Apache cgi-bin设置处于活动状态,您可以在python中创建一个名为/usr/lib/cgi-bin(或您选择的任何内容)的简单包装器,其中包含以下内容:

#!/usr/bin/python
import os
execfile(os.environ['PATH_TRANSLATED'])

别忘了让它可执行:chmod a+x /usr/lib/cgi-bin/python

将这些内容放入Apache配置中:

AddType application/python .py
Action application/python /cgi-bin/python

现在当你打开http://localhost/test.py时,Apache将执行/ cgi-bin / python,没有参数,但填充了CGI环境变量。在这种情况下,我们使用PATH_TRANSLATED,因为它直接指向webroot中的文件 调用execfile解释已打开的python进程中的脚本。