Nginx kaip reverse proxy: konfigūravimas

Reverse proxy su Nginx priima užklausas 80/443 prievaduose ir perduoda jas programai vietiniame prievade (pavyzdžiui 127.0.0.1:3000), pridėdamas reikiamas antraštes. Taip gaunate vieną įėjimo tašką, HTTPS ir apkrovos balansavimą. Toliau — veikianti konfigūracija su proxy, antraštėmis, TLS ir WebSocket.

Ką daro reverse proxy

  • Priima išorines HTTP/HTTPS užklausas ir perduoda jas vidinei programai (Node.js, Python, PHP-FPM ir pan.).
  • Užbaigia TLS: programa dirba per HTTP, o šifravimą prisiima Nginx.
  • Slepia vidinę struktūrą ir programų prievadus už vieno domeno.
  • Leidžia balansuoti apkrovą tarp kelių vidinių serverių.

1 žingsnis. Įdiekite Nginx

sudo apt update
sudo apt install nginx
sudo systemctl enable --now nginx

2 žingsnis. Sukurkite svetainės konfigūraciją

Sukurkite virtualaus mazgo failą:

sudo nano /etc/nginx/sites-available/app.conf

Bazinis reverse proxy į programą 3000 prievade:

server {
    listen 80;
    server_name example.com;

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

Kam reikalingos antraštės: be X-Forwarded-For ir X-Real-IP programa matys IP 127.0.0.1 vietoj tikrojo kliento, o X-Forwarded-Proto praneša vidinei programai apie pradinį HTTPS.

3 žingsnis. Aktyvuokite konfigūraciją

sudo ln -s /etc/nginx/sites-available/app.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Komanda nginx -t patikrina sintaksę prieš perkraunant — nepraleiskite jos.

4 žingsnis. WebSocket palaikymas

Jei programa naudoja WebSocket (pokalbiai, gyvi atnaujinimai), į location pridėkite Upgrade antraščių perdavimą:

location / {
    proxy_pass http://127.0.0.1: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-Forwarded-For $proxy_add_x_forwarded_for;
}

5 žingsnis. Įjunkite HTTPS

Įdiekite certbot ir gaukite Let’s Encrypt sertifikatą — jis pats įrašys TLS į konfigūraciją:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com

Po to Nginx klausys 443 prievado su sertifikatu, o užklausos iš 80 prievado bus peradresuotos į HTTPS.

Kelių vidinių serverių balansavimas

Apkrovai paskirstyti aprašykite upstream grupę:

upstream backend {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Laiko limitai ir įkeliamų failų dydis

Pagal numatymą Nginx riboja užklausos kūną iki 1 MB ir nutraukia lėtus vidinės programos atsakymus. Programoms su failų įkėlimu ir ilgomis operacijomis padidinkite limitus server arba location bloke:

client_max_body_size 50m;
proxy_connect_timeout 60s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;

Direktyva client_max_body_size nustato didžiausią įkėlimo dydį, o proxy_* laiko limitai — kiek laukti ryšio ir vidinės programos atsakymo, prieš grąžinant 504 Gateway Timeout.

Proxy pagal kelią

Vieną domeną galima paskirstyti kelioms programoms pagal URL prefiksą. Pavyzdžiui, /api/ — į vidinę programą, visa kita — į priekinę:

location /api/ {
    proxy_pass http://127.0.0.1:4000/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

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

Atkreipkite dėmesį į pasvirąjį brūkšnį proxy_pass http://127.0.0.1:4000/ pabaigoje — jis nukerpa prefiksą /api/, ir vidinė programa gauna kelią be jo.

Pagrindinės direktyvos

Direktyva Paskirtis
proxy_pass vidinės programos adresas
proxy_set_header antraščių perdavimas programai
proxy_http_version 1.1 reikalinga keep-alive ir WebSocket
upstream serverių grupė balansavimui

Dažni klausimai

Klaida 502 Bad Gateway — kokia priežastis? Nginx nepavyko prisijungti prie vidinės programos: ji nepaleista, klauso kito prievado arba nulūžo. Patikrinkite ss -tulpn | grep 3000 ir programos žurnalus.

Programa mato IP 127.0.0.1 vietoj kliento — kodėl? Neperduodamos antraštės. Pridėkite X-Forwarded-For ir X-Real-IP bei nustatykite programą pasitikėti šiomis antraštėmis.

Kaip patikrinti konfigūraciją prieš pritaikant? Įvykdykite sudo nginx -t — jis parodys sintaksės klaidas neperkraunant tarnybos.

Ar reikia atidaryti vidinės programos prievadą į išorę? Ne. Vidinė programa klauso 127.0.0.1, į išorę atviri tik Nginx 80/443 prievadai. Taip saugiau.

Kaip atnaujinti TLS sertifikatą? certbot įdiegia automatinio atnaujinimo laikmatį. Patikrinti: sudo certbot renew --dry-run.

Reikia serverio Nginx ir savo programoms talpinti? Paleiskite VPS su Linux skiltyje VPS nuoma arba užsakykite konfigūravimą per Serverių administravimą.

Inga Vītola