Polski

Reverse proxy Nginx na VPS Linux

2 min
Hosting VPS/VDS

Reverse proxy przyjmuje publiczny ruch na portach 80 i 443 i przekazuje go do aplikacji nasłuchujących tylko lokalnie. Zapewnia HTTPS, wiele stron na jednym IP oraz jedno miejsce na logi i limity. Ten poradnik konfiguruje go na VPS Linux Infrawire dla aplikacji Node.js, Python lub Docker.

📋 Wymagania wstępne

  • VPS z Linuxem (Ubuntu 24.04 / Debian 12 lub AlmaLinux 9 / Rocky 9) z dostępem SSH jako root. Adres IP i hasło roota są w panelu klienta.
  • Domena example.com z rekordami A/AAAA wskazującymi na VPS_IP.
  • Aplikacja nasłuchująca na lokalnym porcie, np. 127.0.0.1:3000.

📦 Instalacja Nginx

Bash
# Debian / Ubuntu sudo apt update && sudo apt install -y nginx # AlmaLinux / Rocky sudo dnf install -y nginx sudo systemctl enable --now nginx

W AlmaLinux/Rocky SELinux domyślnie blokuje Nginxowi łączenie się z backendami. Zezwól na to jednorazowo:

Bash
sudo setsebool -P httpd_can_network_connect 1

🚀 Pierwsza aplikacja za proxy

Aplikacja musi nasłuchiwać na 127.0.0.1, a nie na 0.0.0.0, aby była dostępna tylko przez Nginx. Niezależnie od języka schemat jest ten sam: node server.js na porcie 3000, gunicorn -b 127.0.0.1:8000 app:app dla Pythona albo kontener opublikowany poleceniem docker run -d -p 127.0.0.1:3000:80 IMAGE.

Utwórz /etc/nginx/sites-available/example.com (w AlmaLinux/Rocky użyj /etc/nginx/conf.d/example.com.conf):

Nginx
1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com; 5 6 location / { 7 proxy_pass http://127.0.0.1:3000; 8 proxy_http_version 1.1; 9 proxy_set_header Host $host; 10 proxy_set_header X-Real-IP $remote_addr; 11 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 12 proxy_set_header X-Forwarded-Proto $scheme; 13 } 14}

Włącz go w Debianie/Ubuntu, a następnie sprawdź i przeładuj:

Bash
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx

Nagłówki X-Forwarded-* informują aplikację o prawdziwym IP klienta i o tym, czy użył HTTPS. Bez nich aplikacja widzi tylko 127.0.0.1 i może generować linki http://. Wiele frameworków trzeba też skonfigurować tak, by ufały proxy (np. app.set('trust proxy', 1) w Express).

🔌 Obsługa WebSocket

WebSocket wymaga nagłówków aktualizacji HTTP. Dodaj map na początku kontekstu http (np. w /etc/nginx/conf.d/websocket.conf):

Nginx
map $http_upgrade $connection_upgrade { default upgrade; '' close; }

Następnie w bloku location:

Nginx
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;

⏱️ Timeouty i rozmiar żądania

Domyślnie to 60 sekund i 1 MB. Dostosuj je do wolnych endpointów lub wysyłania plików:

Nginx
proxy_connect_timeout 5s; proxy_read_timeout 120s; proxy_send_timeout 120s; client_max_body_size 50m;

Dla długo żyjącego WebSocketu zwiększ proxy_read_timeout (np. 3600s) lub każ aplikacji wysyłać pingi.

🔒 HTTPS z Certbotem

Najpierw otwórz w zaporze porty 80 i 443, potem:

Bash
# Debian / Ubuntu sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d example.com

W AlmaLinux/Rocky zainstaluj Certbota poleceniem sudo dnf install -y epel-release, a potem sudo dnf install -y certbot python3-certbot-nginx. Certbot dodaje certyfikat do bloku server, proponuje przekierowanie HTTP na HTTPS i ustawia automatyczne odnawianie. Sprawdź je poleceniem:

Bash
sudo certbot renew --dry-run

🗂️ Wiele aplikacji na jednym VPS

Utwórz osobny blok server dla każdej domeny, każdy z własnym server_name i własnym portem lokalnym:

Nginx
1server { 2 listen 80; 3 server_name app1.example.com; 4 location / { proxy_pass http://127.0.0.1:3000; } 5} 6 7server { 8 listen 80; 9 server_name app2.example.com; 10 location / { proxy_pass http://127.0.0.1:8000; } 11}

Powtórz nagłówki proxy w każdym bloku, a potem uruchom Certbota z -d app1.example.com -d app2.example.com. Możesz też dzielić według ścieżki (location /api/ { proxy_pass http://127.0.0.1:8000/; }); końcowy ukośnik usuwa wtedy prefiks.

✅ Test

Bash
curl -I https://example.com ss -ltnp | grep -E ':(80|443|3000)' sudo tail -f /var/log/nginx/error.log

Port backendu powinien być związany tylko z 127.0.0.1, a Nginx nasłuchuje na 80 i 443.

🛠️ Rozwiązywanie problemów

502 Bad Gateway. Aplikacja jest zatrzymana lub działa na innym porcie. Sprawdź ss -ltnp i uruchom ją. W AlmaLinux/Rocky Permission denied w logu błędów oznacza brak powyższej wartości logicznej SELinux.

504 Gateway Timeout. Backend odpowiada dłużej niż proxy_read_timeout. Zwiększ wartość lub zoptymalizuj endpoint.

WebSocket się rozłącza lub kończy błędem 400/426. Brakuje nagłówków Upgrade i Connection albo proxy_http_version 1.1;.

Zły adres IP klienta w logach. X-Forwarded-For jest wysyłany, ale aplikacja nie ufa proxy. Włącz odpowiednie ustawienie zaufania w swoim frameworku.


🎉 Twoje aplikacje działają teraz za Nginx z HTTPS, poprawnymi nagłówkami i miejscem na tyle stron, ile uniesie Twój VPS.

Bądź na bieżąco z najnowszymi ofertami, zniżkami i promocjami specjalnymi.

Zobacz promocje

Używamy plików cookie

Używamy plików cookie analitycznych, aby ulepszać nasz serwis. Nie sprzedajemy danych stronom trzecim. Więcej w polityce prywatności.