🔄 Jak skonfigurować serwer Nginx jako serwer proxy odwrotny na Ubuntu 20.04

Serwer proxy odwrotny to potężne narzędzie, które może znacząco zwiększyć wydajność, bezpieczeństwo i elastyczność Twojej infrastruktury webowej. Nginx, dzięki swojej lekkości i wysokiej wydajności, jest jednym z najlepszych rozwiązań do implementacji proxy odwrotnego. W tym artykule dowiesz się, jak krok po kroku skonfigurować Nginx jako serwer proxy odwrotny na Ubuntu 20.04.

⚡ Ekspresowe Podsumowanie:

  1. Funkcje proxy odwrotnego: Nginx jako proxy odwrotny może zapewnić równoważenie obciążenia, terminację SSL, buforowanie i zwiększone bezpieczeństwo.
  2. Instalacja i podstawowa konfiguracja: Zainstaluj Nginx, skonfiguruj podstawowy serwer proxy odwrotny kierujący ruch do docelowych serwerów aplikacji.
  3. Zaawansowane opcje: Skonfiguruj load balancing, buforowanie, kompresję i inne funkcje zwiększające wydajność.
  4. Bezpieczeństwo: Zabezpiecz swoją konfigurację przed typowymi zagrożeniami, w tym atakami DDoS i włamaniami.

🗺️ Spis Treści - Twoja Mapa Drogowa


🔍 Co to jest proxy odwrotny i dlaczego warto go używać?

Zanim przejdziemy do praktycznej konfiguracji, warto zrozumieć, czym dokładnie jest serwer proxy odwrotny i jakie korzyści może przynieść Twojej infrastrukturze.

Definicja i zasada działania

Proxy odwrotny (ang. reverse proxy) to serwer pośredniczący, który odbiera żądania od klientów (przeglądarek internetowych) i przekazuje je do odpowiednich serwerów aplikacyjnych. Z perspektywy klienta, proxy odwrotny wygląda jak docelowy serwer - użytkownik nie wie, że jego żądanie jest przekierowywane dalej.

Kluczowe korzyści z używania Nginx jako proxy odwrotnego

  1. Równoważenie obciążenia (Load Balancing): Dystrybucja ruchu między wieloma serwerami backend, co zwiększa wydajność i dostępność.

  2. Terminacja SSL: Obsługa szyfrowania SSL/TLS na poziomie proxy, odciążająca serwery aplikacyjne.

  3. Buforowanie (Caching): Przechowywanie często używanych zasobów, zmniejszające obciążenie serwerów backend.

  4. Kompresja danych: Zmniejszenie ilości przesyłanych danych, co przyspiesza ładowanie stron.

  5. Bezpieczeństwo: Ukrycie szczegółów infrastruktury przed użytkownikami i ochrona przed atakami.

  6. Obsługa wielu aplikacji: Przekierowanie żądań do różnych aplikacji (np. PHP, Node.js, Python) w zależności od URL.

  7. Jednolity interfejs: Udostępnianie różnych aplikacji pod jednym adresem IP/domeną.

✨ Pro Tip: Serwer proxy odwrotny jest szczególnie przydatny w architekturach mikroserwisowych, gdzie wiele małych, niezależnych aplikacji musi być udostępnianych jako spójna całość.

🚀 Instalacja Nginx na Ubuntu 20.04

Przed konfiguracją Nginx jako proxy odwrotnego, musimy najpierw zainstalować sam serwer. Ubuntu 20.04 ułatwia ten proces dzięki menedżerowi pakietów apt.

Aktualizacja pakietów

Zawsze przed instalacją nowego oprogramowania warto zaktualizować listę dostępnych pakietów:

sudo apt update
sudo apt upgrade -y

Instalacja Nginx

Zainstaluj Nginx za pomocą jednego polecenia:

sudo apt install nginx -y

Sprawdzenie statusu instalacji

Po instalacji sprawdź, czy Nginx działa poprawnie:

sudo systemctl status nginx

Powinieneś zobaczyć komunikat wskazujący, że serwis jest aktywny (running). Możesz również sprawdzić działanie serwera otwierając przeglądarkę i wpisując adres IP serwera. Powinieneś zobaczyć domyślną stronę powitalną Nginx.

