麻烦在apache下运行python脚本为cgi(ubuntu 12)

时间:2013-10-24 22:44:47

标签: python apache ubuntu cgi

披露:我搜索了很多,我不认为我的问题(对于我的配置)在这里得到解答。例如 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

6 个答案:

答案 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脚本的第一行。