Serwer Nginx dla treści statycznych i dynamicznych

W poprzedniej notce opisywałem konfigurację serwera Nginx dla treści statycznych. Tekst powstał przy założeniu, że posiadamy osobne domeny dla statyków. Co jednak w sytuacji, gdy nie możemy (albo nie chcemy) zaimplementować takiego podziału w projekcie? Jak stworzyć konfigurację Nginx wspierającą specyfikowane dostarczanie treści statycznych bez podziału na domeny?

Z pomocą w implementacji takiego rozwiązania przychodzi nam możliwość użycia Nginx jako reverse – proxy, a co za tym idzie selektywnego rozprowadzania ruchu pomiędzy różne instancje serwerów. Budując konfigurację strony w oparciu o proxy możemy nie tylko skierować ruch do specyficznie skonfigurowanej instancji serwera www, ale także w prosty sposób wprowadzić load – balancing.

Ten wpis pokaże, jak stworzyć uniwersalną konfigurację Nginx, która obsłuży wszystkie domeny podłączone do naszego serwera. Dla prawidłowego działania opisanej niżej metody niezbędne jest przyjęcie pewnego założenia: wszystkie strony na serwerze muszą znajdować się w obrębie jednego katalogu, w katalogach, których document root będzie w formacie: [katalog www][nazwa domeny], czyli np. /var/www/domain.com. Założenie to można oczywiście obejść przygotowując oddzielne konfiguracje dla poszczególnych stron, ja jednak skupię się na rozwiązaniu uniwersalnym 🙂

Rozpoczynamy od wprowadzenia w konfiguracji server zbierającej domyślnie ruch nagłówków proxy:

proxy_pass_header $server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Wyżej wymienione nagłówki pozwolą nam przesłać przez proxy informację m.in. o nazwie serwera, hoście, IP inicjującym połączenie. Kolejnym krokiem jest selektywne ustawienie przejścia przez proxy dla treści statycznych:

if ($request_filename ~ "\.(jpg|gif|png|swf|ico|mp3|css|js)$") {
                proxy_pass http://static_balancer;
}

ten fragment kodu spowoduje przejście przez wskazaną ścieżkę proxy w przypadku dostępu do pliku, którego rozszerzenie jest wymienione w wyrażeniu regularnym. Oczywiście proxy_pass może wskazywać na konkretny adres IP i port, ja jednak zaimplementowałem przy okazji load – balancer (w przykładzie pokazanym niżej do de-facto jedynie fail – over). Load – balancery definiujemy w sekcji http konfiguracji Nginx:

upstream static_balancer {
       server 10.8.0.1:8099 weight=1 backup; #backupServer
       server 127.0.0.1:8099 weight=1; #mainServer
}

Za dyrektywą upstream podajemy nazwę naszego load – balancera, a następnie wyszczególniamy serwery, wraz z portami, które mają wejść w jego skład. Jak wspomniałem wyżej przytoczona konfiguracja to tak na prawdę fail – over, gdyż serwer 10.8.0.1 działa w trybie backup, zostanie więc uruchomiony jedynie wówczas, gdy nie będzie dostępu do innych serwerów.

Kiedy mamy już przygotowaną domyślną konfigurację server wystarczy skonfigurować instancję dla treści statycznych tak, jak opisałem to tutaj z tą różnicą, że powinniśmy dynamicznie dobierać document root, w którym znajdują się plik w zależności od domeny, z której pochodzi żądanie. Aby osiągnąć ten efekt „wyciągniemy” domenę, poprzez wyrażenia regularne z sekcji server_name konfiguracji:

server_name   ~^(www\.)?(?<domain>.+)$;

powyższe wyrażenie pobierze nazwę domeny (bez www) z server_name i wpisze ją do zdeklarowanej w wyrażeniu zmiennej $domain. Następnie wystarczy zmiennej tej użyć w definicji root:

root /var/www/$domain;

Oczywiście nasza instancja serwera dla treści statycznych powinna być udostępniona na innym porcie niż standardowy 80 🙂 Można także zabezpieczyć ją przed dostępem z adresów (lub zakresów adresów) innych niż load – balancing.

W ten właśnie sposób, przy wykorzystaniu kombinacji proxy oraz wyrażeń regularnych możemy dzięki możliwością Nginx przyspieszyć dostarczanie treści statycznych w obrębie naszych stron www.

Podziel się:

Mikołaj Niedbała

I'm a Poland based IT administrator, linux administrator and IT engineer creating professional IT infrastructure solutions based on Linux and virtual environments.

3 thoughts to “Serwer Nginx dla treści statycznych i dynamicznych”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *