Jak działa locations w Nginx?

Poradnik: Jak korzystać z „locations” w Nginx

W tym wpisie przeprowadzimy konfigurację Nginx, aby zrozumieć, jak działają dyrektywy location. Pokażę wam, jak dodać prostą stronę logowania do serwera Nginx oraz jak zablokować do niej dostęp za pomocą opcji deny.

W przykładzie używam domeny kursngninx.pl. Oczywiście, w jej miejsce podkładasz własną.

 

Dołącz do szkolenia "Docker w 90 minut!"

Podczas szkolenia dowiesz się wszystkiego, co potrzebne, by wystartować z konteneryzacją. Poznasz podstawową obsługę Dockera. Nauczysz się 17 komend, które musi znać każda osoba działająca z kontenerami, Dockerem i Kubernetesem.

Widzimy się 12 września o 13:00!

Chcesz wziąć udział w szkoleniu? Zapisy na stronie: https://asdevops.pl/s42/

 

Na początek jednak, wyjaśnijmy sobie, co daje locations?

location służy do definiowania reguł routingu dla żądań HTTP, które trafiają do serwera. Dzięki niej można określić:

  • jak serwer powinien obsługiwać konkretne URI (czyli ścieżki w adresie URL)?
  • jakie żądania przekazywać do określonych serwisów, plików czy katalogów?
  • jak stosować różne ustawienia i polityki w zależności od żądanej lokalizacji?

W Nginx, dyrektywa location służy do definiowania reguł routingu dla żądań HTTP, które trafiają do serwera. Dzięki niej można określić, jak serwer powinien obsługiwać konkretne URI (czyli ścieżki w adresie URL), jakie żądania przekazywać do określonych serwisów, plików czy katalogów, a także jak stosować różne ustawienia i polityki w zależności od żądanej lokalizacji.

Podstawowe zastosowania location w Nginx:

  1. Przekierowanie do plików lub katalogów:
    Możesz określić, jak serwer ma obsługiwać konkretne katalogi lub pliki na podstawie ścieżki URI.
   location /images/ {
       root /var/www/data;
   }

W powyższym przykładzie, wszystkie żądania do URI zaczynające się od /images/ będą kierowane do katalogu /var/www/data/images/.

  1. Przekierowanie na serwery zewnętrzne lub backendy:
    Można użyć location, aby przekierować żądania do zewnętrznych serwerów aplikacji, np. do aplikacji działającej na innym porcie lub maszynie.
   location /app/ {
       proxy_pass http://localhost:8080;
   }

W tym przykładzie żądania zaczynające się od /app/ są przekazywane do aplikacji działającej na porcie 8080 na lokalnym serwerze.

  1. Filtrowanie i przetwarzanie żądań:
    Nginx pozwala również na stosowanie dodatkowych reguł przetwarzania w ramach location. Można definiować reguły na przykład w oparciu o typy żądań, nagłówki, metody HTTP itp.
   location ~* \.(jpg|jpeg|png|gif|ico)$ {
       expires 30d;
   }

W tym przykładzie ustawiane jest wygaszenie cache’u przeglądarki na 30 dni dla plików graficznych.

  1. Warunkowe przetwarzanie na podstawie wyrażenia regularnego:
    Możesz definiować bardziej zaawansowane reguły z użyciem wyrażeń regularnych, aby dopasować URI na przykład do wzorców dynamicznych.
   location ~ \.php$ {
       fastcgi_pass unix:/var/run/php-fpm.sock;
       fastcgi_index index.php;
       include fastcgi_params;
   }

Powyżej pokazano, jak Nginx może obsługiwać żądania do plików PHP poprzez FastCGI.

Ćwiczenie

Krok 1: Konfiguracja pliku Nginx dla naszej strony

Na początek musimy edytować plik konfiguracyjny Nginx, aby dodać nową lokalizację /logowanie.

  1. Otwórz plik konfiguracyjny swojej strony:
   sudo nano /etc/nginx/sites-enabled/moja-strona
  1. Dodaj nową sekcję location:
    W pliku konfiguracyjnym dodajemy nową sekcję location, która będzie obsługiwać zapytania pod adresem /logowanie.
   location /logowanie {
       root /var/www/nowa/;
   }

Opis: Tutaj określamy, że dla każdego żądania kierowanego na /logowanie, serwer będzie szukał plików w katalogu /var/www/nowa/.

Krok 2: Utworzenie struktury katalogów i pliku HTML

Kiedy nasza konfiguracja jest gotowa, musimy utworzyć odpowiednią strukturę katalogów oraz plik HTML, który będzie wyświetlany po wejściu na stronę logowania.

  1. Utwórz katalogi dla strony logowania:
   sudo mkdir -p /var/www/nowa/logowanie/

