【问题标题】:How do I run python cgi script on apache2 server on Ubuntu 16.04?如何在 Ubuntu 16.04 的 apache2 服务器上运行 python cgi 脚本?
【发布时间】:2017-07-02 13:06:52
【问题描述】:

我是新手,所以看了一些教程。 我有一个 python 脚本作为 first.py

#!/usr/bin/python3 print "Content-type: text/html\n" print "Hello, world!"

我的电脑上有多个版本的 python。 我无法弄清楚我启用 cgi 的目录,所以我将这段代码粘贴在三个地方

  1. /usr/lib/cgi-bin/first.py

  2. /usr/lib/cups/cgi-bin/first.py

  3. /var/www/html/first.py

现在,当我在终端中运行此代码时,它可以正常工作,但是当我输入时

curl http://localhost/first.py

它只吐出简单的文本并且不执行。

我已将所有权限授予 first.py

我已经通过命令启用并启动了服务器

a2enmod cgi systemctl restart apache2

请告诉我如何执行以及这里发生了什么? 提前致谢。

【问题讨论】:

    标签: python ubuntu apache2 cgi server-side-scripting


    【解决方案1】:

    要在 Ubuntu在 Ubuntu 20.04 上测试)上的 apache2 服务器 上的 python cgi 脚本从头开始,关注这些步骤(预计 python 已安装并完美运行)。

    1. 安装 apache2 服务器。

      sudo apt install apache2
      
    2. 启用 CGI 模块。

      sudo a2enmod cgi
      

    这里我们将/var/www/cgi-bin/设置为cgi-bin目录。如果您想要不同的目录,请适当更改文件。

    1. 通过,打开 Apache 服务器配置文件 [/etc/apache2/apache2.conf],

      sudo gedit /etc/apache2/apache2.conf
      

      以下几行到文件末尾。

      #########     Adding capaility to run CGI-scripts #################
      ServerName localhost
      ScriptAlias /cgi-bin/ /var/www/cgi-bin/
      Options +ExecCGI
      AddHandler cgi-script .cgi .pl .py
      
    2. 打开文件/etc/apache2/conf-available/serve-cgi-bin.conf

      sudo gedit /etc/apache2/conf-available/serve-cgi-bin.conf
      

      换行:

      ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
      <Directory "/usr/lib/cgi-bin">
          AllowOverride None
          Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
          Require all granted
      </Directory>   
      

      收件人:

      ScriptAlias /cgi-bin/ /var/www/cgi-bin/
      <Directory "/var/www/cgi-bin/">
          AllowOverride None
          Options +ExecCGI
      </Directory>
      
    3. 现在重启 apache2 服务器,

      sudo service apache2 restart
      
    4. 现在创建 python 脚本说,first.py 里面的目录 /var/www/cgi-bin/by,

      sudo gedit /var/www/cgi-bin/first.py
      

      并添加以下示例代码:

      #!/usr/bin/env python
      import cgitb
      
      cgitb.enable()
      
      print("Content-Type: text/html;charset=utf-8")
      print ("Content-type:text/html\r\n")
      print("<H1> Hello, From python server :) </H1>")
      

      并通过

      授予first.py可执行权限
      sudo chmod +x /var/www/cgi-bin/first.py
      

    现在curl 可以工作了。

    :~$ curl http://localhost/cgi-bin/first.py
    <H1> Hello, From python server :) </H1>
    

    或打开浏览器并浏览 http://localhost/cgi-bin/first.py。这应该可以工作,并将显示显示“Hello, From python server :)”的网页。

    希望对您有所帮助...祝您编码愉快 :)

    【讨论】:

      【解决方案2】:

      这些行需要在您的 apache2 站点配置文件中 (例如/etc/apache2/sites-available/default-ssl.conf 如果您的网站使用 HTTPS):

      <Directory /var/www/yoursite/yourdir/>
          Options +ExecCGI
          PassEnv LANG
          AddHandler cgi-script .py
      </Directory>
      

      将它们添加到您想要的目录并重新启动 apache2。您可能还需要添加

      AddHandler python-program .py
      

      如果您的 httpd.conf 还没有的话。

      有关 python 脚本和 apache2 的更详细讨论可在此处找到:Executing a Python script in Apache2

      【讨论】:

        【解决方案3】:

        可能是您在 Python 3 中运行的问题,而您的代码是用 Python 2 编写的 把标题改成python2:

        #!/usr/bin/python
        print "Content-type: text/html\n"
        print "Hello, world!"
        

        【讨论】:

          【解决方案4】:

          anoopknr,感谢您回复原始人,您发布的内容有所帮助,但是,当我执行sudo a2enmod cgi 时出现小错误或其他问题,它显示为Your MPM seems to be threaded. Selecting cgid instead of cgi. Module cgid already enabled,我试图调查一下并发现有人说我的 Apache2 版本不支持 cgi(在 apt 上运行最新版本),我有几个问题,1:cgid 的设置是否相同?如果不能,您能否解释如何为 cgid 做这件事,或者,有没有办法让我在安装 Apache2 版本的东西时获得 cgi:Server version: Apache/2.4.41 (Ubuntu) Server built: 2022-01-05T14:49:56

          【讨论】:

          • 哦,我也无法访问我的 python 文件,它说权限被拒绝,即使我这样做sudo chmod +x /var/www/api/index.py(这是我服务器上的位置)
          • 没关系,我发现了我的问题 :)
          • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
          猜你喜欢
          • 2011-09-30
          • 2016-12-08
          • 1970-01-01
          • 2018-01-30
          • 2019-08-06
          • 2020-04-07
          • 1970-01-01
          • 2012-07-27
          相关资源
          最近更新 更多