¿Por qué apache2 no respeta mi archivo envvars?

17

Mis archivos envvar tienen estas líneas:

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

Mi apache2.conf tiene estas líneas:

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

Pero cuando corro apache2 -Mme sale esto:

apache2: bad user name ${APACHE_RUN_USER}

Una solución temporal es codificar www-dataen mi archivo apache2.conf. Se especuló aquí que esto se debía a que algunas secuencias de comandos de configuración no reemplazaban los env correctamente en mi archivo apache2.conf. Independientemente de cómo obtengo apache2 para consultar mi archivo envvars.

Como otro punto de datos, este sitio parece indicar que los envvars se generan en la compilación, pero apache2ctl lo lee en el tiempo de ejecución, lo que sugiere que este archivo no es solo popo sobrante del proceso de compilación.

Avery Chan
fuente

Respuestas:

30

Después de revisar la respuesta dada por @Lekensteyn, intenté sudo apache2ctl -Mcon mi apache2.conf revertido al original. Esto funcionó, así que busqué un poco en las páginas del manual. Esto es lo que man apache2tenía que decir:

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.

Entonces, la respuesta a esta pregunta es: no está utilizando apache2correctamente; utilizar apache2ctlen su lugar.

Gracias @Lekensteyn por señalarme en la dirección correcta.

Avery Chan
fuente
La forma aún más correcto sería utilizar la initscript: sudo stop apache2, sudo restart apache2y sudo start apache2( /etc/init.d/apache2 stop, etc.)
Lekensteyn
En mi caso, estaba agregando una umaskconfiguración a envvars, e incluso después de reiniciar el uso apache2ctl restartaún no funcionaba, pero reiniciar el uso service apache2 restartsí funcionó ( service apache2 gracefulno funcionó).
Matt Browne
se recomienda el uso del servicio en lugar de apachectl, pero si necesita usar comandos no vinculados al comando de servicio, como apachectl -S ... esta respuesta es excelente. voto a favor
Feida Kila
FYI: Hacer un /etc/init.d apache2 reloadno recogerá las envvarsadiciones, debe detener e iniciar el servidor
ThaDon
7

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

Los valores de las variables de entorno de shell se pueden usar en líneas de archivos de configuración utilizando la sintaxis $ {ENVVAR}. Si "ENVVAR" es el nombre de una variable de entorno válida, el valor de esa variable se sustituye en ese punto en la línea del archivo de configuración y el procesamiento continúa como si ese texto se encontrara directamente en el archivo de configuración. (Si no se encuentra la variable ENVVAR, los caracteres "$ {ENVVAR}" no se modifican para su uso en etapas posteriores en el procesamiento del archivo de configuración).

Entonces, la variable se recupera del entorno como se esperaba. Ahora, ¿dónde sucede esto?

En /etc/init.d/apache2, APACHE_ENVVARSse establece en la ruta del envvarsarchivo que se basa en la ruta initscript. Por lo general, APACHE_ENVVARS=/etc/apache2/envvarsse establece. Ahora, dado que este valor es igual a los valores predeterminados establecidos apache2ctl, no se exporta.

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

Explicación: si APACHE_ENVVARSestá vacío, use la ruta predeterminada que es /etc/apache2/envvars. Si este archivo existe, "fuente" (ejecute los comandos de ese archivo en el entorno actual).

Asegúrese de que el envvarsarchivo no contenga ningún error de sintaxis. Para realizar tal verificación, use:

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

Los errores se imprimen si los hay.

Lekensteyn
fuente
Realicé la verificación y puedo verificar que mis envvars no contienen ningún error de sintaxis. Encontré una solución; mira mi respuesta a continuación.
Avery Chan