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ą.