Serwer proxy odwrotny Nginx odbiera żądania od odwiedzających witrynę i przekazuje je do innego serwera lub aplikacji. Często używa się go, aby udostępnić pod nazwą domeny aplikacje działające na portach takich jak 3000, bez wystawiania ich wewnętrznych portów na działanie internetu.
W tym poradniku skonfigurujesz Nginx w Ubuntu tak, aby przekazywał żądania do lokalnej aplikacji. Podłączysz też domenę i włączysz HTTPS.
Czym jest serwer proxy odwrotny Nginx?
Serwer proxy odwrotny pośredniczy między odwiedzającymi a aplikacją backendową.
Zamiast łączyć się bezpośrednio z aplikacją działającą na porcie 3000, odwiedzający łączą się z Nginx przez standardowe porty HTTP lub HTTPS.
Nginx przekazuje żądanie do aplikacji i zwraca jej odpowiedź.
Przepływ żądań wygląda następująco:
Odwiedzający → Nginx → Aplikacja backendowa
Takie rozwiązanie jest często stosowane w przypadku aplikacji internetowych opartych na Node.js, Pythonie i innych technologiach. Może też obsługiwać terminację TLS, równoważenie obciążenia i scentralizowaną obsługę żądań.
Wymagania wstępne
Przed rozpoczęciem przygotuj:
- Serwer z Ubuntu 24.04 LTS i dostępem do sudo.
- Dostęp do serwera przez SSH.
- Domenę wskazującą na publiczny adres IP serwera.
- Aplikację backendową nasłuchującą na lokalnym porcie.
W tym przykładzie użyjemy portu 3000.
Jeśli dopiero zaczynasz korzystać z SSH, przed kontynuowaniem przeczytaj nasz poradnik dla początkujących dotyczący poleceń SSH.

