Jak przekształcić Nginx w pełnoprawny serwer aplikacji za pomocą OpenResty
Jeśli chodzi o systemy o wysokim obciążeniu, Nginx jest pierwszą rzeczą, jaka przychodzi na myśl. Jesteśmy przyzwyczajeni do używania go jako szybkiego proxy lub wygodnego load balancera. Ale co, jeśli powiem Ci, że Nginx może wykonywać złożoną logikę biznesową, odpytywać bazy danych i cache'ować odpowiedzi bezpośrednio „wewnątrz" siebie, bez przekazywania żądań do zasobożernych backendów takich jak Python czy PHP?
Poznaj OpenResty. To nie tylko zestaw wtyczek, ale pełnoprawna platforma webowa, która łączy rdzeń Nginx z mnóstwem sprawdzonych modułów i interpreterem LuaJIT.
Po co nam jeszcze jeden serwer aplikacji
Zazwyczaj schemat wygląda tak: Nginx otrzymuje żądanie i wysyła je do jakiejś usługi. Usługa idzie do bazy danych, coś oblicza i zwraca odpowiedź z powrotem do Nginx. Na każdym etapie tracimy cenne milisekundy na serializację danych i opóźnienia sieciowe między komponentami.
OpenResty oferuje inną ścieżkę. Piszesz logikę w Lua — języku słynącym z prostoty i szybkości wykonania dzięki kompilacji JIT. W rezultacie kod wykonuje się bezpośrednio w kontekście procesów roboczych Nginx. Dzięki temu można obsługiwać dziesiątki i setki tysięcy żądań na sekundę na zwykłym sprzęcie, bez rozbudowy infrastruktury.
Co ciekawego jest w tym pakiecie
Wizjoner projektu, Yichun Zhang (agentzh), wykonał ogromną pracę integrując różne moduły. Główna wartość polega na tym, że wszystkie komponenty są gwarantowanie ze sobą kompatybilne.
Jedną z interesujących funkcji wspomnianych od razu w dokumentacji jest rozszerzona praca z plikiem systemowym resolv.conf. Wygląda to na małą rzecz, ale standardowy Nginx często zmusza nas do wpisywania na twardo adresów IP resolvera w konfiguracji. OpenResty może pobierać ustawienia bezpośrednio z systemu lub dowolnego innego pliku za pomocą dyrektywy resolver. Składnia wygląda znajomo:
resolver local=on; # Использует /etc/resolv.conf
resolver local=/tmp/custom_dns.conf; # Или ваш кастомный файл
Upraszcza to życie przy dynamicznej zmianie środowiska sieciowego, na przykład w kontenerach Docker czy chmurach.
Praktyczne korzyści z Lua w Nginx
Najpotężniejszą bronią jest tutaj moduł ngx_lua. Dzięki niemu możesz robić rzeczy, które wcześniej wymagały pisania złożonych modułów w C.
Na przykład:
- Dynamiczne uwierzytelnianie: weryfikuj JWT lub idź do Redis po sesję użytkownika zanim żądanie dotrze do głównego backendu.
- Inteligentne cache'owanie: implementuj złożoną logikę unieważniania cache lub przechowuj gorące dane w pamięci współdzielonej (shared dict) między wszystkimi workerami Nginx.
- Agregacja danych: wykonuj wiele równoległych żądań do różnych API i składaj je w jedną odpowiedź JSON bezpośrednio w warstwie proxy.
Kod w Lua wygląda zwięźle i czyta się jak zwykły skrypt, a przy tym nie blokuje pętli zdarzeń Nginx. Podczas gdy jedno żądanie czeka na odpowiedź z bazy danych, worker spokojnie obsługuje inne.
Komu się to przyda
OpenResty dawno przestał być „eksperymentem geeków". Jest używany przez Cloudflare, Kong (popularny API Gateway zbudowany na OpenResty) i wielu dużych dostawców treści.
Warto się tym zainteresować, jeśli:
- Uderzyłeś w sufit wydajności swojego obecnego API w Pythonie, Ruby lub Node.js.
- Musisz zaimplementować skomplikowaną logikę filtrowania ruchu lub dynamicznego routingu.
- Potrzebujesz najszybszej możliwej warstwy serwowania danych z cache.
Jeśli jesteś przyzwyczajony do konfiguracji Nginx, bariera wejścia będzie minimalna. Lua można nauczyć się w jeden wieczór, a możliwości zarządzania ruchem wzrastają wielokrotnie.
Jak zacząć
Najłatwiej jest udać się na oficjalną stronę i pobrać gotowy pakiet dla swojego systemu operacyjnego. Dla tych, którzy lubią kontrolować wszystko, w repozytorium znajduje się prosty Makefile. Budowanie na Fedorze sprowadza się na przykład do zainstalowania kilku zależności (perl, dos2unix, mercurial) i uruchomienia make. Przy tym otrzymujesz nie „zoo" modułów, ale monolityczne, dobrze przetestowane narzędzie gotowe do produkcji.
OpenResty to przypadek, gdy stare, dobre narzędzie zyskuje supermoce, pozostając niezawodne jak skała. Jeśli jeszcze nie próbowałeś pisać logiki na poziomie proxy, teraz jest idealny moment, żeby zacząć.
Powiązane projekty