# Konfiguracja reverse proxy na Linuxie z użyciem Nginx ## Cel --- ## 1. Stworzenie prostych aplikacji webowych Jako że nie jest to główna część projektu, a jedynie jego element to aplikacje są bardzo proste ### Java ### .NET Core Do tej demonstracji została użyta wersja dotnet 8.0. Aplikacja składa się z dwóch części: - dotnet.csproj zawierającej ustawienia projektu - Program.cs zawiejącej kody który zostanie wykonany i uruchomi prosty serwer HTTP ### Docker Obydwie aplikacje uruchomione są w dockerze, rozwiązanie to ma kilka zalet - pozwala na łatwą reprodukcją środowiska na innej maszynie. Na przykład na innym komputerze, lub na maszynie wirtualnej w laboratorium - ułatwia późniejszą konfigurację z Nginx (nie trzeba konfigurować oddzielnych adresów ani portów, dla kilku równoległych aplikacji) - ułatwia uruchomienie całego środowiska (całość można uruchomić jedną komendą) Każda aplikacja ma przygotowany plik `Dockerfile`, który jest wykorzystywany przez dockera do stworzenia kontera na podstawie kodu źródłowego. Na potrzeby projektu plik `Dockerfile` jest mocno uproszczony i w zasadzie tylko uruchamia polecenie `dotnet run` dla c#, oraz .... dla java. --- ## 2. Stworzenie prostej sieci konterów z aplikacjami Ponieważ do uruchomienia aplikacji używamy dockera, najprostszym sposobem na utworzenie wspólnej podsieci dla aplikacji i nginx jest użycie docker compose. Docker compose jest narzędziem do definiowania i uruchamianiania wilokontenerowej aplikacji w dockerze. - Normalnie w dockerze, uruchamia się kontener komendą `dotnet run`, ale gdy aplikacja potrzebuje kilku kontenerów (jak serwer, reverse proxy, ...) zarządzanie nimi staje się skomplikowane. - Docker compose pozwala zdefiniować wszystkie kontenery i jak one oddziałają ze sobą w jednym pliku i uruchomienie wszystkiego jedną komendą --- ## 3. Stworzenie instancji reverse proxy ### Dodanie kontera Utworzenie instancji dotnet przy użyciu dockera jest bardzo proste, wystarczy użyć poniższą komendę ```sh docker run -v ./nginx/html:/usr/share/nginx/html:ro -p 80:80 nginx ``` Polecenie `docker run` uruchamia dany kontener, w tym przypadku `docker run nginx` uruchamia konter o nazwie nginx. Ponieważ na maszynie lokalnej nie ma kontenera o takiej nazwie, docker szuka tego kontenera w repozytorium hub.docker.com Jednak sam kontener z serwerem niewiele nam daje, potrzebujemy jeszcze powiedzieć mu co ma serwować, i gdzie ma to serwować. W tym celu potrzemujemy kolejne dwie opcje do komendy - `-v ./nginx/html:/usr/share/nginx/html:ro` tworzy link między lokalnym folderem, a folderem w kontenerze - `-v` mówi dockerowi że chcemy zamontować jakiś folder/volume - `./nginx/html` to lokalizacja na systemie hosta - `/usr/share/nginx/html` to lokalizacja na systemie kontenera - `ro` mówi dockerowi że folder jest w trybie tylko do odczytu - `-p 80:80` piekierowuje port z kontenera do hosta - pierwsza wartość to numer portu hosta - druga wartość to numer portu kontenera Podobnie wygląda konfiguracja kontenera w docker docker compsose - `image` to nazwa kontenera który chcemy uruchomić - `volumes` to odpowiednik `-v` - `ports` to odpowiednik `-p` #### dokumentacja kontenera - [[https://hub.docker.com/_/nginx]] ### Konfiguracja reverse proxy --- ## 4. Przekierowanie zapytań do odpowiednich aplikacji w zależności od nagłówków HTTP ### Konfiguracja reverse proxy --- ## 5. Load Balancing ### Utworzenie kopii kontenerów z aplikacjami W ramach prezentacji działania reverse proxy kilka instancji tej samej aplikacja zostanie uruchomione na tej samej maszynie, w ramach podsieci dockera można o nich myśleć jako osobne maszyny wirtualne o osobnych adresach ip ### Konfiguracja reverse proxy --- ## 6. Rate Limiting ### Konfiguracja reverse proxy