tpa*_*r44 12 python apache cgi
我正在尝试使用Apache执行Python程序.但是,Apache只会提供文件而不会实际执行它.该文件的权限是r/w/x,它是在/var/www.我将发布后面的内容httpd.conf和程序代码.我也尝试将python脚本作为.cgi文件运行但是也没有用.我也将这些mod_python和mod_wsgi模块加载到apache中.
Python示例:
#!/usr/bin/python
# enable debugging
import cgitb
cgitb.enable()
print "Content-Type: text/plain\r\n\r\n"
print
print "Hello World!"
Run Code Online (Sandbox Code Playgroud)
httpd.conf中:
AddHandler cgi-script .cgi .pl
AddHandler python-program .py
Run Code Online (Sandbox Code Playgroud)
我知道它是一个小的httpd.conf文件但是当我安装apache时,文件中没有任何内容.我还要提一下,这只是为了让我学习在apache中运行python的基础知识.它不适合生产.谢谢您的帮助!
我正在使用的操作系统是Ubuntu 10.04,apache的版本是2.我有python版本2.6,它在#!/usr/bin/env python调用时自动使用.
我收到两个主要错误,第一个是即使文件和文件夹的权限是777,也找不到文件.日志中的错误是
[Sun Feb 05 13:29:44 2012] [error] [client 192.168.1.3] File does not exist: /var/www/poit-0.1
Run Code Online (Sandbox Code Playgroud)
这个错误是针对我没写的不同的python脚本.奇怪的是,当从浏览器窗口访问时,文件显示在文件夹的索引中.但是,当我导航到该文件时,我收到上述错误.
我得到的另一个错误是标头的过早结束.错误如下:
[Sun Feb 05 12:10:19 2012] [error] (8)Exec format error: exec of '/var/www/pyth.py' failed
[Sun Feb 05 12:10:19 2012] [error] [client 192.168.1.3] Premature end of script headers: pyth.py
Run Code Online (Sandbox Code Playgroud)
yla*_*idi 18
httpd.conf的第一行AddHandler cgi-script .cgi .pl 是无关紧要的,因为你正在测试python脚本而不是perl脚本.你应该在你的python脚本的位置定义那些指令,并告诉apache它应该在那个位置执行cgi脚本:Options +ExecCGI.这个片段将是一个开始:
<Directory /path/to/sample.py />
Options +ExecCGI
AddHandler cgi-script .py
</Directory>
Run Code Online (Sandbox Code Playgroud)
附录1:
根据我上次的评论,试试这个脚本.它应该吐出有关cgi环境的信息.
#!/usr/bin/python
import cgi
cgi.test()
Run Code Online (Sandbox Code Playgroud)
附录2:
我让你的脚本使用上面的配置.问题是脚本是用python2编写的.并且默认的解释器apache正在调用来执行脚本,是python3(至少在我的情况下,这也可能对你来说也是一样).
这是hello world脚本的python3版本:
#!/usr/bin/env python
# enable debugging
import cgitb
cgitb.enable()
print("Content-Type: text/plain;charset=utf-8")
print()
print("Hello World!")
Run Code Online (Sandbox Code Playgroud)
附录3:
对于第一个错误,请确保正确设置您尝试部署的任何目录和文件的权限和所有权.并尝试将这些指令添加到httpd.conf:
Order allow,deny
Allow from all
Run Code Online (Sandbox Code Playgroud)
哪个会给你这个:
<Directory /path/to/sample.py />
Options +ExecCGI
AddHandler cgi-script .py
Order allow,deny
Allow from all
</Directory>
Run Code Online (Sandbox Code Playgroud)
对于第二个错误,除非我遗漏了某些东西,看起来apache正在调用python 3解释器来执行你的脚本.要排除这种可能性,您可以尝试以下方法:
ls -al /usr/bin/python*
Run Code Online (Sandbox Code Playgroud)
这将列出您系统上可用的python解释器.如果您有多个解释器,您将获得类似于此输出的内容:
/usr/bin/python -> python3*
/usr/bin/python2.6*
/usr/bin/python3*
Run Code Online (Sandbox Code Playgroud)
如果没有,那就是这个输出:
/usr/bin/python -> python2.6*
/usr/bin/python2.6*
Run Code Online (Sandbox Code Playgroud)
要确保这不是您遇到的问题,请尝试使用此修改后的示例脚本:
#!/usr/bin/python2.6
# enable debugging
import cgitb
cgitb.enable()
print "Content-Type: text/plain\r\n\r\n"
print
print "Hello World!"
Run Code Online (Sandbox Code Playgroud)
您会注意到我明确提到了apache应该调用的解释器版本,这很丑陋.但是为了测试,你可以做到.当然,您应该映射#!/usr/bin/python2.6到服务器上的二进制文件,并确保不要将python 3可复制代码与python 2解释器混合使用,反之亦然.
| 归档时间: |
|
| 查看次数: |
54802 次 |
| 最近记录: |