Dlaczego apache2 nie szanuje mojego pliku envvars?

17

Moje pliki envvar mają w sobie następujące linie:

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

Mój apache2.conf zawiera następujące linie:

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

Ale kiedy biegnę apache2 -M, dostaję to:

apache2: bad user name ${APACHE_RUN_USER}

Tymczasową poprawką jest umieszczenie na www-datastałe mojego pliku apache2.conf. Pojawiły się spekulacje , że to dlatego, że jakiś skrypt konfiguracyjny nie zastąpił poprawnie zmiennych env w moim pliku apache2.conf. Niezależnie od tego, w jaki sposób mogę uzyskać apache2 do przeglądania mojego pliku envvars?

Jako kolejny punkt danych ta witryna wydaje się wskazywać, że środowisko envvars jest generowane podczas kompilacji, ale czytane przez apache2ctl w czasie wykonywania, co sugeruje, że ten plik nie jest tylko kupą pozostałą po procesie kompilacji.

Avery Chan
źródło

Odpowiedzi:

30

Po przejrzeniu odpowiedzi udzielonej przez @Lekensteyn spróbowałem sudo apache2ctl -Mz moim apache2.conf przywróconym do oryginału. To zadziałało, więc trochę przekopałem strony podręcznika. Oto, co man apache2miał do powiedzenia:

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.

Odpowiedź na to pytanie brzmi: nie używasz apache2poprawnie; użyj apache2ctlzamiast tego.

Dzięki @Lekensteyn za wskazanie mi właściwego kierunku.

Avery Chan
źródło
Jeszcze bardziej poprawny sposób będzie za pomocą skryptu startowego: sudo stop apache2, sudo restart apache2i sudo start apache2( /etc/init.d/apache2 stop, etc.)
Lekensteyn
W moim przypadku umaskdodawałem ustawienie do envvars i nawet po ponownym uruchomieniu za pomocą apache2ctl restartnadal nie działało, ale ponowne uruchomienie za pomocą service apache2 restartdziałało ( service apache2 gracefulnie działało ).
Matt Browne
zaleca się użycie usługi zamiast apachectl, ale jeśli potrzebujesz użyć poleceń niepowiązanych z poleceniem service, takich jak apachectl -S ... ta odpowiedź jest świetna. głosowanie
Feida Kila
FYI: Wykonanie /etc/init.d apache2 reloadnie spowoduje odebrania envvarsdodatków, musisz zatrzymać i uruchomić serwer
ThaDon
7

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

Wartości zmiennych środowiskowych powłoki można wykorzystać w wierszach pliku konfiguracyjnego, używając składni $ {ENVVAR}. Jeśli „ENVVAR” jest nazwą prawidłowej zmiennej środowiskowej, wartość tej zmiennej jest podstawiana w to miejsce w linii pliku konfiguracyjnego, a przetwarzanie jest kontynuowane tak, jakby ten tekst został znaleziony bezpośrednio w pliku konfiguracyjnym. (Jeśli zmienna ENVVAR nie zostanie znaleziona, znaki „$ {ENVVAR}” pozostaną niezmienione do wykorzystania przez późniejsze etapy przetwarzania pliku konfiguracyjnego.)

Tak więc zmienna jest rzeczywiście pobierana ze środowiska zgodnie z oczekiwaniami. Gdzie to się teraz dzieje?

W /etc/init.d/apache2, APACHE_ENVVARSjest ustawiony na ścieżce envvarspliku, który jest oparty na skryptu startowego ścieżki. Zwykle powoduje APACHE_ENVVARS=/etc/apache2/envvarsto ustawienie. Ponieważ ta wartość jest równa wartościom domyślnym ustawionym w apache2ctl, nie jest eksportowana.

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

Objaśnienie: jeśli APACHE_ENVVARSjest pusty, użyj domyślnej ścieżki, którą jest /etc/apache2/envvars. Jeśli ten plik istnieje, „źródłowy” go (wykonaj polecenia z tego pliku w bieżącym środowisku).

Upewnij się, że envvarsplik nie zawiera żadnych błędów składniowych. Aby wykonać taką kontrolę, użyj:

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

Błędy są drukowane, jeśli występują.

Lekensteyn
źródło
Przeprowadziłem kontrolę i mogę zweryfikować, czy moje envvars nie zawierają żadnych błędów składniowych. Znalazłem rozwiązanie; patrz moja odpowiedź poniżej.
Avery Chan,