Opis: Powyższe polecenie tworzy katalog logowanie w ścieżce /var/www/nowa/, gdzie zostanie umieszczona nasza strona logowania.

  1. Stwórz plik HTML dla strony logowania:
   sudo nano /var/www/nowa/logowanie/index.html

Wklej poniższy kod do pliku:

   <!DOCTYPE html>
   <html>
   <head>
       <meta charset="UTF-8">
       <title>Strona Logowania</title>
       <style>
           body {
               text-align: center;
               font-family: Arial, sans-serif;
               margin-top: 100px;
           }

           .login-container {
               margin: auto;
               width: 300px;
               padding: 20px;
               border: 1px solid #ddd;
               box-shadow: 2px 2px 5px rgba(0,0,0,0.2);
           }

           input[type=text], input[type=password] {
               width: 100%;
               padding: 10px;
               margin: 10px 0;
               border: 1px solid #ddd;
               box-sizing: border-box;
           }

           input[type=submit] {
               width: 100%;
               padding: 10px;
               background-color: #4CAF50;
               color: white;
               border: none;
               cursor: pointer;
           }

           input[type=submit]:hover {
               background-color: #45a049;
           }
       </style>
   </head>
   <body>
       <div class="login-container">
           <h2>Logowanie</h2>
           <form action="/submit-your-login-form" method="post">
               <label for="username">Nazwa użytkownika:</label><br>
               <input type="text" id="username" name="username"><br>
               <label for="password">Hasło:</label><br>
               <input type="password" id="password" name="password"><br>
               <input type="submit" value="Zaloguj">
           </form>
       </div>
   </body>
   </html>

Opis: Ten kod tworzy prostą stronę logowania z formularzem, który użytkownicy mogą wypełnić. Strona posiada prosty, ale estetyczny styl CSS.

Krok 3: Załaduj zmiany w konfiguracji Nginx

Po wprowadzeniu zmian, musimy załadować nową konfigurację Nginx.

  1. Zrestartuj Nginx:
   sudo nginx -s reload

Opis: To polecenie przeładowuje konfigurację Nginx, aby uwzględnić zmiany, które wprowadziliśmy.

  1. Sprawdź stronę logowania:
    Otwórz przeglądarkę i przejdź pod adres:
   https://kursngninx.pl/logowanie/

Opis: Jeśli wszystko zostało poprawnie skonfigurowane, zobaczysz stronę logowania, którą stworzyliśmy w poprzednim kroku.

Krok 4: Zablokowanie dostępu do strony logowania

Teraz, kiedy strona logowania działa, pokażę wam, jak zablokować do niej dostęp przy pomocy opcji deny.

  1. Otwórz ponownie plik konfiguracyjny Nginx:
   sudo nano /etc/nginx/sites-enabled/moja-strona
  1. Dodaj regułę blokującą dostęp:
    Zmodyfikuj istniejącą sekcję location /logowanie, dodając opcję deny all;.
   location /logowanie {
       root /var/www/nowa/logowanie/;
       deny all;
   }

Opis: Opcja deny all; blokuje dostęp do lokalizacji /logowanie dla wszystkich użytkowników.

  1. Załaduj zmiany:
   sudo nginx -s reload

Opis: Ponownie przeładowujemy Nginx, aby zastosować nowe ustawienia.

  1. Sprawdź dostęp do strony logowania:
    Przejdź pod adres:
   https://kursngninx.pl/logowanie/

Opis: Teraz strona logowania powinna być niedostępna, a Nginx zwróci błąd 403 (Forbidden).

Spróbuj również wejść na stronę główną:

   https://kursngninx.pl/

Opis: Strona główna powinna nadal działać bez żadnych problemów.

Podsumowanie

Jak widzisz, zastosowanie locations w NGINX to przydatna i dosyć łatwa w użyciu opcja. Chcesz wiedzieć więcej?
Sprawdź nasze szkolenie Nginx w praktyce: https://asdevops.pl/nginxwchmurze/
Masz jakieś pytanie? Daj znać w komentarzu.

 

Dołącz do szkolenia "Docker w 90 minut!"

Podczas szkolenia dowiesz się wszystkiego, co potrzebne, by wystartować z konteneryzacją. Poznasz podstawową obsługę Dockera. Nauczysz się 17 komend, które musi znać każda osoba działająca z kontenerami, Dockerem i Kubernetesem.

Widzimy się 12 września o 13:00!

Chcesz wziąć udział w szkoleniu? Zapisy na stronie: https://asdevops.pl/s42/

 

12 września o 13:00 webinar "Docker w 90 minut!"

X