如何在 Linux 上的 Apache 中将 Python 作为 CGI 模块安装如何在 Linux 上的 Apache 中将 Python 作为 CGI 模块安装如何在 Linux 上的 Apache 中将 Python 作为 CGI 模块安装如何在 Linux 上的 Apache 中将 Python 作为 CGI 模块安装
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Linux 上的 Apache 中将 Python 作为 CGI 模块安装

目录

1。如何在网络服务器上运行 Python 脚本

2。如何在 Debian 上的 Apache 中将 Python 设置为 CGI 模块(Ubuntu、Linux Mint、Kali Linux)

2.1 为单个目录设置Python CGI

2.2 为整个网络服务器设置Python CGI

3。如何在 Arch Linux(Manjaro、BlackArch)上的 Apache 中将 Python 设置为 CGI 模块

3.1 为单个目录设置 Python CGI

3.2 为整个网络服务器设置Python CGI

4。配置 Python CGI 时出错

4.1 Web服务器不执行而是显示Python脚本源码,或者下载文件不执行

4.2 服务器错误“Error 500. End of script output before headers”仅适用于 Python 脚本(否则网络服务器工作正常)

4.3 服务器错误“错误 500。来自脚本 'test.py' 的格式错误的标头:错误的标头”

4.4 错误“无法访问此站点。本地主机拒绝连接”

5。有用的链接

如何在 Web 服务器上运行 Python 脚本

Python 支持通用网关接口(CGI),即用 Python 编写的程序(脚本)可以与信息服务器进行交互,例如 HTTP 服务器(例如 Apache)。

即使 Python 未作为 Web 服务器 CGI 模块安装,Web 服务器也可以运行 Python 脚本并输出结果数据。

例如,在下面的 PHP 脚本中,脚本使用 POST 方法从表单接收数据,然后运行 Python 程序,将接收到的数据作为命令行参数传递:


<?php

echo shell_exec ('python /srv/http/test-python/script.py ' . $_POST["name"] . ' ' . $_POST["surname"] . ' '. $_POST["info"]);

Python脚本执行完成后,会显示从script.py接收到的信息。

虽然这种方法有优点——无需将 Python 配置为 Web 服务器 CGI 模块——但也有一些缺点。

如果 Python 未作为 CGI 模块安装,则:

  1. 必须使用 PHP 来运行 Python 脚本
  2. Python 脚本无法直接访问通过 GET 和 POST 方法传递的数据。

因此,将 Python 配置为 Web 服务器 CGI 模块可以直接运行脚本并直接访问 Web 服务器环境变量,包括通过 GET 和 POST 方法传递的数据。

以下是如何将 Python 设置为 Apache 作为两组发行版的 CGI:

  • Debian 和衍生发行版(Ubuntu、Linux Mint、Kali Linux)
  • Arch Linux 衍生发行版(Manjaro、BlackArch)

将 Python 安装到操作系统的步骤被跳过,因为大多数操作系统默认预装了 Python。如果您的 Linux 上没有 Python,请先安装它。

有 2 个设置选项:

  • 如果 Python 脚本被放置在 Web 服务器上的一个特殊目录中(例如 cgi-bin),则它们仅由 CGI 模块处理
  • Python 脚本由任何网络服务器文件夹中的 CGI 模块处理

另请参阅:如何在 Python 脚本中使用 GET 和 POST 方法从网页获取数据

如何在 Debian 上的 Apache 中将 Python 设置为 CGI 模块(Ubuntu、Linux Mint、Kali Linux)

为单个目录设置 Python CGI

运行命令以启用 CGI 模块:


sudo a2enmod cgi

重新启动 Web 服务器以使更改生效:


sudo systemctl restart apache2

创建文件/usr/lib/cgi-bin/test.py:


sudo gedit /usr/lib/cgi-bin/test.py

将以下内容复制到此文件中:


#!/usr/bin/python3

print ("Content-type: text/html")
print ("")
print ("")
print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

