Nginx jako dobry przykład reverse proxy - wiele web aplikacji na tym samym porcie
Nginx jako dobry przykład reverse proxy - wiele web aplikacji na tym samym porcie
Nginx jako dobry przykład reverse proxy - wiele web aplikacji na tym samym porcie

Aplikacje webowe możemy tworzyć w przeróżny sposób, zaczynając od prostego PHP poprzez NodeJS czy Python z frameworkiem Django. W tych bardziej zaawansowanych językach nasza aplikacji jest obsługiwana przez wewnętrzny serwer www (czyli inaczej niż w przypadku chociażby PHP). Możemy korzystać z hostingu typu MyDevil który obsługuje wiele nowych technologii, jednak co w przypadku, gdy chcemy uruchomić wiele aplikacji na tym samym adresie IP? Z pomocą przychodzi nginx reverse proxy.


Pierwszy serwer dedykowany lub VPS

Myślę, że większość z Was na początku korzystała ze współdzielonego hostingu aplikacji internetowych, który posiadał gotowy panel za pomocą które można było zrobić (prawie) wszystko. Przychodzi jednak ten moment, w którym rezygnujemy z gotowego rozwiązania i chcemy instalować aplikacje na własnym serwerze. Oczywiście, można zainstalować panel hostingowy, jednak w niektórych przypadkach po prostu nie ma to sensu.

Jedna aplikacja na jednym porcie

Standardowo, gdy uruchamiamy naszą aplikację webową, dla przykładu napisaną w języku NodeJS lub frameworku Django dla języka Python, wybieramy port na którym ma zostać uruchomiona. Co w przypadku gdy nasza aplikacja jest uruchomiona na serwerze dedykowanym lub VPS, mamy podpiętą domenę i chcemy uruchomić kolejną aplikację? Nie możemy uruchomić kolejnej aplikacji "od tak" podając ten sam port ponieważ jest on już zajęty i system za nas nie rozdzieli ruchu na poszczególne aplikacje. Zawsze możemy uruchomić kolejną aplikację na innym porcie, jednak nie jest zbyt dobra metoda (chociaż w niektórych sytuacjach wygląda dobrze).

Nginx jako przykład reverse proxy

Sam nginx to nie tylko reverse proxy ale także load balancer i web server. Powstał z myślą o wysokiej dostępności i stronach na których występuje duży ruch. Nginx instalujemy prostym poleceniem (na przykładzie Ubuntu Server 18.04 LTS):

sudo apt-get install nginx

Teraz, po przejściu na adres IP nasze serwer powinniśmy otrzymać komunikat z informacją, że Nginx został zainstalowany poprawnie.

Dodawanie domen

Na początku utwórzmy plik /etc/nginx/sites-available/<nazwa domeny> (np. /etc/nginx/sites-available/xyz.pl) i wstawmy tam poniższy kod:

server { 
    listen 80; 
    server_name domena.pl; 
    location / { 
        proxy_pass http://localhost:8001; 
        proxy_http_version 1.1; 
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection 'upgrade'; 
        proxy_set_header Host $host; 
        proxy_cache_bypass $http_upgrade; 
    }
}

Przejdźmy do analizy powyższego kodu.

Pierwsza ważna linijka, czyli listen odpowiada za wybranie portu na którym chcemy przechwytywać nasz ruch, server_name ustawia domenę którą chcemy obsłużyć. Dzięki temu, nasze aplikacje/strony będą dostępne tylko z wybranej domeny. Jeśli chcemy, aby dodatkowe subdomeny były obsługiwane musimy dodać je po przecinku, dla przykładu dodanie subdomeny www:

server_name domena.pl www.domena.pl;

Idąc dalej, location / wskazuje na ścieżkę którą chcemy obsłużyć, "/" oznacza że przechwytujemy ruch z całej domeny a nie np. tylko z domena.pl/app. proxy_pass wskazuje na domenę lub adres na który ma kierować ruch. Najlepszym rozwiązaniem jest uruchamianie aplikacji na adresie lokalnym, dzięki czemu nie będą dostępne z zewnątrz poprzez podanie adresu IP serwera i odpowiedniego portu. Następnie proxy_http_version, proxy_set_header i proxy_cache_bypass ustawia odpowiednio wersję HTTP, nagłówki i cache po to, aby strona była dostępna w taki sposób, jakby wcale nie stała za bramą proxy.

Zatwierdzenie zmian

Aby nasz config stał się aktywny, należy wydać polecenie:

sudo ln -s /etc/nginx/sites-available/<nazwa domeny> /etc/nginx/sites-enabled/<nazwa domeny>

Po edycji naszego configu musimy przeładować naszą usługę, aby to zrobić wydajemy polecenie:

sudo service nginx reload

Po wejściu na naszą domenę możemy otrzymać komunikat "Bad Gateway". Oznacza to, że nasza aplikacja nie została uruchomiona lub jest chwilowo niedostępna.

Dodawanie kolejnej domeny

Jeśli chcemy podpiąć kolejną domenę która będzie kierować na naszą inną aplikację to powtarzamy dwa poprzednie punkty. Lepszym rozwiązaniem jest kierowanie się zasadą 1 domena = 1 plik niż pakowanie wszystkiego do jednego pliku. 

Podsumowanie

I tak oto w prosty sposób możemy serwować wiele aplikacji na różnych domenach korzystając z jednego adresu IP. Oczywiście nie jest to do końca zdrowe jeśli chodzi o SEO. W teorii każda domena powinna mieć unikalny adres IP na którym nie stoją inne domeny. W kolejnym artykule dotyczącym reverse proxy pokażę jak wygenerować darmowy certyfikat Let's Encrypt. Dzięki niemu nasza strona będzie dostępna poprzez protokół HTTPS ;)