Konfiguracja zapory sieciowej

Jeśli używasz firewalla UFW (domyślnie włączonego w Ubuntu), musisz otworzyć porty dla ruchu HTTP i HTTPS:

sudo ufw allow 'Nginx Full'

To polecenie otworzy porty 80 (HTTP) i 443 (HTTPS).

📋 Podstawowa konfiguracja proxy odwrotnego

Teraz, gdy mamy działający serwer Nginx, możemy skonfigurować go jako proxy odwrotny.

Struktura plików konfiguracyjnych Nginx

Zanim zaczniemy edytować pliki konfiguracyjne, warto zrozumieć ich strukturę:

  • /etc/nginx/nginx.conf - główny plik konfiguracyjny
  • /etc/nginx/sites-available/ - katalog zawierający konfiguracje dostępnych witryn
  • /etc/nginx/sites-enabled/ - katalog zawierający dowiązania symboliczne do aktywnych witryn
  • /etc/nginx/conf.d/ - katalog z dodatkowymi konfiguracjami

Tworzenie podstawowej konfiguracji proxy

Załóżmy, że chcemy skonfigurować Nginx jako proxy odwrotny dla aplikacji działającej na lokalnym serwerze na porcie 3000 (np. aplikacja Node.js). Wykonaj następujące kroki:

  1. Utwórz nowy plik konfiguracyjny w katalogu sites-available:
sudo nano /etc/nginx/sites-available/app_proxy
  1. Dodaj następującą konfigurację:
server {
    listen 80;
    server_name example.com www.example.com;  # Zastąp własnymi domenami

    location / {
        proxy_pass http://localhost:3000;
        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;
    }
}

Ta konfiguracja przekieruje wszystkie żądania przychodzące na domenę example.com do lokalnej aplikacji działającej na porcie 3000.

  1. Utwórz dowiązanie symboliczne, aby aktywować konfigurację:
sudo ln -s /etc/nginx/sites-available/app_proxy /etc/nginx/sites-enabled/
  1. Sprawdź poprawność konfiguracji:
sudo nginx -t
  1. Jeśli test zakończy się pomyślnie, przeładuj konfigurację Nginx:
sudo systemctl reload nginx

Wyjaśnienie kluczowych dyrektyw

W powyższej konfiguracji użyliśmy kilku ważnych dyrektyw:

  • proxy_pass - określa adres serwera, do którego Nginx będzie przekazywał żądania
  • proxy_http_version - ustawia wersję protokołu HTTP używaną do komunikacji z serwerem upstream
  • proxy_set_header - ustawia nagłówki HTTP przekazywane do serwera upstream
  • proxy_cache_bypass - określa warunki pomijania pamięci podręcznej

✨ Pro Tip: Używaj proxy_set_header Host $host; aby aplikacja docelowa wiedziała, na jaką domenę przyszło żądanie - jest to kluczowe dla aplikacji obsługujących wiele domen.

🔀 Konfiguracja load balancingu

Jedną z najważniejszych funkcji proxy odwrotnego jest równoważenie obciążenia (load balancing) między wieloma serwerami aplikacyjnymi.

Definiowanie grupy serwerów

Aby skonfigurować load balancing, najpierw musimy zdefiniować grupę serwerów upstream:

upstream app_servers {
    server 192.168.1.10:3000;
    server 192.168.1.11:3000;
    server 192.168.1.12:3000;
}

server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://app_servers;
        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;
    }
}

W tej konfiguracji, app_servers to nazwa grupy serwerów, a dyrektywa proxy_pass http://app_servers; wskazuje, że żądania mają być przekierowywane do tej grupy.

Metody równoważenia obciążenia

Nginx oferuje kilka metod równoważenia obciążenia:

  1. Round Robin (domyślna) - żądania są dystrybuowane po kolei do każdego serwera

  2. Least Connections - żądania są wysyłane do serwera z najmniejszą liczbą aktywnych połączeń:

upstream app_servers {
    least_conn;
    server 192.168.1.10:3000;
    server 192.168.1.11:3000;
    server 192.168.1.12:3000;
}
  1. IP Hash - żądania od tego samego adresu IP zawsze trafiają do tego samego serwera:
