繁体   English   中英

配置Apache以像CGI PHP一样使用Python

[英]Configure Apache to use Python just like CGI PHP

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

您可以将任何类型的可执行文件用作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-Python不是PHP。 总体而言,PHP有望成为CGI。 Python没有。

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

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

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

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

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

例如,当您打开http://localhost/test.py您期望Apache将以某种方式启动进程/usr/bin/python /var/www/test.py (即具有单个命令行参数的解释器)。 但这不会发生,因为Apache调用了不带参数的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进程中解释该脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM