중복을 줄이기 위해 Apache 설정 파일에서 변수를 사용합니까?


67

Apache 구성 파일에서 변수를 사용할 수 있습니까?

예를 들어 Django + WSGI로 사이트를 설정하는 경우 구성 파일은 다음과 같습니다.

<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

그리고 '/ path / to / foo'를 변수로 바꾸고 싶습니다. 따라서 한곳에서만 정의하면됩니다. 다음과 같은 것 :

Variable FOO /path/to/foo
…

감사!

답변:


66

버전 2.4 이후 Apache httpd에 포함 된 mod_macro를 사용할 수 있습니다

별도로 설치하기 전에 mod_macro를 참조하십시오 . 예를 들어 Debian : apt-get install libapache2-mod-macro; a2enmod macro.

구성 예

/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

1
아, 그게 내가 필요한 것 같습니다. 그것이 내장되어 있지 않은 수치. .. 그러나 나는 살 수 있다고 생각한다. 감사!
David Wolever

3
우수한! 이것은 내가 할 수 있다고 생각했던 것보다 훨씬 더 잘하기 위해 계획했던 것을 수행합니다.
SpoonMeiser 2009

5
@SpoonMeiser이 모듈은 버전 2.4.6부터 Apache HTTP Server에 통합되었습니다. httpd.apache.org/docs/current/mod/mod_macro.html
Ludwig

24

Define키워드를 사용하는 것이 훨씬 간단 합니다. 지시어 정의를 참조 하십시오 .

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

2
우수한. 이것은 완벽하게 작동합니다.
David Tonhofer

참고 The variable is always globally defined and not limited to the scope of the surrounding config section.그것은 아마도 각각 (나는 지금 그것을 테스트하지 않았다) 여러 가상 호스트가 있다면, 당신은 (다른 값) 같은 변수를 사용할 수 없습니다 것을 의미한다.
Pierre-Olivier Vares

@ Pierre-OlivierVares 맞습니다. 상수로보십시오. 이것이 내가 대문자를 사용하는 이유입니다. 나는 가상 호스트 외부에서 전 세계적으로 정의한다
Mathieu J.

14

IfDefine 으로 구성 비트를 활성화 또는 비활성화 할 수 있지만 원하는 방식으로 작동하지 않을 수 있습니다. 대신 Apache init 스크립트에서 환경 변수를 설정하여 구성 내에서 액세스 할 수 있습니다. 예를 들어 다음을 추가하십시오.

HOSTNAME=$(hostname)

/etc/init.d/httpd(호출하는 줄 앞에 httpdRHEL은 기계에가!) 변수로 기계의 호스트 이름을 전달합니다. 명령의 출력 일 필요는 없습니다 httpd. 시작하는 환경에서 변수를 설정하는 것이 좋습니다. 변수는 다음과 같이 구성에서 사용할 수 있습니다.

[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

물론 Header지침에 제한되지 않습니다 . 변수는 <Directory ${FOO}>등 어디에서나 사용할 수 있습니다

이 방법이 마음에 들지 않으면 (그리고 좋지 않습니다.) m4 또는 다른 템플릿 언어를 사용하여 템플릿에서 구성을 생성 할 수 있습니다.

추가 :

Hrm, 더 나은 방법 중 하나는 모든 변수를 외부 파일에 저장하는 것입니다 /etc/httpd/conf/variables.txt.

FOO=/path/to/dir
ROLE=development

다음을 사용하여 Apache init.d스크립트에 포함하십시오 .

. /etc/httpd/conf/variables

전화하기 전에 httpd. 여전히 훌륭하지는 않지만 적어도 시작 스크립트와 변수를 분리합니다.


hhmm… 고마워 – 당신이 말하는 것처럼, 이것은 내가 기대 했던 것만 큼 ​​좋지 는 않지만 , 확실히 아무것도 아닌 것보다 낫습니다. 감사.
David Wolever

11
이러한 환경 변수에 대한 더 좋고 깨끗한 장소는 /etc/sysconfig/httpd(RedHat, CentOS) 또는 /etc/apache2/envvars(Ubuntu / Debian)입니다. 일부 환경 변수가 이미 있습니다.
Stefan Lasiewski

7

mod_env 및 PassEnv 지시문과 함께 시스템 환경 변수를 사용할 수 있습니다. 여기를 봐

데비안의 예 :

변수를 / etc / apache2 / envvars에 추가하십시오 (이 파일은 apache2ctl에서 변수를 정의하는 데 사용됨)

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

변수를 아파치 설정으로 전달

PassEnv HOSTNAME

그런 다음 아파치 변수 인 것처럼 시스템 환경 변수에 액세스 할 수 있습니다.

Header set Served-By %{HOSTNAME}e

1
이 아파치에 나를 위해 6.4 2.2에 CentOS를 대답을 제공하지 않았더라도 - - 덕분에 매우 많이 올바른 방향 일 날 지점 않았다
danday74

기본적으로 apache2.2에로드되지 않은 mod_define이 필요합니다.
토마스

3

나는 똑같은 문제가 있었고, 약간의 연구 끝에 나에게 정확하게 해결 한 아파치 2.x 솔루션 은 다음과 같다.

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

압축을 푼 후에는 다음과 같이 빌드해야합니다 (문서의 설치 부분이 apache2를 잊어 버린 것 같습니까?) :

apxs2 -cia mod_define.c

그런 다음 /etc/apache2/mods-available/define.load:

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

a2enmod그런 다음 평상시처럼 모듈을 활성화하십시오 .

위 링크의 문서는 사용 방법을 보여줍니다. 이제는 동일한 apache2 구성 내에서 간단히 물건을 정의하고 직접 사용할 수 있습니다.


이것이 명확하지 않은 경우 Apache 2.4에서 이와 동일한 기능을 기본적으로 사용할 수 있습니다.
ColinM

2

믿을 수 없지만 centos 6.4의 httpd 2.2에서는 이것이 작동합니다.

/ etc / sysconfig / httpd에서 환경 변수 내보내기

export mydocroot=/var/www/html

그런 다음 간단히 이렇게하십시오 ...

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

마지막으로 ....

service httpd restart;

이것은 아마도 (일부) /etc/sysconfig/httpd내용이 아파치 변수를 정의 httpd -D하는 ( define지시문 과 동일) 들어가기 때문일 것입니다 .

1

django 앱을 호스팅 할 수있는 아파치 를 mod_passenger 를 살펴볼 수도 있습니다. 우리는 그것을 큰 성공으로 사용합니다. 가상 호스트에서해야 할 일은 흠, 아무것도 아닙니다. 필요한 것은 응용 프로그램 루트에 "public"디렉토리를 만들고 "public"에 "media"와 같은 정적 디렉토리에 대한 심볼릭 링크를 작성하여 (정적 검색 성능을 향상시킬 수 있음) DocumentRoot를 지정하는 것입니다.

그런 다음 "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()

브라우저를 실행하십시오 : 작동합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.