upstream app_servers {
    ip_hash;
    server 192.168.1.10:3000;
    server 192.168.1.11:3000;
    server 192.168.1.12:3000;
}
  1. Weighted - serwery otrzymują różną liczbę żądań zgodnie z przypisanymi wagami:
upstream app_servers {
    server 192.168.1.10:3000 weight=5;  # Ten serwer otrzyma więcej żądań
    server 192.168.1.11:3000 weight=3;
    server 192.168.1.12:3000 weight=1;  # Ten serwer otrzyma najmniej żądań
}

Konfiguracja odporności na awarie

Możemy również skonfigurować zachowanie w przypadku awarii serwerów:

upstream app_servers {
    server 192.168.1.10:3000;
    server 192.168.1.11:3000 backup;  # Ten serwer będzie używany tylko gdy inne są niedostępne
    server 192.168.1.12:3000 max_fails=3 fail_timeout=30s;  # Oznacz serwer jako niedostępny po 3 nieudanych próbach
}

🔒 Konfiguracja SSL/TLS z Let's Encrypt

Zabezpieczenie komunikacji za pomocą protokołu HTTPS jest dziś standardem. Skonfigurujmy Nginx jako proxy odwrotny z obsługą SSL/TLS za pomocą darmowych certyfikatów Let's Encrypt.

Instalacja Certbot

Certbot to narzędzie, które automatyzuje proces uzyskiwania i odnawiania certyfikatów Let's Encrypt:

sudo apt install certbot python3-certbot-nginx -y

Uzyskanie certyfikatu SSL

Po zainstalowaniu Certbot możemy uzyskać certyfikat dla naszej domeny:

sudo certbot --nginx -d example.com -d www.example.com

Certbot zmodyfikuje pliki konfiguracyjne Nginx, aby uwzględnić certyfikat SSL i przekierowanie HTTP na HTTPS.

Weryfikacja automatycznego odnowienia

Certyfikaty Let's Encrypt są ważne przez 90 dni, ale Certbot automatycznie dodaje zadanie cron do ich odnowienia. Możesz sprawdzić, czy automatyczne odnowienie działa poprawnie:

sudo certbot renew --dry-run

Ręczna konfiguracja HTTPS dla proxy

Jeśli chcesz ręcznie skonfigurować HTTPS dla proxy odwrotnego (np. jeśli masz własny certyfikat SSL), użyj następującej konfiguracji:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;  # Przekierowanie HTTP na HTTPS
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    # Zalecane ustawienia bezpieczeństwa SSL
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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_set_header X-Forwarded-Proto $scheme;
    }
}

Uwaga: W powyższej konfiguracji dodajemy nagłówki X-Real-IP, X-Forwarded-For i X-Forwarded-Proto, które przekazują informacje o oryginalnym kliencie do serwera aplikacyjnego. Jest to ważne dla prawidłowego logowania i bezpieczeństwa.

📦 Zaawansowana konfiguracja proxy odwrotnego

Buforowanie odpowiedzi

Buforowanie odpowiedzi może znacznie zmniejszyć obciążenie serwerów aplikacyjnych i przyspieszyć czas ładowania stron:

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://localhost:3000;
            proxy_cache my_cache;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            add_header X-Proxy-Cache $upstream_cache_status;
        }
    }
}

W tej konfiguracji:

  • /var/cache/nginx to ścieżka do katalogu cache
  • levels=1:2 definiuje strukturę podkatalogów w katalogu cache
  • keys_zone=my_cache:10m tworzy strefę współdzielonej pamięci o nazwie "my_cache" i rozmiarze 10MB
  • max_size=1g ogranicza maksymalny rozmiar katalogu cache do 1GB
  • inactive=60m usuwa pliki, które nie były używane przez 60 minut

Kompresja GZIP

Kompresja GZIP zmniejsza rozmiar przesyłanych danych, co przyspiesza ładowanie stron:

server {
    listen 80;
    server_name example.com;

    gzip on;
    gzip_types text/plain application/xml text/css application/javascript;
    gzip_min_length 1000;

    location / {
        proxy_pass http://localhost:3000;
    }
}

Limity i zabezpieczenia

Możemy dodać różne limity i zabezpieczenia, aby chronić nasze serwery przed przeciążeniem:

