【问题标题】:Configure Apache to use Python just like CGI PHP像 CGI PHP 一样配置 Apache 以使用 Python
【发布时间】:2010-10-22 09:51:53
【问题描述】:

我认为将 PHP 添加到 Apache 网络服务器的一种常见方法是像这样配置它:

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 以这种方式工作的教程。所以也许这是不可能的,但我很好奇为什么会这样?还是我错过了什么?

【问题讨论】:

  • 只是为了澄清:我知道替代方案以及如何正确设置 python。只是想知道为什么这个配置不起作用......

标签: python apache cgi


【解决方案1】:

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

正确。这是不可能的。这也不是故意的。

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

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

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

【讨论】:

  • 好的,我现在阅读了一些关于 CGI 的更详细的文章,并认为我明白了这一点。
  • Python 在 cgi 中运行得非常好,一旦你考虑到解释器在每个请求上启动的开销。当然,我不会用它来运行一个现代网站,但它确实有效。
  • Python 在 CGI 中运行,但与 PHP 的配置不同。
  • @S.Lott - 我只是想为 OP 澄清一下。 PHP 作为 cgi 确实运行得更好一些,但标准是使用 mod_php 或 fastCGI。 PHP 可以构建为 GCI 二进制文件,但不推荐使用,大多数托管服务提供商也不支持。
  • 在搞乱其他任何东西之前先搞定 mod_wsgi。它运行良好,是当前最先进的 Apache-Python 交互。
【解决方案2】:

您可以使用 任何 类型的可执行文件作为 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 中查看结果

【讨论】:

  • 对,但我不想要“普通”的 cgi 脚本,而是避免使用解释器行。
  • 但是 php CGI 是“普通的”cgi。您正在从 apache 调用 php 解释器来执行您的脚本。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    正如其他人指出的那样,使用 python 作为普通 cgi 效率低下,但如果出于教育原因你仍然想这样做,你可以试试这个。

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

    #!/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 进程中解释该脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 2012-07-15
      相关资源
      最近更新 更多