Krok 1: Zainstaluj Nginx w Ubuntu
Połącz się z serwerem z Ubuntu przez SSH.
Zaktualizuj indeks pakietów i zainstaluj Nginx:
sudo apt update
sudo apt install nginx -y
Sprawdź, czy Nginx działa:
sudo systemctl status nginx
Powinien pojawić się status active (running).
Jeśli Nginx nie został uruchomiony, wykonaj:
sudo systemctl enable --now nginx
Możesz też otworzyć publiczny adres IP serwera w przeglądarce. Jeśli dostęp przez HTTP jest dozwolony, powinna wyświetlić się domyślna strona powitalna Nginx.
Jeśli używasz UFW, zezwól na ruch HTTP i HTTPS:
sudo ufw allow 'Nginx Full'
Sprawdź również reguły zapory skonfigurowane u dostawcy hostingu. Nie wyłączaj zapory tylko po to, aby udostępnić Nginx.
Krok 2: Uruchom testową aplikację backendową
Przed skonfigurowaniem serwera proxy odwrotnego potrzebujemy aplikacji, do której Nginx będzie przekazywał żądania.
Na potrzeby prostego testu utwórz katalog tymczasowy:
mkdir -p ~/nginx-proxy-test
cd ~/nginx-proxy-test
Utwórz prostą stronę HTML:
echo '<h1>Nginx Reverse Proxy Works!</h1>' > index.html
Teraz uruchom wbudowany serwer HTTP Pythona:
python3 -m http.server 3000 --bind 127.0.0.1
Serwer udostępni stronę testową na porcie 3000, dostępnym wyłącznie przez lokalny adres pętli zwrotnej.
Pozostaw ten terminal uruchomiony i otwórz drugą sesję SSH.
Sprawdź, czy aplikacja odpowiada:
curl http://127.0.0.1:3000
Powinien pojawić się wynik:
<h1>Nginx Reverse Proxy Works!</h1>
Ten serwer Pythona służy wyłącznie do demonstracji. W przypadku aplikacji produkcyjnej użyj zalecanego dla niej serwera aplikacji oraz odpowiedniej konfiguracji zarządzania usługą.
Krok 3: Utwórz konfigurację serwera proxy odwrotnego Nginx
Utwórz nowy blok serwera Nginx:
sudo nano /etc/nginx/sites-available/app.example.com
Zastąp app.example.com swoją domeną.
Dodaj następującą konfigurację:
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
Zapisz plik.
Objaśnienie konfiguracji
listen 80przyjmuje żądania HTTP.server_nameokreśla domenę, którą ma obsługiwać Nginx.proxy_passprzekazuje żądania do aplikacji na porcie 3000.proxy_set_headerprzekazuje aplikacji backendowej przydatne informacje o pierwotnym żądaniu.
Aplikacja backendowa musi rozumieć przekazywane nagłówki i bezpiecznie je obsługiwać. Konfiguruj aplikacje tak, aby ufały tym nagłówkom, tylko jeśli żądania docierają przez zaufany serwer proxy.
Krok 4: Włącz i przetestuj konfigurację
Włącz nowy blok serwera:
sudo ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/
Jeśli dowiązanie już istnieje, nie twórz go ponownie.
Sprawdź konfigurację pod kątem błędów:
sudo nginx -t
Jeśli test zakończy się pomyślnie, przeładuj Nginx:
sudo systemctl reload nginx
Teraz otwórz:
http://app.example.com
Jeśli rekordy DNS wskazują właściwy serwer, a testowa aplikacja backendowa nadal działa, powinien pojawić się komunikat:
Serwer proxy odwrotny Nginx działa!
Jeśli zamiast tego pojawi się domyślna strona Nginx, sprawdź rekordy DNS domeny i konfigurację server_name.
Krok 5: Włącz HTTPS za pomocą Let’s Encrypt
W przypadku publicznej witryny użyj HTTPS, zamiast pozostawiać ruch niezaszyfrowany.
Najpierw upewnij się, że domena wskazuje właściwy serwer i że przychodzący ruch na porcie 80 jest dozwolony. Jest to ważne dla standardowego procesu weryfikacji certyfikatu przez HTTP.
Zainstaluj Certbot oficjalną metodą opartą na Snap:
sudo snap install --classic certbot
Jeśli polecenie certbot nie jest jeszcze dostępne, utwórz do niego dowiązanie:
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
Następnie wystąp o certyfikat:
sudo certbot --nginx -d app.example.com
Postępuj zgodnie z wyświetlanymi instrukcjami. Certbot może uzyskać certyfikat i skonfigurować Nginx tak, aby obsługiwał Twoją domenę przez HTTPS.
Następnie przetestuj odnawianie certyfikatu:
sudo certbot renew --dry-run
Otwórz:
https://app.example.com
Twoja aplikacja testowa powinna teraz ładować się przez szyfrowane połączenie.
Krok 6: Sprawdź serwer proxy odwrotny
Sprawdź odpowiedź przez HTTPS:
curl -I https://app.example.com
W przypadku przykładowej aplikacji backendowej w Pythonie odpowiedź HTTP 200 OK oznacza, że żądanie pomyślnie dotarło do aplikacji.
Możesz też sprawdzić, które procesy nasłuchują na serwerze:
sudo ss -ltnp
Nginx powinien nasłuchiwać na skonfigurowanych publicznych portach HTTP i HTTPS, a przykładowa aplikacja backendowa — na 127.0.0.1:3000.
Pamiętaj, że tymczasowy serwer Pythona zatrzyma się po zakończeniu jego sesji terminala. Aplikacje produkcyjne powinny działać pod nadzorem menedżera procesów, takiego jak systemd.
Typowe problemy z serwerem proxy odwrotnym Nginx
502 Bad Gateway
Zwykle oznacza to, że Nginx nie otrzymał prawidłowej odpowiedzi od aplikacji backendowej.
Sprawdź, czy aplikacja działa i czy port w proxy_pass jest prawidłowy.
Nasz poradnik dotyczący rozwiązywania problemu 502 Bad Gateway w Nginx szczegółowo omawia dzienniki, usługi backendowe i problemy z połączeniem.
504 Gateway Timeout
Błąd 504 występuje, gdy brama nie otrzyma wymaganej odpowiedzi od usługi backendowej w odpowiednim czasie.
Zanim zwiększysz limity czasu, sprawdź przyczyny powolnego przetwarzania żądań przez aplikację oraz wydajność jej backendu.
Więcej wskazówek znajdziesz w naszym poradniku rozwiązywania problemu 504 Gateway Timeout.
Domena się nie ładuje
Sprawdź, czy rekord A domeny wskazuje właściwy publiczny adres IP, odpowiednie porty są otwarte w zaporze, a blok serwera Nginx odpowiada żądanej nazwie hosta.
Często zadawane pytania
proxy_pass wskazuje Nginx, dokąd ma przekazywać żądania, na przykład do aplikacji HTTP działającej pod adresem 127.0.0.1:3000.
Tak. Możesz skonfigurować osobne domeny, subdomeny lub ścieżki URL, aby przekazywać żądania do różnych aplikacji backendowych.
Nie. Serwer proxy odwrotny można testować przy użyciu adresu IP lub lokalnie. Domena ułatwia jednak publiczne udostępnianie aplikacji i uzyskanie standardowego certyfikatu HTTPS.
Tak. Nginx o otwartym kodzie źródłowym obsługuje funkcję serwera proxy odwrotnego bez konieczności posiadania licencji komercyjnej.
Podsumowanie
Serwer proxy odwrotny Nginx w Ubuntu jest już skonfigurowany: przekazuje żądania do lokalnej aplikacji i obsługuje HTTPS.
Tę samą podstawową konfigurację można dostosować do aplikacji opartych na Node.js, Pythonie i innych technologiach wykorzystujących HTTP, zmieniając adres aplikacji backendowej w proxy_pass.
Przed wdrożeniem tego rozwiązania w środowisku produkcyjnym upewnij się, że aplikacja uruchamia się automatycznie, działa z odpowiednimi uprawnieniami oraz jest objęta wystarczającym monitoringiem i zabezpieczeniami.