【问题标题】:Trouble running python script as cgi under apache (ubuntu 12)在apache(ubuntu 12)下将python脚本作为cgi运行时出现问题
【发布时间】:2013-11-03 21:04:32
【问题描述】:

披露:我搜索了很多,但我认为我的问题(对于我的配置)在这里没有得到解答。例如 run python script as cgi apache server 没有回答。

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

#!/usr/bin/env python

print "Content-type: text/html"
print ""

print "<h1>Hello from Python!</h1>"

当我在浏览器中运行它时,它实际上会显示自己而不是预期 来自 Python 的您好!

我做了以下让它运行:

a) 每个人都可以执行;它完美地在 shell 中运行。

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

【问题讨论】:

  • 只是为了确定:你把脚本放在哪里了?您是否启用了 Apache 站点 (a2ensite my_cgi_dir)?
  • chmod +x? www-data 可读吗? mod_python 在这里完全无关紧要,顺便说一句。
  • @Robin Krahl:不知道 a2ensite 是什么意思。我把脚本放到/var/www/my_cgi_dir/。它(站点)正在工作,除了它不作为 python 运行它,只是显示它的文本。我还把一些 index.html 放到这个目录中:工作得很好。
  • @jhermann:请参阅我的 OP 中的 a)。

标签: python apache ubuntu cgi


【解决方案1】:

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

Options +ExecCGI
SetHandler cgi-script 

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

#!/usr/bin/python

作为 python CGI 脚本的第一行。

【讨论】:

    【解决方案2】:

    这对我有用,, 正如@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 脚本是否在终端中运行良好且没有错误。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      它们是通过符号链接从它们的可用配置文件中激活的 各自的 *-available/ 对应物。这些应该通过使用我们的管理 助手 a2enmod/a2dismod、a2ensite/a2dissite。看 其各自的手册页以获取详细信息。 [...]

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

      【讨论】:

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

        【讨论】:

          【解决方案5】:

          就我而言,我的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.
          

          【讨论】:

          • 所以,正如您所说,ScriptAlias 指令在您的/etc/apache2/sites-available/my_cgi_dir 文件中,但它也在您的/etc/apache2/sites-enabled/000-default 文件中吗? (顺便说一句,这就是 a2ensite 的用途。)我很确定您的 ScriptAlias 指令没有指向您的脚本所在的目录。
          【解决方案6】:

          试试这个

              <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>
          

          【讨论】:

          • 我不确定应该在哪里添加此配置部分;所以我尝试在 > Directory /var/www/my_cgi_dir/> 之前添加它——无论如何,它没有帮助,对不起。
          • 尝试将此部分也添加到 apache2.conf 中:效果相同(无效)。
          • 尝试进入“/etc/apache2/sites-enabled/000-default”
          猜你喜欢
          • 2013-03-30
          • 2011-12-17
          • 1970-01-01
          • 2013-03-11
          • 2011-12-23
          • 1970-01-01
          • 1970-01-01
          • 2020-03-20
          • 2016-09-11
          相关资源
          最近更新 更多