`apache2ctl restart` 使 apache 忘记 cgi-bin

`apache2ctl restart` 使 apache 忘记 cgi-bin

在我的 Debian 机器上(运行 Debian 打包的 apache,包 2.4.7-1),每次 apache 通过apache2ctl restart或重新启动apache2ctl graceful时,它都会忘记我的 cgi-bin 目录:

me@aram:~$ sudo apache2ctl graceful-stop
me@aram:~$ sudo apache2ctl graceful
httpd not running, trying to start
me@aram:~$ curl -s http://localhost/cgi-bin/hello
Hello world, from a cgi script.
me@aram:~$ sudo apache2ctl graceful
me@aram:~$ curl -s http://localhost/cgi-bin/hello
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /cgi-bin/hello was not found on this server.</p>
<hr>
<address>Apache/2.4.7 (Debian) Server at localhost Port 80</address>
</body></html>
me@aram:~$ sudo apache2ctl graceful
me@aram:~$ curl -s http://localhost/cgi-bin/hello
Hello world, from a cgi script.
me@aram:~$ sudo apache2ctl graceful; sudo apache2ctl graceful
me@aram:~$ curl -s http://localhost/cgi-bin/hello
Hello world, from a cgi script.
me@aram:~$ sudo apache2ctl graceful
me@aram:~$ curl -s http://localhost/cgi-bin/hello
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /cgi-bin/hello was not found on this server.</p>
<hr>
<address>Apache/2.4.7 (Debian) Server at localhost Port 80</address>
</body></html>
me@aram:~$ sudo apache2ctl graceful
me@aram:~$ curl -s http://localhost/cgi-bin/hello
Hello world, from a cgi script.

这是完全可重复的;如果我完全停止服务器并重新启动它,那就没问题了。之后,重新启动(无论是否正常)都会切换行为。不幸的是,常规作业logrotate会发出正常重新启动,所以我需要让 Apache 始终知道cgi-bin

访问或错误日志中没有任何内容可以将“知道 cgi”重新启动与“不知道 cgi”重新启动区分开来。如果有人评论并提出如何使日志更详细的建议,我会尝试并更新此内容。

我使用的是 Debian 软件包附带的配置(因此它是通过将目录中的一堆文件符号链接-enabled到目录中的现有文件来进行配置的)。以下是我的目录所包含的-available内容,仅供参考:-enabled

me@aram:/etc/apache2$ ls *-enabled
conf-enabled:
000-local-routerblock.conf  charset.conf  javascript-common.conf      other-vhosts-access-log.conf  serve-cgi-bin.conf
apache2-doc.conf            dwww.conf     localized-error-pages.conf  security.conf

mods-enabled:
access_compat.load  authn_core.load       authz_host.load  cgi.load      dir.load    filter.load       mpm_prefork.load  reqtimeout.load  status.load
alias.conf          authn_file.load       authz_user.load  deflate.conf  dnssd.conf  mime.conf         negotiation.conf  setenvif.conf    userdir.conf
alias.load          authz_core.load       autoindex.conf   deflate.load  dnssd.load  mime.load         negotiation.load  setenvif.load    userdir.load
auth_basic.load     authz_groupfile.load  autoindex.load   dir.conf      env.load    mpm_prefork.conf  reqtimeout.conf   status.conf

sites-enabled:
000-default.conf

除 之外,所有这些000-local-routerblock.conf都由 Debian 提供。我已验证删除该配置文件可以修复该问题,因此我怀疑该文件与默认serve-cgi-bin.conf文件之间存在一些奇怪的交互。不过,日志中同样没有证据。

内容000-local-routerblock.conf

Redirect /router /cgi-bin/router
<Location "/cgi-bin/router">
  AuthUserFile /usr/lib/cgi-bin/routerblock/htpasswd
  AuthGroupFile /dev/null
  AuthName ByPassword
  AuthType Basic
  Require user router
</Location>

内容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>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

编辑:我现在已经解决了这个问题,就“我让它工作了”而言。我不知道为什么它会工作,而且它确实工作几乎肯定表明这个版本的 Apache 中存在错误。我留下悬赏金,希望有人能回答到底发生了什么。

无论如何,解决方案不在我引用的任何配置文件中。请记住,此配置的其余部分完全是 Debian 的原版,没有任何关于配置的自定义内容。Debian/etc/apache2/apache2.conf包含以下行:

LogLevel warn

在库存配置中,没有其他LogLevel语句,除了文件中注释掉的语句/etc/apache2/sites-available/000-default.conf。(整个文件位于<VirtualHost *:80>标签内;它设置了DocumentRoot访问日志,但没有其他内容)

LogLevel当我在尝试设置以在日志中获取更多信息时,我偶然发现了这一点:如果我LogLevel在那个VirtualHost标签内有一个语句,它就会起作用。所以现在除了主 apache 配置中的那个之外,我在标签内LogLevel warn还有一个。这有效。如果这个周末我有多余的时间,我想我会尝试设置一个虚拟机,在尽可能干净的环境中重现这一点,然后提交 Debian 错误。LogLevel warn<VirtualHost *:80>000-default.conf

答案1

根据上面的评论和错误报告链接,这似乎是一个最近已解决的有效错误;来自https://bugs.debian.org/743860

发件人: Jean-Michel Vourgère
收件人:[电子邮件保护]
主题:回复:apache2:Apache 在重启时忘记了 /cgi-bin
日期:2015 年 6 月 8 日星期一 00:12:12 +0000

来源:apache2 源版本:2.4.10-1

你好

我们相信您报告的错误已经修复。

感谢您报告此错误,该错误现已关闭。如果您有进一步的意见,请发送至[电子邮件保护],如果合适,维护人员将会重新打开错误报告。

相关内容