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

13

Meus arquivos envvar têm estas linhas:

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

Meu apache2.conf tem estas linhas:

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

Mas quando eu corro apache2 -M eu recebo isso:

apache2: bad user name ${APACHE_RUN_USER}

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

Como outro ponto de dados este site parece indicar que o envvars é gerado na construção, mas lido pelo apache2ctl em tempo de execução, sugerindo que este arquivo não é apenas o resto do cocô pelo processo de construção.

    
por Avery Chan 05.06.2012 / 10:35

2 respostas

27

Depois de examinar a resposta dada por @Lekensteyn, tentei sudo apache2ctl -M com meu apache2.conf revertido para o original. Isso funcionou, então eu procurei nas páginas de manual um pouco. Veja o que man apache2 tinha 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 a esta pergunta é: Você não está usando apache2 corretamente; use apache2ctl em vez disso.

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

    
por Avery Chan 06.06.2012 / 04:13
6

De link :

  

Os valores das variáveis de ambiente 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 esse texto fosse encontrado diretamente no arquivo de configuração. (Se a variável ENVVAR não for encontrada, os caracteres "$ {ENVVAR}" serão deixados inalterados para uso pelos estágios posteriores no processamento do arquivo de configuração.)

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

Em /etc/init.d/apache2 , APACHE_ENVVARS é definido como o caminho do arquivo envvars , que é baseado no caminho do initscript. Geralmente, resulta em APACHE_ENVVARS=/etc/apache2/envvars sendo definido. Agora, como esse valor é igual aos valores padrão definidos em 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_ENVVARS estiver vazio, use o caminho padrão que é /etc/apache2/envvars . Se este arquivo existe, "source" ele (executa os comandos daquele arquivo no ambiente atual).

Certifique-se de que o arquivo envvars não contenha nenhum erro de sintaxe. Para realizar essa verificação, use:

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

Erros são impressos, se houver.

    
por Lekensteyn 05.06.2012 / 11:23