На моей машине Debian (на которой запущен apache из пакета Debian, пакет 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
тег, это работает. Так что теперь в дополнение к LogLevel warn
это в основной конфигурации apache, у меня также есть LogLevel warn
внутри <VirtualHost *:80>
тег в 000-default.conf
. Это работает. Если в эти выходные у меня будет дополнительное время, я думаю, я попытаюсь настроить виртуальную машину, чтобы воспроизвести это в максимально чистой среде, а затем сообщу об ошибке Debian.
Судя по приведенным выше комментариям и ссылке на отчет об ошибке, это действительно действительная ошибка, которая была недавно исправлена; из https://bugs.debian.org/743860 :
От: Жан-Мишель Вурьер
Кому: 743860-done@bugs.debian.org
Тема: Re: apache2: Apache забывает про / cgi-bin при перезапуске
Дата: Пн, 8 июня 2015 г., 00:12:12 +0000Источник: apache2 Версия источника: 2.4.10-1
Привет
Мы считаем, что ошибка, о которой вы сообщили, исправлена.
Спасибо за сообщение об ошибке, которая теперь будет закрыта. Если у вас есть дополнительные комментарии, отправьте их по адресу 743860@bugs.debian.org, и сопровождающий при необходимости повторно откроет отчет об ошибке.