如何在Ubuntu 16.04上的Apache2服务器上运行Python CGI脚本?

6
我是一个新手,所以我看了一些教程。我有一个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 请告诉我如何执行并解决问题?谢谢。
4个回答

13

从零开始在Ubuntu上的apache2服务器上编写Python CGI脚本(已在Ubuntu 20.04上测试),请按照以下步骤进行操作(假设Python已安装并正常工作)。

  1. Install apache2 sever.

    sudo apt install apache2
    
  2. Enable CGI module.

    sudo a2enmod cgi
    
在这里,我们将/var/www/cgi-bin/设置为cgi-bin目录。如果你想要不同的目录,请相应地更改文件。
  1. Open Apache server configuration file [/etc/apache2/apache2.conf] by,

    sudo gedit /etc/apache2/apache2.conf
    

    And following lines to the end of the file.

    #########     Adding capaility to run CGI-scripts #################
    ServerName localhost
    ScriptAlias /cgi-bin/ /var/www/cgi-bin/
    Options +ExecCGI
    AddHandler cgi-script .cgi .pl .py
    
  2. Open file /etc/apache2/conf-available/serve-cgi-bin.conf by,

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

    Change lines :

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

    To :

    ScriptAlias /cgi-bin/ /var/www/cgi-bin/
    <Directory "/var/www/cgi-bin/">
        AllowOverride None
        Options +ExecCGI
    </Directory>
    
  3. Now restart apache2 server by,

    sudo service apache2 restart
    
  4. Now create python script say, first.py inside directory /var/www/cgi-bin/ by,

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

    and add following sample code :

    #!/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>")
    

    And give executable permission to first.py by,

    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 :)"的网页。

希望这可以帮到你... Happy coding :)


4

以下内容需要添加到您的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的更详细讨论可以在这里找到:在Apache2中执行Python脚本

0

可能你遇到的问题是你在Python 3中运行,而你的代码是用Python 2编写的。将标题更改为Python 2:

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

0

为了仅仅证明概念,使用这个Python脚本;不需要输入或输出。

#!/usr/bin/env python3
import cgitb
cgitb.enable()
outputfile = open("javascriptPython.out", "a")
outputfile.write("Hello from Python\n\n")

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接