在我的 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
你好
我们相信您报告的错误已经修复。
感谢您报告此错误,该错误现已关闭。如果您有进一步的意见,请发送至[电子邮件保护],如果合适,维护人员将会重新打开错误报告。