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

mod_macroを使用できます。これは、バージョン2.4以降のApache httpdに含まれています。

その前に、個別にインストールする必要がありました。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
ああ、それは私が必要なもののように見えます。恥ずかしがりは組み込まれていません…しかし、私は生きていけると思います。ありがとう!
デビッドウォレバー

3
優れた!これは、私ができると思っていたよりもはるかに良いことを計画していたことです。
SpoonMeiser 2009年

5
@SpoonMeiserこのモジュールは、バージョン2.4.6からApache HTTPサーバーに統合されています。httpd.apache.org/docs/current/mod/mod_macro.html
ルートヴィヒ

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
優れた。これは完璧に機能します。
デビッドトンホーファー

The variable is always globally defined and not limited to the scope of the surrounding config section.複数の仮想ホストがある場合、それぞれに同じ変数(異なる値)を使用できないことを意味することに注意してください(今のところテストしていません)。
ピエールオリビエヴァレス

@ Pierre-OlivierVares正しい、定数として見てください。これが大文字を使用する理由です。VirtualHostの外部でグローバルに定義します
Mathieu J.

14

IfDefineを使用して設定のビットを有効または無効にすることができますが、おそらくそれはあなたが望むことをしないでしょう。代わりに、Apache initスクリプトで環境変数を設定して、構成内でアクセスできます。たとえば、次を追加します。

HOSTNAME=$(hostname)

RHELマシンのto /etc/init.d/httpdhttpd!を呼び出す行の前)は、マシンのホスト名を変数として渡します。コマンドの出力である必要はありません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、それを改善する1つの方法は、すべての変数を外部ファイルに保存することです/etc/httpd/conf/variables.txt

FOO=/path/to/dir
ROLE=development

次に、これらをApache init.dスクリプトに含めます:

. /etc/httpd/conf/variables

呼び出す前にhttpd。まだ素晴らしいとは言えませんが、少なくとも起動スクリプトと変数は分離されます。


HHMM ...おかげ-あなたが言うように、これはありませんが、一方で非常に私は期待していたほど素敵な、それは確かに何もないよりはましです。ありがとう。
デビッドウォリーバー

11
これらの環境変数のより良い(そしてよりきれいな)場所は、/etc/sysconfig/httpd(RedHat、CentOS)または/etc/apache2/envvars(Ubuntu / Debian)です。一部の環境変数はすでに存在します。
ステファンLasiewski

7

mod_envおよびPassEnvディレクティブでシステム環境変数を使用できます。 こちらをご覧ください

debianの例:

変数を/ etc / apache2 / envvarsに追加します(このファイルは、変数を定義するためにapache2ctlによって使用されます)

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

変数をapache configに渡します

PassEnv HOSTNAME

その後、Apache変数のようにシステム環境変数にアクセスできます。

Header set Served-By %{HOSTNAME}e

1
どうもありがとう-これはApache 2.2 centos 6.4で私に答えを提供しませんでした-それは正しい方向に私を指していました+1
danday74

これにはmod_defineが必要で、デフォルトではapache2.2にロードされていません。
トーマス

3

私は同じ問題を抱えていましたが、いくつかの調査の後、Apache 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 config内で非常に簡単に定義して直接使用できます。


これが明確ではない場合、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コンテンツがApache変数を定義する(ディレクティブhttpd -Dと同等define)に入るためです。

1

djangoアプリをホストできるapacheのmod_passengerを調べることもできます。私たちは大成功でそれを使用しています。vhostで行う必要があるのは、うーん、まったく何もありません。必要なことは、アプリケーションルートに「パブリック」ディレクトリを作成し、「パブリック」に「メディア」などの静的ディレクトリへのシンボリックリンクを作成し(これにより静的な配信パフォーマンスが向上します)、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.