Czy można używać zmiennych w plikach konfiguracyjnych Apache?
Na przykład, gdy konfiguruję witrynę za pomocą Django + WSGI, plik konfiguracyjny może wyglądać następująco:
<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
I chciałbym zamienić '/ path / to / foo' w zmienną, więc trzeba ją zdefiniować tylko w jednym miejscu. Coś jak:
Variable FOO /path/to/foo
…
Dzięki!
apache-2.2
David Wolever
źródło
źródło
Znacznie prostsze przy użyciu
Define
słowa kluczowego. Zobacz Definicja dyrektywy ....
źródło
The variable is always globally defined and not limited to the scope of the surrounding config section.
prawdopodobnie oznacza to (na razie tego nie testowałem), że jeśli masz wiele vhostów, nie możesz użyć tej samej zmiennej (o innej wartości) dla każdego.Możesz włączyć lub wyłączyć bity konfiguracji za pomocą IfDefine, ale prawdopodobnie nie zrobi to, co chcesz. Zamiast tego można ustawić zmienne środowiskowe w skrypcie inicjującym Apache, aby uzyskać dostęp w konfiguracji. Na przykład dodanie:
do
/etc/init.d/httpd
(przed linią, która wywołujehttpd
!) na maszynie RHEL przekazuje nazwę hosta maszyny jako zmienną. Nie musi to być wynik polecenia - wszystko, co ustawia zmienną w uruchamianym środowisku,httpd
jest w porządku. Zmienne mogą być używane w konfiguracji w następujący sposób:Oczywiście nie jesteś ograniczony do tej
Header
dyrektywy. Zmienne mogą być używane w dowolnym miejscu, np<Directory ${FOO}>
.Jeśli ci się to nie podoba (i to nie jest tak miłe ..) możesz wygenerować konfigurację z szablonu za pomocą m4 lub innego języka szablonów.
DODATKOWE :
Hrm, jednym ze sposobów na ulepszenie byłoby przechowywanie wszystkich zmiennych w pliku zewnętrznym, być może
/etc/httpd/conf/variables.txt
:a następnie dołącz je do
init.d
skryptu Apache za pomocą:przed dzwonieniem
httpd
. Nadal nie jest genialny, ale przynajmniej oddziela skrypt startowy i zmienne.źródło
/etc/sysconfig/httpd
(RedHat, CentOS) lub/etc/apache2/envvars
(Ubuntu / Debian). Niektóre zmienne środowiskowe już tam są.Możesz używać zmiennych środowiskowych systemu z mod_env i dyrektywą PassEnv. Spójrz tutaj
Przykład dla debiana:
Dodaj swoją zmienną do / etc / apache2 / envvars (ten plik jest używany przez apache2ctl do definiowania zmiennych)
Przekaż zmienną do konfiguracji apache
Następnie możesz uzyskać dostęp do systemowej zmiennej środowiskowej, tak jakby to była zmienna apache.
źródło
Miałem ten sam problem i po kilku badaniach rozwiązanie dla Apache 2.x, które dokładnie go rozwiązało (i nic więcej), brzmiało:
http://people.apache.org/~rjung/mod_define/
Uważaj, że po rozpakowaniu powinieneś zbudować go w taki sposób (wydaje się, że część instalacyjna dokumentów zapomniała stosować się do apache2?):
Następnie utwórz
/etc/apache2/mods-available/define.load
:Następnie włącz moduł
a2enmod
tak, jak zwykle.Dokumenty w powyższym linku pokazują, jak z niego korzystać. Teraz możesz bardzo łatwo zdefiniować rzeczy i używać ich bezpośrednio, wszystko w tej samej konfiguracji apache2.
źródło
niewiarygodne, ale na httpd 2.2 na centos 6.4 działa
eksportuj zmienne env do / etc / sysconfig / httpd
to po prostu zrób to ...
potem w końcu ....
źródło
/etc/sysconfig/httpd
dzieje się tak prawdopodobnie dlatego, że (część) treści wchodzi whttpd -D
(odpowiednikdefine
dyrektywy), które definiują zmienne apache.Możesz zajrzeć do mod_passenger w poszukiwaniu apache, który może również hostować aplikacje django. Używamy go z wielkim sukcesem. Wszystko, co musisz zrobić w vhost, to, hmm, dokładnie nic. Wystarczy utworzyć katalog „public” w katalogu głównym aplikacji i utworzyć dowiązania symboliczne „public” do swoich katalogów statycznych, takich jak „media” (zwiększy to wydajność wyświetlania statycznego) i skierować do niego DocumentRoot.
Następnie umieść następujący plik w „public /../ pasażer_wsgi.py”:
Uruchom przeglądarkę: działa!
źródło