披露:我搜索了很多,我不认为我的问题(对于我的配置)在这里得到解答。例如 run python script as cgi apache server 不回答。
所以: 我有一个最简单的脚本:
#!/usr/bin/env python
print "Content-type: text/html"
print ""
print "<h1>Hello from Python!</h1>"
当我在浏览器中运行它时,它实际上显示自己而不是预期 来自Python的Hello!
我做了以下操作让它运行:
a)每个人都可以执行;它完美地运行在外壳中。
b)它位于具有以下配置的虚拟目录中(在/ etc / apache2 / sites-available / my_cgi_dir中):
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/ <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/my_cgi_dir/> Options Indexes +ExecCGI FollowSymLinks MultiViews AddHandler cgi-script .cgi .py AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
如你所见
Options Indexes +ExecCGI FollowSymLinks MultiViews
和
AddHandler cgi-script .cgi .py
c)我通过运行确保apache支持python sudo apt-get install libapache2-mod-python
d)是的,我确实重启了apache。
尽管如此,我只是看到了脚本的源代码而不是“Hello Python”。
我错过了什么?
请帮忙。
PS:如果这可能会有所帮助,这就是我正在运行的内容:
Linux ip-172-31-37-178 3.2.0-40-virtual#64-Ubuntu SMP Mon Mar 25 21:42:18 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux
服务器版本:Apache / 2.2.22(Ubuntu)
Python 2.7.3
答案 0 :(得分:4)
还可能导致这些症状的原因是您没有加载apache2 cgi模块。这也会在/var/log/apache2/access.log
中生成一条带有HTTP 304错误的日志消息:
192.168.2.3 - - [26/Jul/2014:11:56:34 +0200] "GET /cgi-bin/hello.py HTTP/1.1" 304 179 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"
检查加载的模块:
apache2ctl -M
寻找:
cgid_module (shared)
如果未加载,请使用以下命令加载:
a2enmod cgid
然后重启apache2:
service apache2 reload
然后刷新浏览器并清除浏览器缓存(CTRL + F5)。和/或重新启动浏览器,以确保它请求实际页面,而不是使用浏览器缓存。
答案 1 :(得分:2)
试试这个
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
cgi脚本
import cgi
import cgitb; cgitb.enable()
print "Content-type: text/html\n\n"
print "<h1>Hello from Python!</h1>"
你为什么不这样配置?这里。
ScriptAlias /cgi-bin/ /var/www/my_cgi_dir/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
答案 2 :(得分:2)
就我而言,我的ScriptAlias
指令出错了。我取消了对原始版本的注释,但忘了配置一个新版本。
一旦正确更改并保存了我的sites-available/default
配置文件:
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
..对此:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">
..并重新加载apache2,它只是工作:它停止以文本形式显示我的脚本,并开始将它们作为脚本运行。此外,它不再将/var/www/cgi-bin
显示为浏览器中的目录,但现在可以正确显示错误:
Forbidden
You don't have permission to access /cgi-bin/ on this server.
答案 3 :(得分:0)
我遇到了同样的问题并尝试了以上所有方法。什么都没有帮助。最后,结果证明这是一个非常愚蠢的错误。由于许多人似乎对此有疑问,我还是会发布它:
我没有将我的默认网站从“sites-available”链接到“sites-enabled”,如apache.conf文件顶部所述:
[...] mods-enabled /和sites-enabled /目录中的配置文件 包含管理模块或虚拟的特定配置片段 主机配置。
它们通过符号链接来自它们的可用配置文件来激活 相应的* -available /对应物。这些应该通过使用我们的管理 助手a2enmod / a2dismod,a2ensite / a2dissite。看到 各自的手册页以获取详细信息。 [...]
因此,apache无法读取我对默认文件的所有编辑。一旦我创建了符号链接,就可以了。
答案 4 :(得分:0)
这对我有用, 正如@flyking_建议的那样,按照相同的顺序执行一些额外的步骤。
我不得不在目录中更改 - 我正在使用raspberrypi(NOOB版本linux) / etc / apache2 / sites-available / default
保持这些添加中的那些 + ExecCGI 也是 Addhander cgi-script .cgi .py ,如下所示
<Directory /var/www/>
Options Indexes +ExecCGI FollowSymLinks MultiViews
AddHandler cgi-script .cgi .py
AllowOverride None
Order allow,deny
allow from all
然后重启apache
service apache2 restart
这应该重新启动服务,并在浏览器中启动之前验证python脚本是否在终端中运行良好而没有错误。
如果没有错误,则sampe脚本运行正常。
import cgi
import cgitb; cgitb.enable()
print "Content-type: text/html\n\n"
print "<h1>Hello from Python!</h1>"
Imp:后来我的脚本工作正常,即使没有导入。
注意:清除浏览器中的缓存,或使用ctrl + F5重新加载。 希望这应该解决。
如果这没有解决,那么请尝试@ user2449877建议 检查加载的模块:
apache2ctl -M
寻找:
cgid_module (shared)
如果未加载,请使用以下命令加载:
a2enmod cgid
重新启动apache,然后刷新浏览器
答案 5 :(得分:0)
在我的情况下(这是一个共享的unix机器),我还需要创建一个隐藏文件&#34; .htaccess&#34;以下内容:
Options +ExecCGI
SetHandler cgi-script
相应地设置权限(755 - 组和其他没有写入但执行权限)以及具有以下权限也很重要:
#!/usr/bin/python
作为python CGI脚本的第一行。