🔄 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:
- Funkcje proxy odwrotnego: Nginx jako proxy odwrotny może zapewnić równoważenie obciążenia, terminację SSL, buforowanie i zwiększone bezpieczeństwo.
- Instalacja i podstawowa konfiguracja: Zainstaluj Nginx, skonfiguruj podstawowy serwer proxy odwrotny kierujący ruch do docelowych serwerów aplikacji.
- Zaawansowane opcje: Skonfiguruj load balancing, buforowanie, kompresję i inne funkcje zwiększające wydajność.
- 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
-
Równoważenie obciążenia (Load Balancing): Dystrybucja ruchu między wieloma serwerami backend, co zwiększa wydajność i dostępność.
-
Terminacja SSL: Obsługa szyfrowania SSL/TLS na poziomie proxy, odciążająca serwery aplikacyjne.
-
Buforowanie (Caching): Przechowywanie często używanych zasobów, zmniejszające obciążenie serwerów backend.
-
Kompresja danych: Zmniejszenie ilości przesyłanych danych, co przyspiesza ładowanie stron.
-
Bezpieczeństwo: Ukrycie szczegółów infrastruktury przed użytkownikami i ochrona przed atakami.
-
Obsługa wielu aplikacji: Przekierowanie żądań do różnych aplikacji (np. PHP, Node.js, Python) w zależności od URL.
-
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:
- Utwórz nowy plik konfiguracyjny w katalogu sites-available:
sudo nano /etc/nginx/sites-available/app_proxy
- 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.
- Utwórz dowiązanie symboliczne, aby aktywować konfigurację:
sudo ln -s /etc/nginx/sites-available/app_proxy /etc/nginx/sites-enabled/
- Sprawdź poprawność konfiguracji:
sudo nginx -t
- 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:
-
Round Robin (domyślna) - żądania są dystrybuowane po kolei do każdego serwera
-
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;
}
- 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;
}
- 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
iX-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 cachelevels=1:2
definiuje strukturę podkatalogów w katalogu cachekeys_zone=my_cache:10m
tworzy strefę współdzielonej pamięci o nazwie "my_cache" i rozmiarze 10MBmax_size=1g
ogranicza maksymalny rozmiar katalogu cache do 1GBinactive=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
-
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
-
Błąd 504 Gateway Timeout
- Serwer aplikacyjny nie odpowiada w ustalonym czasie
- Zwiększ timeout:
proxy_connect_timeout 75s; proxy_read_timeout 300s;
-
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";
- Upewnij się, że masz odpowiednie nagłówki:
-
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?
- Używaj HTTPS z nowoczesnymi szyfrowaniami
- Ogranicz wyświetlanie informacji o serwerze (
server_tokens off;
) - Wdrażaj limity żądań i połączeń
- Regularnie aktualizuj Nginx
- 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?
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