http {
    # Limity dla klientów
    client_body_timeout 12;
    client_header_timeout 12;
    send_timeout 10;

    # Limit wielkości ciała żądania
    client_max_body_size 10m;

    # Limit liczby połączeń
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;

    server {
        listen 80;
        server_name example.com;

        # Zastosowanie limitów w konkretnej lokalizacji
        location / {
            limit_conn conn_limit_per_ip 10;
            limit_req zone=req_limit_per_ip burst=10 nodelay;

            proxy_pass http://localhost:3000;
        }
    }
}

🛠️ Routing bazujący na ścieżkach URL

Nginx umożliwia kierowanie różnych ścieżek URL do różnych aplikacji backend.

Routing do różnych serwerów aplikacyjnych

server {
    listen 80;
    server_name example.com;

    # Przekierowanie /api do aplikacji API
    location /api {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
    }

    # Przekierowanie /admin do panelu administracyjnego
    location /admin {
        proxy_pass http://localhost:3002;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
    }

    # Wszystkie pozostałe żądania do głównej aplikacji
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
    }
}

Modyfikacja ścieżek podczas przekierowywania

Możemy również modyfikować ścieżki podczas przekierowywania:

# Przekierowanie /api do aplikacji API z usunięciem prefiksu /api
location /api/ {
    proxy_pass http://localhost:3001/;  # Zwróć uwagę na ukośnik na końcu!
}

# Przekierowanie /admin do głównej strony panelu administracyjnego
location /admin {
    proxy_pass http://localhost:3002/dashboard;  # Przekierowanie do konkretnej ścieżki
}

W pierwszym przykładzie, żądanie do /api/users zostanie przekierowane do http://localhost:3001/users (prefix /api zostanie usunięty), a w drugim żądanie do /admin zostanie przekierowane do http://localhost:3002/dashboard.

🔧 Debugowanie i rozwiązywanie problemów

Podczas konfiguracji proxy odwrotnego mogą wystąpić różne problemy. Oto jak je zdiagnozować i rozwiązać.

Sprawdzanie logów Nginx

Logi Nginx są kluczowym źródłem informacji o problemach:

# Logi błędów
sudo tail -f /var/log/nginx/error.log

# Logi dostępu
sudo tail -f /var/log/nginx/access.log

Zwiększenie poziomu logowania

Możesz zwiększyć poziom szczegółowości logów dla celów debugowania:

error_log /var/log/nginx/error.log debug;

Poziomy logowania od najmniej do najbardziej szczegółowego: emerg, alert, crit, error, warn, notice, info, debug.

Typowe problemy i rozwiązania

  1. Błąd 502 Bad Gateway

    • Przyczyną może być niedostępność serwera aplikacyjnego
    • Sprawdź, czy aplikacja backend działa poprawnie
    • Sprawdź ustawienia w dyrektywie proxy_pass
  2. Błąd 504 Gateway Timeout

    • Serwer aplikacyjny nie odpowiada w ustalonym czasie
    • Zwiększ timeout:
      proxy_connect_timeout 75s;
      proxy_read_timeout 300s;
  3. Problemy z WebSockets

    • Upewnij się, że masz odpowiednie nagłówki:
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
  4. Problemy z przekierowaniami

    • Aplikacja może generować przekierowania z niewłaściwymi adresami
    • Użyj proxy_redirect:
      proxy_redirect http://localhost:3000/ https://example.com/;

📈 Optymalizacja wydajności

Odpowiednio skonfigurowany Nginx może znacząco zwiększyć wydajność Twojej infrastruktury.

Buforowanie

Oprócz buforowania odpowiedzi, Nginx umożliwia buforowanie różnych typów danych:

# Buforowanie nagłówków odpowiedzi
proxy_buffer_size 8k;
proxy_buffers 8 16k;

# Buforowanie połączeń WebSocket
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;

Worker Processes

Dostosuj liczbę procesów roboczych do liczby rdzeni CPU:

# W pliku /etc/nginx/nginx.conf
worker_processes auto;  # Automatyczne wykrywanie liczby rdzeni CPU

Keepalive Connections

