Назад | Перейти на главную страницу

`apache2ctl restart` заставляет apache забыть о cgi-bin

На моей машине 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, и сопровождающий при необходимости повторно откроет отчет об ошибке.