使这个文件可执行:


sudo chmod +x /usr/lib/cgi-bin/test.py

在网络浏览器中打开 http://localhost/cgi-bin/test.py

如果一切配置正确,那么您应该会在网络浏览器中看到一行


Hello.

注意:如果您想为 CGI 脚本使用另一个文件夹而不是 /usr/lib/cgi-bin/ 目录,请在 /etc 中指定它/apache2/conf-enabled/serve-cgi-bin.conf 文件。

为整个网络服务器设置 Python CGI

运行命令以启用 CGI 模块:


sudo a2enmod cgi

打开/etc/httpd/conf/httpd.conf文件——web服务器配置文件:


sudo gedit /etc/httpd/conf/httpd.conf

在那里找到一组线


<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>

并将它们替换为


<Directory /var/www/>
	Options Indexes FollowSymLinks ExecCGI
	AllowOverride None
	Require all granted
</Directory>

注意:您的选项集可能有所不同。

将以下行添加到文件末尾:


AddHandler cgi-script .cgi .py

关闭文件。

重新启动 Web 服务器以使更改生效:


sudo systemctl restart apache2

创建文件/var/www/html/test.py:


sudo gedit /var/www/html/test.py

将以下内容复制到此文件中:


#!/usr/bin/python3

print ("Content-type: text/html")
print ("")
print ("")
print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

使这个文件可执行:


sudo chmod +x /var/www/html/test.py

在网络浏览器中打开 http://localhost/test.py

如果一切配置正确,那么您应该会在网络浏览器中看到一行


Hello.

如何在 Arch Linux 上的 Apache 中将 Python 设置为 CGI 模块(Manjaro、BlackArch)

为单个目录设置 Python CGI

创建目录 /srv/http/cgi-bin/ - 这是 Python 脚本所在的位置:


sudo mkdir /srv/http/cgi-bin/

打开/etc/httpd/conf/httpd.conf文件——web服务器配置文件:


sudo gedit /etc/httpd/conf/httpd.conf

查找一组行:


<Directory "/srv/http/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

并将其替换为:


<Directory "/srv/http/cgi-bin">
    AllowOverride None
    Options ExecCGI
    Require all granted
</Directory>

注意:如果您没有看到差异,请注意“Options”指令——添加了“ExecCGI”选项。

查找一组行


<IfModule mpm_prefork_module>
	#LoadModule cgi_module modules/mod_cgi.so
</IfModule>

并替换为


<IfModule mpm_prefork_module>
	LoadModule cgi_module modules/mod_cgi.so
</IfModule>

也就是说,取消注释该行。

注意这条线


ScriptAlias /cgi-bin/ "/srv/http/cgi-bin/"

没有必要改变它,但如果你愿意,你可以使用任何其他文件夹而不是 /srv/http/cgi-bin/,你只需要创建一个新文件夹并指定它这个指令而不是 /srv/http/cgi-bin/。

关闭文件。

重新启动 Web 服务器以使更改生效:


sudo systemctl restart httpd.service

创建文件/srv/http/cgi-bin/test.py:


sudo gedit /srv/http/cgi-bin/test.py

将以下内容复制到此文件中:


#!/usr/bin/python3

print ("Content-type: text/html")
print ("")
print ("")
print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

使这个文件可执行:


sudo chmod +x /srv/http/cgi-bin/test.py

在网络浏览器中打开 http://localhost/cgi-bin/test.py

如果一切配置正确,那么您应该会在网络浏览器中看到一行


Hello.

为整个网络服务器设置 Python CGI

打开/etc/httpd/conf/httpd.conf文件——web服务器配置文件:


sudo gedit /etc/httpd/conf/httpd.conf

查找一组行


<IfModule mpm_prefork_module>
	#LoadModule cgi_module modules/mod_cgi.so
</IfModule>

并替换为


<IfModule mpm_prefork_module>
	LoadModule cgi_module modules/mod_cgi.so
