web-dev-qa-db-fra.com

Pourquoi Apache2 ne respecte-t-il pas mon fichier envvars?

Mes fichiers envvar ont ces lignes:

export Apache_RUN_USER=www-data
export Apache_RUN_GROUP=www-data

Mon Apache2.conf contient ces lignes:

# These need to be set in /etc/Apache2/envvars
User ${Apache_RUN_USER}
Group ${Apache_RUN_GROUP}

Mais quand je lance Apache2 -M je reçois ceci:

Apache2: bad user name ${Apache_RUN_USER}

Un correctif temporaire consiste à coder www-data dans mon fichier Apache2.conf. Il y avait quelques spéculations ici que c'était parce qu'un script de configuration ne remplaçait pas correctement les vars env dans mon fichier Apache2.conf. Peu importe comment puis-je demander à Apache2 de consulter mon fichier envvars?

Un autre point de données ce site semble indiquer que les envvars sont générés lors de la construction, mais lus par Apache2ctl lors de l'exécution, suggérant que ce fichier n'est pas simplement laissé comme une saloperie par le processus de construction.

16
Avery Chan

Après avoir parcouru la réponse donnée par @Lekensteyn, j'ai essayé Sudo Apache2ctl -M avec mon Apache2.conf rétabli à l'original. Cela a fonctionné, alors j'ai un peu fouillé dans les pages de manuel. Voici ce que man Apache2 avait à dire:

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.

La réponse à cette question est donc la suivante: Vous n’utilisez pas Apache2 correctement; utilisez plutôt Apache2ctl.

Merci @Lekensteyn de m'avoir orienté dans la bonne direction.

29
Avery Chan

De http://httpd.Apache.org/docs/2.2/configuring.html :

Les valeurs des variables d'environnement Shell peuvent être utilisées dans les lignes du fichier de configuration à l'aide de la syntaxe $ {ENVVAR}. Si "ENVVAR" est le nom d'une variable d'environnement valide, la valeur de cette variable est substituée à cet endroit dans la ligne du fichier de configuration et le traitement continue comme si ce texte avait été trouvé directement dans le fichier de configuration. (Si la variable ENVVAR n’est pas trouvée, les caractères "$ {ENVVAR}" restent inchangés pour pouvoir être utilisés ultérieurement dans le traitement du fichier de configuration.)

Ainsi, la variable est effectivement extraite de l'environnement comme prévu. Maintenant, où cela se produit-il?

Dans /etc/init.d/Apache2, Apache_ENVVARS est défini sur le chemin du fichier envvars qui est basé sur le chemin initscript. Il en résulte généralement que Apache_ENVVARS=/etc/Apache2/envvars est défini. Maintenant, puisque cette valeur est égale aux valeurs par défaut définies dans Apache2ctl, elle n’est pas exportée.

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

Explication: si Apache_ENVVARS est vide, utilisez le chemin par défaut, /etc/Apache2/envvars. Si ce fichier existe, "source" le (exécutez les commandes de ce fichier dans l'environnement actuel).

Assurez-vous que le fichier envvars ne contient aucune erreur de syntaxe. Pour effectuer une telle vérification, utilisez:

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

Les erreurs sont imprimées le cas échéant.

6
Lekensteyn