74 votos

¿Utilizar variables en los archivos de configuración de Apache para reducir la duplicación?

¿Es posible utilizar variables en los archivos de configuración de Apache?

Por ejemplo, cuando estoy configurando un sitio con Django+WSGI, el archivo de configuración podría ser 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 '/ruta/to/foo' en una variable para que sólo tenga que definirse en un lugar. Algo así como:

Variable FOO /path/to/foo
…

Gracias.

68voto

Jason Puntos 8799

Puede utilizar mod_macro .

Instalación de Debian

Instalar con: apt-get install libapache2-mod-macro

y habilitar con a2enmod macro

Ejemplo de configuración

/etc/apache2/conf.d/vhost.macro

<Macro VHost $host $port>
  <VirtualHost $host:$port>

    ServerName $host
    DocumentRoot /var/vhosts/$host

    <Directory /var/vhosts/$host>
      # do something here...
    </Directory>
  </VirtualHost>
</Macro>

/etc/apache2/sites-available/vhost.mysite.com

Use VHost vhost.mysite.com 80

14voto

MojoFilter Puntos 3730

Puede activar o desactivar los bits de configuración con IfDefine pero eso probablemente no hará lo que quieres. En su lugar, puede establecer variables de entorno en su Apache init script para acceder dentro de la configuración. Por ejemplo, añadiendo:

HOSTNAME=$(hostname)

a /etc/init.d/httpd (antes de la línea que llama a httpd ) en una máquina RHEL pasa el nombre 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 lanza httpd está bien. Las variables se pueden utilizar en la configuración así:

[root@dev ~]# cat /etc/httpd/conf.d/test.conf
Header set X-Hostname ${HOSTNAME}

[root@dev ~]# GET -Sed http://localhost
GET http://localhost --> 200 OK
Connection: close
Date: Fri, 11 Sep 2009 20:47:13 GMT
Server: Apache/2.2.3 (Red Hat)
Content-Length: 525
Content-Type: text/html;charset=ISO-8859-1
Client-Date: Fri, 11 Sep 2009 20:47:13 GMT
Client-Peer: 127.0.0.1:80
Client-Response-Num: 1
Title: Index of /
X-Hostname: dev.local

Por supuesto, no se limita a la Header de la directiva. Las variables se pueden utilizar en cualquier lugar, como <Directory ${FOO}> etc.

Si no te gusta esto (y no es tan bonito..) puedes generar una configuración a partir de una plantilla usando m4 o algún otro lenguaje de plantillas.

ADEMÁS :

Hrm, una forma de hacerlo mejor sería almacenar todas las variables en un archivo externo, tal vez /etc/httpd/conf/variables.txt :

FOO=/path/to/dir
ROLE=development

y luego incluirlos en su Apache init.d script con:

. /etc/httpd/conf/variables

antes de llamar a httpd . Todavía no es brillante, pero al menos separa el inicio script y las variables.

7voto

Jared Bienz - MSFT Puntos 2866

Puede utilizar las variables de entorno del sistema con mod_env y la directiva PassEnv. Ver aquí

Ejemplo para debian :

Añade tu variable a /etc/apache2/envvars (este archivo es utilizado por apache2ctl para definir variables)

...
export APACHE_PID_FILE=/var/run/apache2.pid
export HOSTNAME=$(hostname)

Pase su variable en la configuración de apache

PassEnv HOSTNAME

Ahora puedes acceder a la variable de entorno del sistema como apache one

Header set Served-By %{HOSTNAME}e

3voto

Geradeausanwalt Puntos 136

Tuve el mismo problema y, después de algunas investigaciones, la solución para Apache 2.x que exactamente lo resolvió para mí (y nada más) fue esto:

http://people.apache.org/~rjung/mod_define/

Tenga en cuenta que después de desempaquetar debe construirlo así (la parte de instalación de los documentos parece haber olvidado adherirse a apache2 ):

apxs2 -cia mod_define.c

A continuación, cree /etc/apache2/mods-available/define.load :

LoadModule define_module /usr/lib/apache2/modules/mod_define.so

A continuación, habilite el módulo mediante a2enmod como lo harías normalmente.

Los documentos del enlace anterior muestran cómo utilizarlo. Ahora puedes definir cosas de forma muy sencilla y utilizarlas directamente, todo dentro de la misma configuración de apache2.

1voto

hurikhan77 Puntos 373

Tal vez quiera investigar 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, hmm, exactamente nada. Lo único que necesitas es crear un directorio "público" en root de la aplicación y crear enlaces simbólicos en "público" a tus directorios estáticos como "media" (esto aumentará el rendimiento del servicio estático) y apuntar tu DocumentRoot a él.

A continuación, coloque el siguiente archivo en "public/../passenger_wsgi.py":

import sys, os
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)
sys.path.append('/PATH/TO/PACKAGES') # optional
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Enciende tu navegador: ¡Funciona!

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: