Usando variáveis nos arquivos de configuração do Apache para reduzir a duplicação?

66

É possível usar variáveis nos arquivos de configuração do Apache?

Por exemplo, quando estou configurando um site com o Django + WSGI, o arquivo de configuração pode parecer:

<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

E eu gostaria de transformar o '/ path / to / foo' em uma variável, de modo que só precisa ser definido em um lugar. Algo como:

Variable FOO /path/to/foo
…

Obrigado!

    
por David Wolever 11.09.2009 / 22:33

7 respostas

64

Você pode usar o mod_macro , incluído no Apache httpd desde < a href="http://httpd.apache.org/docs/2.4/mod/mod_macro.html"> versão 2.4

Antes disso, tinha que ser instalado separadamente, veja mod_macro . Por exemplo, no Debian: apt-get install libapache2-mod-macro; a2enmod macro .

Exemplo de configuração

/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
    
por 12.09.2009 / 09:12
22

Muito mais simples usando Define keyword. Veja Definir a Diretiva .

Define RVM_ROOT /opt/rvmdir/gems
Define RUBY_18 ruby-1.8.7-head

...

SetEnv GEM_HOME ${RVM_ROOT}/${RUBY_18}@typo55
SetEnv GEM_PATH ${RVM_ROOT}/${RUBY_18}@typo55:${RVM_ROOT}/${RUBY_18}@global
    
por 01.06.2015 / 03:47
14

Você pode ativar ou desativar bits de configuração com IfDefine , mas provavelmente ganhou. Não faça o que você quer. Em vez disso, você pode definir variáveis de ambiente no seu script de inicialização do Apache para acessar a configuração. Por exemplo, adicionando:

HOSTNAME=$(hostname)

para /etc/init.d/httpd (antes da linha que chama httpd !) em uma máquina RHEL passa o nome do host da máquina como uma variável. Não precisa ser a saída de um comando - qualquer coisa que defina uma variável no ambiente que lança httpd é boa. Variáveis podem ser usadas na configuração da seguinte forma:

[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

Claro, você não está restrito à diretiva Header . As variáveis podem ser usadas em qualquer lugar, como <Directory ${FOO}> etc.

Se você não gosta disso (e não é legal), você pode gerar uma configuração a partir de um template usando m4 ou alguma outra linguagem de modelo.

ADICIONAL :

Hrm, uma maneira de torná-lo melhor seria armazenar todas as variáveis em um arquivo externo, talvez /etc/httpd/conf/variables.txt :

FOO=/path/to/dir
ROLE=development

e inclua-os no seu script Apache init.d com:

. /etc/httpd/conf/variables

antes de chamar httpd . Ainda não é brilhante, mas pelo menos separa o script de inicialização e as variáveis.

    
por 11.09.2009 / 22:54
7

Você pode usar variáveis de ambiente do sistema com mod_env e a diretiva PassEnv. Veja aqui

Exemplo para o debian:

Adicione sua variável ao / etc / apache2 / envvars (este arquivo é usado pelo apache2ctl para definir variáveis)

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

Passe sua variável para a configuração do apache

PassEnv HOSTNAME

Você pode acessar a variável de ambiente do sistema como se fosse uma variável do apache.

Header set Served-By %{HOSTNAME}e
    
por 10.11.2010 / 11:05
3

Eu tive o mesmo problema e, após algumas pesquisas, a solução para o Apache 2.x que exatamente resolveu para mim (e nada mais) foi esta:

link

Tenha em atenção que, depois de descompactar, deve construí-lo desta forma (a parte de instalação dos documentos parece ter esquecido de aderir ao apache2?):

apxs2 -cia mod_define.c

Em seguida, crie /etc/apache2/mods-available/define.load :

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

Depois disso, ative o módulo usando a2enmod como normalmente faria.

Os documentos no link acima mostram como usá-lo. Agora você pode simplesmente definir coisas e usá-las diretamente, tudo dentro da mesma configuração do apache2.

    
por 24.01.2011 / 17:39
2

inacreditável mas no httpd 2.2 no centos 6.4 isto funciona

export env vars em / etc / sysconfig / httpd

export mydocroot=/var/www/html

simplesmente faça isso ...

<VirtualHost *:80>
  DocumentRoot ${mydocroot}
</VirtualHost>

e finalmente ...

service httpd restart;
    
por 14.04.2016 / 16:25
1

Você pode querer olhar para o mod_passenger para o apache, que também pode hospedar aplicativos do django. Nós o usamos com grande sucesso. Tudo o que você precisa fazer no vhost é, hmm, exatamente nada. A única coisa que você precisa é criar um diretório "público" na raiz do aplicativo e criar links simbólicos em "público" para seus diretórios estáticos como "mídia" (isso aumentará o desempenho da exibição estática) e apontar seu DocumentRoot para ele.

Em seguida, coloque o seguinte arquivo em "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()

Abra seu navegador: funciona!

    
por 12.09.2009 / 00:03

Tags