Warum respektiert apache2 meine envvars-Datei nicht?

17

Meine envvar-Dateien enthalten die folgenden Zeilen:

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

Meine apache2.conf enthält folgende Zeilen:

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

Aber wenn ich renne, apache2 -Mbekomme ich Folgendes:

apache2: bad user name ${APACHE_RUN_USER}

Eine vorübergehende Korrektur besteht www-datadarin, meine apache2.conf-Datei fest darin zu codieren. Es wurde spekuliert , dass dies darauf zurückzuführen ist, dass ein Konfigurationsskript die Umgebungsvariablen in meiner Datei apache2.conf nicht korrekt ersetzt hat. Egal wie bekomme ich apache2 meiner envvars Datei zu konsultieren?

Als weiterer Datenpunkt scheint diese Site darauf hinzuweisen, dass die Envvars beim Erstellen generiert, aber zur Laufzeit von apache2ctl gelesen werden.

Avery Chan
quelle

Antworten:

30

Nachdem ich die Antwort von @Lekensteyn durchgesehen hatte, versuchte ich es sudo apache2ctl -Mmit meiner apache2.conf, die auf das Original zurückgesetzt wurde. Das hat funktioniert, also habe ich ein bisschen in den Manpages nachgesehen. Folgendes man apache2musste gesagt werden:

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.

Die Antwort auf diese Frage lautet also: Sie verwenden nicht apache2richtig. Verwenden Sie apache2ctlstattdessen.

Vielen Dank an @Lekensteyn, dass Sie mich in die richtige Richtung gelenkt haben.

Avery Chan
quelle
Die noch richtige Art und Weise würde die Init - Skript verwenden: sudo stop apache2, sudo restart apache2und sudo start apache2( /etc/init.d/apache2 stopusw.)
Lekensteyn
In meinem Fall fügte ich umaskenvvars eine Einstellung hinzu, und selbst nach dem Neustart apache2ctl restartfunktionierte sie immer noch nicht, aber der Neustart mit service apache2 restarthat funktioniert ( service apache2 gracefulnicht).
Matt Browne
Es wird empfohlen, service anstelle von apachectl zu verwenden. Wenn Sie jedoch Befehle verwenden müssen, die nicht mit service verknüpft sind, z. B. apachectl -S ..., ist diese Antwort großartig. upvote
Feida Kila
Zu /etc/init.d apache2 reloadenvvars
Ihrer Information
7

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

Die Werte von Shell-Umgebungsvariablen können in Konfigurationsdateizeilen mit der Syntax $ {ENVVAR} verwendet werden. Wenn "ENVVAR" der Name einer gültigen Umgebungsvariablen ist, wird der Wert dieser Variablen in diese Stelle in der Konfigurationsdateizeile eingesetzt, und die Verarbeitung wird fortgesetzt, als ob dieser Text direkt in der Konfigurationsdatei gefunden worden wäre. (Wenn die Variable ENVVAR nicht gefunden wird, bleiben die Zeichen "$ {ENVVAR}" unverändert, damit sie später in der Verarbeitung der Konfigurationsdatei verwendet werden können.)

Die Variable wird also tatsächlich wie erwartet aus der Umgebung abgerufen. Wo passiert das nun?

In /etc/init.d/apache2, APACHE_ENVVARSwird auf den Pfad der envvarsDatei gesetzt, der auf dem Initscript-Pfad basiert. Dies führt normalerweise dazu, APACHE_ENVVARS=/etc/apache2/envvarsdass festgelegt wird. Da dieser Wert jetzt den in festgelegten Standardwerten entspricht apache2ctl, wird er nicht exportiert.

Von /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

Erläuterung: Wenn APACHE_ENVVARSleer, verwenden Sie den Standardpfad /etc/apache2/envvars. Wenn diese Datei existiert, geben Sie "source" ein (führen Sie die Befehle aus dieser Datei in der aktuellen Umgebung aus).

Stellen Sie sicher, dass die envvarsDatei keine Syntaxfehler enthält. Um eine solche Prüfung durchzuführen, verwenden Sie:

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

Eventuell auftretende Fehler werden gedruckt.

Lekensteyn
quelle
Ich habe die Überprüfung durchgeführt und kann überprüfen, ob meine Envvars keine Syntaxfehler enthalten. Ich habe eine Lösung gefunden; siehe meine Antwort unten.
Avery Chan