Włącz keepalive dla połączeń upstream, aby zmniejszyć obciążenie związane z ustanawianiem nowych połączeń:

upstream backend {
    server 192.168.1.10:3000;
    server 192.168.1.11:3000;
    keepalive 16;  # Utrzymuj 16 połączeń w puli
}

server {
    # ...
    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";  # Wymagane dla keepalive
    }
}

Microcaching

Technika "microcaching" polega na krótkotrwałym buforowaniu dynamicznych treści, co może drastycznie zmniejszyć obciążenie serwera:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=microcache:10m max_size=1g inactive=1h;

server {
    # ...
    location / {
        proxy_pass http://backend;
        proxy_cache microcache;
        proxy_cache_valid 200 1s;  # Buforowanie tylko na 1 sekundę
        proxy_cache_key $scheme$host$request_uri$cookie_user;  # Klucz cache z uwzględnieniem ciasteczka użytkownika
        proxy_cache_bypass $cookie_nocache;  # Pozwala na ominięcie cache za pomocą ciasteczka
    }
}

❓ FAQ - Odpowiedzi na Twoje Pytania

Czy Nginx jako proxy odwrotny wpłynie na wydajność mojej aplikacji?
W większości przypadków Nginx jako proxy odwrotny zwiększa wydajność aplikacji dzięki buforowaniu, kompresji i optymalizacji połączeń. Dodaje minimalne opóźnienie (zwykle poniżej 1ms), ale korzyści znacznie przewyższają koszty.

Jak obsługiwać WebSockets przez Nginx?
Aby obsługiwać WebSockets, należy dodać specjalne nagłówki w konfiguracji:

location /socket.io/ {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

Jak przekierować HTTP na HTTPS w Nginx?
Użyj poniższej konfiguracji:

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

Jak skonfigurować Nginx jako cache dla statycznych plików?

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    proxy_pass http://backend;
    proxy_cache my_cache;
    proxy_cache_valid 200 302 24h;
    proxy_cache_valid 404 1m;
    expires 1d;
}

Jakie są zalecane praktyki zabezpieczania Nginx jako proxy odwrotnego?

  1. Używaj HTTPS z nowoczesnymi szyfrowaniami
  2. Ogranicz wyświetlanie informacji o serwerze (server_tokens off;)
  3. Wdrażaj limity żądań i połączeń
  4. Regularnie aktualizuj Nginx
  5. Używaj nagłówków bezpieczeństwa (X-Content-Type-Options, X-XSS-Protection, itd.)

🏁 Podsumowanie - Gotowy na Wdrożenie?

W tym artykule nauczyłeś się, jak skonfigurować Nginx jako serwer proxy odwrotny na Ubuntu 20.04. Omówiliśmy:

  • Podstawowy koncept i zalety proxy odwrotnego
  • Instalację i podstawową konfigurację Nginx
  • Konfigurację load balancingu dla zwiększenia dostępności
  • Zabezpieczenie komunikacji za pomocą SSL/TLS
  • Zaawansowane opcje konfiguracji, takie jak buforowanie i kompresja
  • Routing bazujący na ścieżkach URL
  • Debugowanie i rozwiązywanie problemów
  • Optymalizację wydajności

Nginx jako proxy odwrotny jest potężnym narzędziem w arsenale każdego administratora systemu. Pozwala na znaczną poprawę wydajności, bezpieczeństwa i elastyczności infrastruktury webowej, a jednocześnie jest stosunkowo łatwy w konfiguracji i utrzymaniu.

🚀 Wybierz Hosting IQHost z Nginx

Sprawdź naszą ofertę serwerów VPS z Nginx

Nasze serwery są zoptymalizowane pod kątem wydajności Nginx i wspieramy konfigurację proxy odwrotnego. Nasz zespół ekspertów jest gotowy pomóc Ci w optymalizacji Twojej infrastruktury.

Czy ten artykuł był pomocny?

Wróć do listy wpisów

Twoja strona WordPress działa wolno?

Sprawdź nasz hosting WordPress z ultraszybkimi dyskami NVMe i konfiguracją serwera zoptymalizowaną pod kątem wydajności. Doświadcz różnicy już dziś!

Sprawdź ofertę hostingu
30-dniowa gwarancja zwrotu pieniędzy