Por que o apache2 não respeita o meu arquivo envvars?

17

Meus arquivos envvar possuem estas linhas:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Meu apache2.conf possui estas linhas:

# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

Mas quando corro apache2 -M, recebo o seguinte:

apache2: bad user name ${APACHE_RUN_USER}

Uma correção temporária é codificar www-datanele meu arquivo apache2.conf. Houve alguma especulação aqui de que isso ocorreu porque algum script de configuração não substituiu os env vars corretamente no meu arquivo apache2.conf. Independentemente de como faço para o apache2 consultar meu arquivo de envvars?

Como outro ponto de dados, este site parece indicar que os envvars são gerados na compilação, mas lidos pelo apache2ctl em tempo de execução, sugerindo que esse arquivo não é apenas sobra de cocô pelo processo de compilação.

Avery Chan
fonte

Respostas:

30

Depois de examinar a resposta dada por @Lekensteyn, tentei sudo apache2ctl -Mcom meu apache2.conf revertido para o original. Isso funcionou, então eu procurei um pouco nas páginas do manual. Aqui está o que man apache2tinha a dizer:

In  general, apache2 should not be invoked directly, but rather should 
be invoked via /etc/init.d/apache2 or apache2ctl. The default Debian 
configuration requires environment variables that are defined in 
/etc/apache2/envvars  and  are  not  available  if  apache2  is  
started  directly. However, apache2ctl can be used to pass arbitrary 
arguments to apache2.

Portanto, a resposta para esta pergunta é: você não está usando apache2corretamente; use em apache2ctlvez disso.

Obrigado @Lekensteyn por me apontar na direção certa.

Avery Chan
fonte
A maneira mais correta seria usar o initscript: sudo stop apache2, sudo restart apache2e sudo start apache2( /etc/init.d/apache2 stop, etc.)
Lekensteyn
No meu caso, eu estava adicionando uma umaskconfiguração aos envvars e, mesmo depois de reiniciar o uso apache2ctl restart, ainda não funcionava, mas reiniciar usando service apache2 restartfuncionou ( service apache2 gracefulnão funcionou).
precisa saber é o seguinte
é recomendável o uso do serviço em vez do apachectl, mas se você precisar usar comandos não vinculados ao comando service, como apachectl -S ... essa resposta é ótima. Enviado em
Sexta
FYI: a Fazer /etc/init.d apache2 reloadnão vai pegar as envvarsadições, você tem que parar e iniciar o servidor
ThaDon
7

Em http://httpd.apache.org/docs/2.2/configuring.html :

Os valores das variáveis ​​de ambiente do shell podem ser usados ​​nas linhas do arquivo de configuração usando a sintaxe $ {ENVVAR}. Se "ENVVAR" for o nome de uma variável de ambiente válida, o valor dessa variável será substituído nesse ponto na linha do arquivo de configuração e o processamento continuará como se o texto fosse encontrado diretamente no arquivo de configuração. (Se a variável ENVVAR não for encontrada, os caracteres "$ {ENVVAR}" permanecerão inalterados para uso em estágios posteriores no processamento do arquivo de configuração.)

Portanto, a variável é realmente recuperada do ambiente conforme o esperado. Agora, onde isso acontece?

In /etc/init.d/apache2, APACHE_ENVVARSé definido como o caminho do envvarsarquivo que é baseado no caminho initscript. Geralmente resulta em APACHE_ENVVARS=/etc/apache2/envvarsser definido. Agora, como esse valor é igual aos valores padrão, conforme definido apache2ctl, ele não é exportado.

De /usr/sbin/apache2ctl:

# the path to the environment variable file
test -z "$APACHE_ENVVARS" && APACHE_ENVVARS="$APACHE_CONFDIR/envvars"
# pick up any necessary environment variables
if test -f $APACHE_ENVVARS; then
  . $APACHE_ENVVARS
fi

Explicação: se APACHE_ENVVARSestiver vazio, use o caminho padrão que é /etc/apache2/envvars. Se esse arquivo existir, "origine" (execute os comandos desse arquivo no ambiente atual).

Verifique se o envvarsarquivo não contém erros de sintaxe. Para executar essa verificação, use:

sh -n /etc/apache2/envvars && echo Syntax OK || echo FAIL

Os erros são impressos, se houver.

Lekensteyn
fonte
Realizei a verificação e posso verificar se meus envvars não contêm erros de sintaxe. Eu encontrei uma solução; veja minha resposta abaixo.
Avery Chan