nginxa można łatwo wykorzystać w roli load balancera, na którym jesteśmy w stanie zrealizować także dodatkowe usługi – np. dokonać terminacji połączeń SSL, dzięki czemu serwery aplikacyjne nie muszą się tym zajmować. Jest to szczególnie przydatne np. w node.js, gdzie oszczędzamy kod do obsługi HTTPS. Istotną zaletą takiego rozwiązania jest także możliwość centralnego zarządzania certyfikatami SSL, co w większych środowiskach jest dużym ułatwieniem.
Konfigurację rozpoczynamy od określenia puli serwerów (tutaj o nazwie: servers_pool), które mają obsługiwać daną domenę:
upstream servers_pool { server 192.168.0.11:8080; server 192.168.0.12:8080; server 192.168.0.13:8080; }
Następnie deklarujemy serwer ustawiając odpowiednie parametry odwrotnego proxy. Dla load balancingu kluczowa jest linijka proxy_pass, w której określamy wcześniej zdefiniowaną pulę serwerów:
server { listen 443; server_name test.luktom.net; location / { proxy_pass http://servers_pool; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 1; proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_404; proxy_intercept_errors on; } }
Dyrektywa proxy_next_upstream określa w jakich sytuacjach nginx powinien spróbować połączyć się z kolejnym serwerem z puli.
Terminacja SSL
Jeśli naszą witrynę chcemy zabezpieczyć przy użyciu HTTPS do powyższej sekcji server musimy dopisać konfigurację certyfikatów SSL oraz dostępnych wersji SSL/TLS:
ssl on; ssl_certificate /etc/nginx/certs/test.luktom.net_bundle.crt; ssl_certificate_key /etc/nginx/certs/test.luktom.net.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Strona przerwy technicznej
Dodatkowo, w przypadku niedostępności serwerów w puli lub wystąpienia na nich błędów (muszą wystąpić po kolei na wszystkich dostępnych – dyrektywa proxy_next_upstream definiuje kiedy przechodzimy do następnego serwera) chcemy wyświetlić użytkownikowi stronę, informującą o przerwie technicznej. W tym celu, w ramach zadeklarowanego wyżej serwera, tworzymy zasób /maintenance a w nim plik maintenance.html zawierający informację o przerwie technicznej. Następnie, przy użyciu dyrektywy error_page wskazujemy nginxowi, kiedy ma wyświetlić stronę przerwy technicznej:
location /maintenance/ { root /etc/nginx/content; index maintenance.html; } error_page 501 502 503 504 /maintenance.html; location /maintenance.html { root /etc/nginx/content/maintenance; }
Przeładowujemy konfigurację nginxa:
nginx -s reload
I gotowe – nasz load balancer jest w pełni funkcjonalny :)
Dodaj komentarz