Na minha máquina Debian (rodando o apache como empacotado pela Debian, pacote 2.4.7-1), toda vez que o apache reinicia através de apache2ctl restart
ou apache2ctl graceful
, ele esquece do meu diretório 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.
Isso é perfeitamente repetível; se eu parar completamente o servidor e reiniciá-lo, tudo bem. Depois disso, um reinício (gracioso ou não) muda de comportamento. Infelizmente, a tarefa regular logrotate
emite uma reinicialização normal, por isso preciso fazer com que o Apache sempre saiba sobre cgi-bin
.
Não há nada no log de acesso ou erro para marcar uma reinicialização "saberá sobre cgi" de uma reinicialização "não sei sobre cgi". Se as pessoas comentarem com sugestões sobre como tornar os logs mais detalhados, tentarei e atualizarei isso.
Eu estou usando a configuração que o pacote Debian vem com (por isso é configurado através da associação simbólica de vários arquivos em -enabled
diretórios a arquivos existentes em -available
diretórios). Aqui, para referência, estão os meus diretórios -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
Todos esses, exceto 000-local-routerblock.conf
, são enviados pelo Debian. Eu verifiquei que a remoção desse arquivo de configuração corrige o problema, então suspeito que seja uma interação estranha entre esse arquivo e o arquivo serve-cgi-bin.conf
padrão. Mais uma vez, porém, nenhuma evidência nos registros.
Conteúdo de 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>
Conteúdo de 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
EDIT: Eu resolvi isso agora, em termos de "eu fiz isso funcionar". Eu não tenho idéia do porque isso funciona, e isso quase certamente indica um bug nesta versão do Apache. Estou deixando a recompensa por alguém para responder sobre o que está acontecendo.
Em qualquer caso, a solução não estava em nenhuma das configurações. arquivos que citei. Lembre-se, o resto desta configuração é exatamente do Debian, nada personalizado sobre a configuração. O Debian /etc/apache2/apache2.conf
inclui a linha:
LogLevel warn
Na configuração de estoque, não há outras instruções LogLevel
, exceto uma comentada no arquivo /etc/apache2/sites-available/000-default.conf
. (esse arquivo inteiro está dentro de uma tag <VirtualHost *:80>
; configura DocumentRoot
e o log de acesso, mas nada mais)
Eu estava brincando com LogLevel
configurações tentando obter mais informações em meus registros quando me deparei com isso: se eu tiver uma instrução LogLevel
dentro dessa tag VirtualHost
, ela funciona. Então agora, além do LogLevel warn
que está na configuração principal do apache, eu também tenho um LogLevel warn
dentro da tag <VirtualHost *:80>
em 000-default.conf
. Isso funciona. Se eu tiver tempo extra neste final de semana, acho que vou tentar configurar uma máquina virtual para reproduzir isso em um ambiente o mais limpo possível e, em seguida, arquivar um bug do Debian.