¿Es posible usar variables en los archivos de configuración de Apache?
Por ejemplo, cuando configuro un sitio con Django + WSGI, el archivo de configuración podría verse así:
<Directory /path/to/foo/>
Order allow,deny
Allow from all
</Directory>
Alias /foo/static /path/to/foo/static
WSGIScriptAlias /foo /path/to/foo/run_wsgi
Y me gustaría convertir el '/ path / to / foo' en una variable, por lo que solo necesita definirse en un lugar. Algo como:
Variable FOO /path/to/foo
…
¡Gracias!
apache-2.2
David Wolever
fuente
fuente
Mucho más simple usando
Define
palabras clave. Ver Definir Directiva ....
fuente
The variable is always globally defined and not limited to the scope of the surrounding config section.
probablemente signifique (no lo probé por ahora) que, si tiene varios vhosts, no puede usar la misma variable (con un valor diferente) para cada uno.Puede habilitar o deshabilitar bits de configuración con IfDefine, pero eso probablemente no hará lo que quiere. En su lugar, puede establecer variables de entorno en su script de inicio Apache para acceder dentro de la configuración. Por ejemplo, agregando:
a
/etc/init.d/httpd
(antes de la línea que llamahttpd
) en una máquina RHEL pasa el nombre de host de la máquina como una variable. No tiene que ser la salida de un comando; cualquier cosa que establezca una variable en el entorno que se iniciehttpd
está bien. Las variables se pueden usar en la configuración de la siguiente manera:Por supuesto, no estás restringido a la
Header
directiva. Las variables se pueden usar en cualquier lugar, como<Directory ${FOO}>
etc.Si no le gusta esto (y no es tan agradable ...) puede generar una configuración a partir de una plantilla usando m4 o algún otro lenguaje de plantilla.
ADICIONAL :
Hrm, una forma de mejorarlo sería almacenar todas las variables en un archivo externo, tal vez
/etc/httpd/conf/variables.txt
:y luego inclúyalos en su
init.d
script Apache con:antes de llamar
httpd
. Todavía no es brillante, pero al menos separa el script de inicio y las variables.fuente
/etc/sysconfig/httpd
(RedHat, CentOS) o/etc/apache2/envvars
(Ubuntu / Debian). Algunas variables de entorno ya están allí.Puede usar variables de entorno del sistema con mod_env y la directiva PassEnv. Mira aquí
Ejemplo para debian:
Agregue su variable a / etc / apache2 / envvars (apache2ctl utiliza este archivo para definir variables)
Pase su variable a la configuración de Apache
Luego puede acceder a la variable de entorno del sistema como si fuera una variable apache.
fuente
Tuve el mismo problema y, después de investigar un poco, la solución para Apache 2.x que me resolvió exactamente (y nada más) fue esta:
http://people.apache.org/~rjung/mod_define/
Tenga en cuenta que después de desempaquetar, debe compilarlo así (¿parece que la parte de instalación de los documentos se ha olvidado de adherirse a apache2?):
Luego crea
/etc/apache2/mods-available/define.load
:Después de eso, habilite el módulo usando
a2enmod
como lo haría normalmente.Los documentos en el enlace de arriba muestran cómo usarlo. Ahora puede definir cosas de manera muy simple y usarlas directamente, todo dentro de la misma configuración de apache2.
fuente
increíble pero en httpd 2.2 en centos 6.4 esto funciona
exportar env vars en / etc / sysconfig / httpd
entonces simplemente haz esto ...
entonces finalmente ....
fuente
/etc/sysconfig/httpd
contenido entrahttpd -D
(el equivalente a ladefine
directiva) que define las variables apache.Es posible que desee buscar en mod_passenger para apache, que también puede alojar aplicaciones django. Lo usamos con gran éxito. Todo lo que necesitas hacer en el vhost es, mmm, exactamente nada. Lo único que necesita es crear un directorio "público" en la raíz de la aplicación y crear enlaces simbólicos en "público" a sus directorios estáticos como "medios" (esto aumentará el rendimiento del servicio estático) y apunte su DocumentRoot hacia él.
Luego coloque el siguiente archivo en "public /../ passenger_wsgi.py":
Enciende tu navegador: ¡Funciona!
fuente