Apache2不会运行基于shebang的cgi文件

Apache2不会运行基于shebang的cgi文件

我正在尝试使用 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

您需要执行一些额外的步骤。

  1. 启用 CGI 子系统a2enmod cgid
  2. 取消注释 中的 CGI 处理程序mods-enabled/mime.conf,或在您的特定 vHost 部分中包含此指令

    AddHandler cgi-script .cgi
    
  3. 包含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并根据需要更改位置。

相关内容