我正在尝试使用 Python 作为服务器脚本语言而不是 PHP。
我已经配置了 localhost 并且 php 文件在它下运行良好。
如果我创建一个文件 .../localhost/temp/test.cgi (使其可执行):
#!/home/mike/python_venvs/test_venv369/bin/python
print( """Content-type:text/html\n\n
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
TEST
<title>My server-side template</title>
</head>
<body>""" )
print( "</body></html>")
...它不作为 Python 脚本运行:文件的文本仅显示在浏览器中。
我对此做了很多搜索。我没有这样的文件,例如 httpd.conf。我的 Apache2 设置是这样的:在 /usr/sbin/apache2 中可执行,大多数配置文件显然在 /etc/apache2 下,特别是,看起来 /sites-available,其中有两个文件,000-default.conf 和默认-ssl.conf。
我可能是错的,但我相信 httpd.conf 是“旧的”Apache 的做事方式。
我在 000-default.conf 的底部发现了一条完全令人困惑但(只是)可能有希望的行:
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
...所以我取消注释并重新启动 apache2 服务。没有不同。
000-default.conf 的详细信息
(在 /etc/apache2/sites-available 中)。注意,当我努力更改 localhost 目录时,此文件中的更改似乎可以做到这一点。
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that...
ServerAdmin webmaster@localhost
DocumentRoot "/media/mike/W10 D drive/My Documents/localhost"
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /media/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Require all granted
</Directory>
...
我不知道 CGI 脚本应该去哪里或在哪里配置它们(尽管我将检查下面的第一个答案),但考虑到我希望它们与 .../localhost 下的 .html 文件一起使用/ 如上所述,我希望该位置“启用 CGI”。
之后
事实证明,在我的例子中,这个问题的简短答案(具体来说)是简单地将“ExecCGI”添加为<Directory>
标签或块或任何名称中的“选项”之一。
答案1
您需要执行一些额外的步骤。
- 启用 CGI 子系统
a2enmod cgid
取消注释 中的 CGI 处理程序
mods-enabled/mime.conf
,或在您的特定 vHost 部分中包含此指令AddHandler cgi-script .cgi
包含
Options ExecCGI
在您希望这些程序可用的虚拟主机或最顶层目录中
为了进行测试,我所做的是将 CGI 处理程序和ExecCGI
语句包含在我的sites-enabled/000-default.conf
文件中
<VirtualHost *:80>
...
AddHandler cgi-script .cgi
<Directory "/var/www/html">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
</VirtualHost>
然后我就能够创建并运行可执行脚本,例如time.cgi
答案2
您的 Apache 设置看起来像是在 Debian 上,并且在我的系统上serve-cgi-bin.conf
已经启用,即有一个
/etc/apache2/conf-enabled/serve-cgi-bin.conf
到../conf-available/serve-cgi-bin.conf
.
如果您的系统上缺少符号链接,请运行
sudo a2enconf serve-cgi-bin
您不需要取消注释中的行000-default.conf
。
该文件如下所示:
$ cat /etc/apache2/conf-available/serve-cgi-bin.conf
<IfModule mod_alias.c>
<IfModule mod_cgi.c>
Define ENABLE_USR_LIB_CGI_BIN
</IfModule>
<IfModule mod_cgid.c>
Define ENABLE_USR_LIB_CGI_BIN
</IfModule>
<IfDefine ENABLE_USR_LIB_CGI_BIN>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
</IfDefine>
</IfModule>
cgi 目录是/usr/lib/cgi-bin
,将您的可执行文件移动到该目录中。您需要启用模组_cgi或者mod_cgid,我们采取第一个并重新启动服务器。
sudo a2enmod cgi
sudo systemctl restart apache2
去http://localhost/cgi-bin/test.cgi你应该会看到“TEST”。
如果您想使用不同的目录或不同的ScriptAlias
路径,您可以禁用serve-cgi-bin.conf
( sudo a2disconf serve-cgi-bin
) 并将内容复制serve-cgi-bin.conf
到您的目录中VirtualHost
并根据需要更改位置。