13

披露:我搜索了很多,我认为我的问题(对于我的配置)在这里没有得到回答。例如 运行 python 脚本,因为 cgi apache 服务器 不回答它。

所以:我有一个最简单的脚本:

#!/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) 我通过运行 sudo apt-get install libapache2-mod-python 确保 apache 支持 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

4

6 回答 6

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)。和/或重新启动浏览器,以确保它正在请求实际页面,而不是使用浏览器缓存。

于 2014-07-26T15:30:33.440 回答
2

In my case, I made a mistake with my ScriptAlias directive. I uncommented the original one, but forgot to configure a new one.

As soon as I correctly changed and saved my sites-available/default config file from this:

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">

.. to this:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">

.. and reloaded apache2, it just worked: it stopped displaying my scripts as text, and started running them as a script. Also, it no longer displayed /var/www/cgi-bin as a directory in the browser, but now correctly displays the error:

Forbidden 
You don't have permission to access /cgi-bin/ on this server.
于 2013-11-15T23:20:04.737 回答
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>
于 2013-10-25T02:02:07.357 回答
0

这对我有用,正如@flyking_ 建议的那样,按照相同的顺序执行一些额外的步骤。

我不得不更改目录 - 我使用的是 raspberrypi(NOOB 版本 linux)/etc/apache2/sites-available/default

维护这些添加 +ExecCGIAddhander 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 脚本是否在终端中运行良好且没有错误,然后在浏览器中启动它。

如果没有错误,那么示例脚本将运行良好。

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然后刷新浏览器

于 2014-08-19T11:06:29.050 回答
0

我遇到了同样的问题并尝试了以上所有方法。没有任何帮助。最后证明这是一个非常愚蠢的错误。由于很多人似乎对此有疑问,我还是会发布它:

我没有将我的默认站点从“可用站点”符号链接到“已启用站点”,如 apache.conf 文件顶部所述:

[...] mods-enabled/ 和 sites-enabled/ 目录中的配置文件包含分别管理模块或虚拟主机配置的特定配置片段。

它们是通过符号链接来自它们各自的 *-available/ 对应项的可用配置文件来激活的。这些应该通过使用我们的助手 a2enmod/a2dismod、a2ensite/a2dissite 来管理。有关详细信息,请参见它们各自的手册页。[...]

因此,我对默认文件的所有编辑都没有被 apache 读取。一旦我建立了符号链接,它就起作用了。

于 2014-07-31T13:29:01.237 回答
0

在我的情况下(这是一个共享的 unix 机器),我还需要创建一个隐藏文件“.htaccess”,其中包含以下内容:

Options +ExecCGI
SetHandler cgi-script 

相应地设置权限(755 - 组和其他没有写入但执行权限)以及具有以下内容也很重要:

#!/usr/bin/python

作为 python CGI 脚本的第一行。

于 2015-06-18T20:13:04.853 回答