</IfModule>

也就是说,取消注释该行。

然后找到线


Options Indexes FollowSymLinks

并向其添加“ExecCGI”。您应该得到以下行(注意:您的选项集可能不同):


Options Indexes FollowSymLinks ExecCGI

现在找到该行:


#AddHandler cgi-script .cgi

取消注释,即去掉行首的#符号,在行尾添加.py。新行看起来像这样:


AddHandler cgi-script .cgi .py

关闭文件。

重新启动 Web 服务器以使更改生效:


sudo systemctl restart httpd.service

创建文件/srv/http/test.py:


sudo gedit /srv/http/test.py

将以下内容复制到此文件中:


#!/usr/bin/python3

print ("Content-type: text/html")
print ("")
print ("")
print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

使这个文件可执行:


sudo chmod +x /srv/http/cgi-bin/test.py

在网络浏览器中打开 http://localhost/test.py

如果一切配置正确,那么您应该会在网络浏览器中看到一行


Hello.

配置 Python CGI 时出错

Web 服务器不执行而是显示 Python 脚本的源代码,或者下载文件而不是执行

这意味着 CGI 设置尚未完成或未完成。原因可能是:

  • 更改配置文件后网络服务器未重新启动
  • 你编辑了错误的配置文件
  • 您已将 CGI 脚本配置为仅在一个文件夹中运行,但您正试图在另一个文件夹中运行该脚本

服务器错误“Error 500. End of script output before headers”仅适用于 Python 脚本(否则网络服务器工作正常)

尝试在 Web 服务器上执行 Python 脚本时 Web 浏览器显示的错误示例:


Server error!
The server encountered an internal error and was unable to complete your request.

Error message:
End of script output before headers: test.py

If you think this is a server error, please contact the webmaster.

Error 500

错误的原因可能是:

  • Python文件不可执行(没有执行权限)
  • Python 程序存在语法错误导致脚本提前终止

要检查脚本是否有权运行,您可以使用带有 -l 选项的 ls 实用程序,然后指定文件的完整路径:


ls -l /srv/http/cgi-bin/test.py

示例输出:


-rwxr-xr-x 1 root root 127 May 20 13:11 /srv/http/cgi-bin/test.py

字母“x”表示它有权限作为程序运行。

要检查语法错误,请在命令行上运行脚本,并在其前面加上完整路径:


/srv/http/cgi-bin/test.py

服务器错误“错误 500。来自脚本 'test.py' 的格式错误的标头:标头错误”

另一个错误的例子:


Server error!
The server encountered an internal error and was unable to complete your request.

Error message:
malformed header from script 'test.py': Bad header: <html><head>

If you think this is a server error, please contact the webmaster.

Error 500

关键是消息“来自脚本的格式错误的标头”,即不正确的标头。

这是指 HTTP 协议标头。当 Python 作为 CGI 运行时,脚本应该通过发送一个 HTTP 标头后跟两个空行来开始其输出。

例如,下面的代码会抛出一个错误:


#!/usr/bin/python3

print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

为避免错误,代码应如下所示:


#!/usr/bin/python3

print ("Content-type: text/html")
print ("")
print ("")
print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

错误“无法访问此站点。本地主机拒绝连接”

如果在更改 Apache 配置文件后,您开始收到错误消息:


This site can’t be reached

localhost refused to connect.

很可能是 Apache 配置不正确,因此无法重新启动 Web 服务器。

该错误可能是由于语法不正确造成的。

要查看 Debian 和衍生发行版上 Web 服务器的状态,请运行以下命令:


sudo systemctl status apache2

要查看 Arch Linux 和衍生发行版上的 Web 服务器状态,请运行以下命令:


sudo systemctl status httpd.service

有用的链接:

  • https://docs.python.org/3/library/cgi.html
  • https://www.tutorialspoint.com/python/python_cgi_programming.htm

©2015-2025 艾丽卡 support@alaica.com