IlmHamroh
JavaScript Full-stack/25-qism. HTTP, Express va REST API8/51-dars14 daqiqa
Mundarija (26)

Reverse proxy orqasida Node.js: nginx, Caddy, X-Forwarded-For va trust proxy

Qisqacha: Prodakshnda Node odatda reverse proxy (nginx, Caddy) ortida turadi. Proxy TLS'ni tugatadi va so'rovni Node'ga uzatadi. Shunda Node mijozning haqiqiy IP'sini va protokolini o'zi ko'rmaydi — faqat proxy qo'shgan X-Forwarded-For, X-Forwarded-Proto va X-Forwarded-Host sarlavhalaridan biladi. Bu sarlavhalarni mijoz ham yuborishi mumkin. Shuning uchun ularga faqat ishonchli proxy'dan kelganda ishoniladi: Express'da trust proxy = proxy'lar soni yoki aniq IP. Biz o'lchadik: trust proxy = true bilan soxta X-Forwarded-For: 6.6.6.6 yuborgan mijozning IP'si 6.6.6.6 deb ko'rindi, trust proxy = 1 bilan esa haqiqiy IP qoldi.

Bu darsda

  • Reverse proxy nima qilishini va nega Node uning ortida turishini tushuntirasiz.
  • X-Forwarded-For, -Proto, -Host va standart Forwarded sarlavhasini o'qiysiz.
  • Mijoz IP'sini proxy zanjiridan to'g'ri ajratadigan funksiya yozasiz.
  • Express'ning trust proxy sozlamasining to'rt qiymatini o'lchov bilan solishtirasiz.
  • nginx va Caddy konfiguratsiyasini, WebSocket va gzip qayerda bo'lishini bilasiz.

Oldin bilishingiz kerak: HTTPS, TLS va HTTP/2, Server timeout'lari va keep-alive, Domen va DNS.

1. Nega bu kerak?

TLS darsida qaror qildik: vazifalar-api HTTPS'ni o'zi qilmaydi, uni oldidagi proxy bajaradi. Timeout'lar darsida esa LB ortidagi 502 ni ko'rdik. Endi shu sxemaning narxini ko'ramiz.

Node'ga kelgan har so'rovning manbai — proxy. req.socket.remoteAddress doim 127.0.0.1. Bu muammo, chunki IP ko'p joyda kerak: loglarda "kim so'radi", so'rovlar sonini cheklash (bir IP'dan daqiqasiga 100 tadan ko'p emas), shubhali kirishlarni bloklash. Hamma mijoz 127.0.0.1 bo'lsa — cheklov butun saytni bitta odam deb hisoblaydi va hammani bloklaydi.

Protokol ham yo'qoladi: foydalanuvchi https:// bilan keldi, Node esa oddiy HTTP so'rov ko'rdi. Secure cookie qo'yish yoki to'g'ri https://... havola yasash uchun buni bilish kerak.

O'xshatish: mehmonxona qabulxonasi. Mehmon xonaga to'g'ridan kirmaydi — qabulxona (proxy) uni qabul qiladi va xizmatchiga qog'oz beradi: "305-xona, ismi Ali, pasport bilan keldi". Xizmatchi (Node) mehmonni o'zi ko'rmaydi, faqat qog'ozga ishonadi. Lekin qog'ozni mehmonning o'zi yozib kelsa-chi? Xizmatchi faqat qabulxonaning qog'oziga ishonishi kerak.

2. Reverse proxy nima qiladi

2.1 Sxema

Reverse proxy (teskari proksi) — mijozlar va serverlar orasidagi dastur. U mijozlar uchun o'zini "server" deb ko'rsatadi, so'rovni esa ichkaridagi haqiqiy serverga uzatadi. Oddiy (forward) proksi aksincha — mijoz tomonida turadi, masalan ofis tarmog'ida.

flowchart LR
  M["Mijoz<br/>203.0.113.7"] -- "HTTPS :443" --> P["nginx / Caddy"]
  P -- "HTTP<br/>X-Forwarded-For: 203.0.113.7<br/>X-Forwarded-Proto: https" --> N["Node<br/>127.0.0.1:3000"]
  H["Hujumchi"] -. "to'g'ridan :3000" .-> N

Diagrammadagi uzuq chiziqqa qarang. Node faqat 127.0.0.1 da tinglasa, tashqaridan unga to'g'ridan yetib bo'lmaydi — hujumchi proxy'ni chetlab o'ta olmaydi. Kanonda HOST sukut bo'yicha 127.0.0.1. 0.0.0.0 (hamma interfeys) qo'ysangiz, Node tashqi tarmoqqa ochiladi va proxy'siz ham javob beradi.

2.2 Proxy nimalarni oladi

Vazifa Kim qiladi
TLS, sertifikat yangilash proxy
Static fayllar, kesh proxy yoki CDN
gzip / brotli siqish proxy
Bir nechta Node jarayoniga taqsimlash proxy (load balancing)
Sekin mijozlar, Slowloris proxy (so'rovni to'liq olib, keyin uzatadi)
Biznes mantiq, JSON API Node

Siqish haqida: kanon mashhur middleware'lar darsida compression middleware'ini o'lchadi. Katta ro'yxatda u Node'ning tezligini 45 % ga tushirdi. Shuning uchun vazifalar-api da siqish yo'q — u proxy'ning ishi.

3. X-Forwarded-* sarlavhalari

3.1 Uchta sarlavha

Proxy so'rovni uzatishda uchta sarlavha qo'shadi (de-fakto standart, ko'p proxy'lar shunday qiladi):

Sarlavha Misol Nima
X-Forwarded-For (XFF) 203.0.113.7, 10.0.0.2 IP zanjiri: mijoz, keyin har proxy
X-Forwarded-Proto https mijoz qaysi protokolda keldi
X-Forwarded-Host api.example.com mijoz qaysi domenga so'radi

XFF — ro'yxat. Har proxy kelgan qiymatning oxiriga o'zi ko'rgan IP'ni qo'shadi. Ikki proxy bo'lsa (masalan Cloudflare, keyin nginx): mijoz, cloudflare-ip. nginx esa Cloudflare'ni soketdan ko'radi.

3.2 Standart: Forwarded

2014 yilda xuddi shu ma'lumot uchun standart sarlavha chiqdi — RFC 7239:

http
Forwarded: for=203.0.113.7;proto=https;host=api.example.com

U uchta sarlavhani bittaga birlashtiradi. Lekin amalda X-Forwarded-* ancha keng tarqalgan. Express hujjatining "behind proxies" sahifasida ham faqat X-Forwarded-* tilga olinadi — Forwarded haqida gap yo'q. Shu sabab darsda asosan ular.

3.3 Soxta sarlavha muammosi

Sarlavha — oddiy matn. Mijoz X-Forwarded-For: 6.6.6.6 ni o'zi ham yozib yuborishi mumkin. Biz ishga tushirdik: kichik proxy (nginx o'rnida, $proxy_add_x_forwarded_for kabi — kelgan XFF oxiriga mijoz IP'sini qo'shadi) va uning ortida server. Server o'zi ko'rganini qaytaradi:

js
import { createServer, request } from "node:http";

const serverlar = [];
const tingla = (s) => new Promise((ok) => {
  serverlar.push(s);
  s.listen(0, "127.0.0.1", () => ok(s.address().port));
});

// Orqa server (bizning Node): nimani ko'rayotganini qaytaradi
const orqa = await tingla(createServer((req, res) => {
  res.end(JSON.stringify({
    soket: req.socket.remoteAddress,
    xff: req.headers["x-forwarded-for"],
    proto: req.headers["x-forwarded-proto"],
  }));
}));

// Proxy (nginx o'rnida): mijoz IP'sini XFF oxiriga QO'SHADI
const proxy = await tingla(createServer((req, res) => {
  const eski = req.headers["x-forwarded-for"];
  const ip = req.socket.remoteAddress;
  const headers = {
    ...req.headers,
    "x-forwarded-for": eski ? `${eski}, ${ip}` : ip,
    "x-forwarded-proto": "https",
  };
  const opts = { port: orqa, host: "127.0.0.1", path: req.url,
    method: req.method, headers };
  req.pipe(request(opts, (j) => j.pipe(res)));
}));

const sor = async (port, headers) =>
  (await fetch(`http://127.0.0.1:${port}/`, { headers })).text();
console.log("proxy orqali:      ", await sor(proxy));
console.log("proxy + soxta XFF: ",
  await sor(proxy, { "X-Forwarded-For": "6.6.6.6" }));
for (const s of serverlar) {
  s.closeAllConnections(); // keep-alive ulanishlarni kutmaymiz
  s.close();
}

Konsolda:

text
proxy orqali:       {"soket":"127.0.0.1","xff":"127.0.0.1","proto":"https"}
proxy + soxta XFF:  {"soket":"127.0.0.1","xff":"6.6.6.6, 127.0.0.1","proto":"https"}

Ikki qatordagi xff qiymatini solishtiring. Ikkinchi qatorda XFF ikki elementli: 6.6.6.6 — mijoz yozgan (yolg'on), 127.0.0.1 — proxy ko'rgan (haqiqat). Bizning sinovda mijoz ham shu kompyuterda, shuning uchun haqiqiy IP ham 127.0.0.1. Qaysi biriga ishonish kerak? Qoida: o'ngdan chapga yuring va ishonchli proxy'larni tashlab keting. Birinchi ishonchsiz manzil — mijoz. Chap tomondagi hamma narsa mijozning qo'lida, ular yolg'on bo'lishi mumkin.

Tekshirib ko'ring: Bitta nginx bor. XFF: 1.1.1.1, 2.2.2.2, 198.51.100.4. Mijozning haqiqiy IP'si qaysi?

Javob

198.51.100.4 — eng o'ngdagi, uni nginx o'zi ko'rgan va qo'shgan. 1.1.1.1, 2.2.2.2 ni mijoz o'zi yozib keldi, ularni tekshirib bo'lmaydi.

4. Mijoz IP'sini ajratish

4.1 Algoritm — toza funksiya

Express ichida proxy-addr paketi aynan shu ishni qiladi. Uning mantig'ini qisqa funksiyada takrorlaymiz. Zanjir: avval soket manzili (bizga eng yaqin), keyin XFF o'ngdan chapga. Ishonchli bo'lsa — keyingisiga o'tamiz:

js
function mijozIpsi(soket, xff, ishonch) {
  const royxat = xff ? xff.split(",").map((s) => s.trim()) : [];
  const zanjir = [soket, ...royxat.reverse()];
  for (let i = 0; i < zanjir.length - 1; i++) {
    const ishonchli = ishonch === true
      || (typeof ishonch === "number" && i < ishonch)
      || (Array.isArray(ishonch) && ishonch.includes(zanjir[i]));
    if (!ishonchli) return zanjir[i];
  }
  return zanjir.at(-1);
}

const soket = "127.0.0.1";
const soxta = "6.6.6.6, 127.0.0.1"; // mijoz yozdi + proxy qo'shdi
console.log("false:", mijozIpsi(soket, soxta, false));
console.log("true: ", mijozIpsi(soket, soxta, true));
console.log("1:    ", mijozIpsi(soket, soxta, 1));
console.log("IP:   ", mijozIpsi(soket, soxta, ["127.0.0.1"]));

Konsolda:

text
false: 127.0.0.1
true:  6.6.6.6
1:     127.0.0.1
IP:    6.6.6.6

To'rt rejim:

  • false — hech kimga ishonma: soket manzili. Proxy ortida — doim proxy IP'si.
  • true — hammaga ishon: zanjirning eng chap elementi. Hujumchi buni o'zi yozadi — soxtalashtirildi.
  • 1 — bitta proxy'ga ishon: soketdan keyingi bitta hop (zanjirdagi bitta bo'g'in — mijozdan serverga yo'ldagi bitta oraliq dastur). To'g'ri javob.
  • IP ro'yxati — 127.0.0.1 ga ishon. Bizning sinovda mijoz ham 127.0.0.1 dan kelgani uchun u ham "ishonchli proxy" bo'lib qoldi va 6.6.6.6 ga yetdi. Haqiqiy serverda mijoz loopback emas — bu holat sinalmagan.

4.2 Express'dagi haqiqiy natija

Express'ni keyingi darsda boshlaymiz. Hozir bitta narsa yetadi: Express — node:http ustidagi kutubxona. Unda req.ip (mijoz IP'si), req.protocol va req.hostname bor. app.set("trust proxy", qiymat) esa yuqoridagi ishonch parametri (hujjatga ko'ra o'z tekshiruv funksiyangizni ham berish mumkin). Kanon tajribasi — xuddi shu kichik proxy va ortida Express 5.3.0 (asl chiqishdan ip, protocol, hostname maydonlari):

trust proxy proxy orqali proxy + soxta XFF to'g'ridan + soxta XFF
sukut (false) 127.0.0.1, http, 127.0.0.1 127.0.0.1 127.0.0.1
true 127.0.0.1, https, api.example.uz 6.6.6.6 6.6.6.6
1 127.0.0.1, https, api.example.uz 127.0.0.1 6.6.6.6
"loopback" 127.0.0.1, https, api.example.uz 6.6.6.6 6.6.6.6

Bizning funksiya Express bilan bir xil natija berdi. Yana uchta kuzatuv:

  1. Sukut false — xavfsiz, lekin proxy ortida req.protocol = http (aslida https edi). X-Forwarded-Proto ham, -Host ham e'tiborsiz.
  2. 1 bilan oxirgi ustun — proxy'ni chetlab, to'g'ridan Node'ga kelgan mijoz baribir 6.6.6.6 ni o'tkazdi. trust proxy faqat proxy haqiqatan bo'lsa to'g'ri ishlaydi. Shuning uchun Node porti tashqariga yopiq bo'lishi kerak (127.0.0.1).
  3. Proxy XFF'ni almashtirsa ($remote_addr bilan, qo'shmasdan) — kanonda trust proxy = 1 bilan soxta qiymat butunlay yo'qoldi: xff: "127.0.0.1". Proxy sizning chegarangizda birinchi bo'lsa, bu eng ishonchli variant.

api.example.uz — kanon tajribasidagi soxta X-Forwarded-Host qiymati, haqiqiy domen emas. O'z misollaringizda zaxiralangan example.com domenini ishlating.

Diqqat: app.set("trust proxy", true) — internetdagi eng ko'p uchraydigan "tuzatish". U req.ip ni to'g'rilaydi va hamma xursand bo'ladi. Lekin endi har kim o'z IP'sini tanlay oladi: so'rov chegarasini chetlab o'tadi, loglarga boshqa odamning IP'sini yozdiradi. Aniq son (1) yoki proxy IP'si yozing.

5. nginx va Caddy konfiguratsiyasi

Kanon mashinasida nginx va Caddy o'rnatilmagan — quyidagi konfiguratsiyalar rasmiy hujjat bo'yicha, biz sinamadik. Haqiqiy VPS'da ularni deploy qismida ishga tushiramiz.

5.1 nginx

nginx
server {
  listen 443 ssl;
  server_name api.example.com;
  # ssl_certificate ... (Let's Encrypt, certbot)

  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
  }
}

$proxy_add_x_forwarded_for — kelgan XFF + mijoz IP'si (bizning kichik proxy shunday edi). $remote_addr — faqat mijoz IP'si (kelganini tashlab yuboradi). nginx sizning birinchi chegarangiz bo'lsa (oldida Cloudflare yo'q), X-Forwarded-For $remote_addr xavfsizroq. Node'da — trust proxy = 1.

5.2 Caddy

text
api.example.com {
  reverse_proxy 127.0.0.1:3000
}

Uch qator. Caddy sertifikatni Let's Encrypt'dan o'zi oladi va X-Forwarded-* ni o'zi qo'yadi. Hujjatga ko'ra, mijoz yuborgan X-Forwarded-* qiymatlarini sukut bo'yicha ishonchsiz deb almashtiradi (trusted_proxies sozlanmagan bo'lsa). Kichik loyihalar uchun qulay tanlov.

5.3 WebSocket va boshqa uzun ulanishlar

WebSocket (realtime darsida o'rganamiz) oddiy HTTP so'rov sifatida boshlanadi va Upgrade: websocket bilan boshqa protokolga o'tadi. nginx bu sarlavhalarni sukut bo'yicha uzatmaydi. Hujjatdagi qo'shimcha:

nginx
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;

Oxirgi qator — nginx'ning javob kutish vaqti (sukut 60 s). Usiz jim turgan WebSocket bir daqiqada uziladi. Caddy WebSocket'ni qo'shimcha sozlamasiz uzatadi. vazifalar-api da WebSocket yo'q — sinalmagan.

Tekshirib ko'ring: nginx'da X-Forwarded-Proto $scheme yozilmagan, Node'da trust proxy = 1. Foydalanuvchi https:// bilan kirdi. req.protocol nima bo'ladi?

Javob

http. Express X-Forwarded-Proto ni faqat bor bo'lsa o'qiydi. Sarlavha yo'q — soket protokoli olinadi, nginx bilan Node orasida esa HTTP. Natijada Node http://... havolalar yasaydi yoki Secure cookie'ni "xavfsiz emas" deb qo'ymaydi.

6. Hujumchi nigohi

Hujum Qachon ishlaydi Himoya
Soxta X-Forwarded-For trust proxy = true proxy'lar soni (1) yoki IP
Proxy'ni chetlab o'tish Node 0.0.0.0 da, port ochiq HOST=127.0.0.1, firewall
Rate limit'ni aylanib o'tish IP soxtalashtirilsa to'g'ri trust proxy; proxy'da cheklov
Soxta X-Forwarded-Host havola yasashda ishlatilsa domenlar oq ro'yxati (TLS darsi)
Logda boshqa odamning IP'si soxta XFF faqat req.ip (to'g'ri sozlangan) logga

X-Forwarded-Host alohida xavfli: parolni tiklash xatidagi havola req.hostname dan yasalsa va u soxta bo'lsa, xat hujumchining saytiga havola bilan ketadi. Domen nomini konfiguratsiyadan oling, sarlavhadan emas.

7. API qadami: o'zgarish yo'q (tajriba)

Bugun vazifalar-api kodi o'zgarmaydi — u hali Express'da emas. Kanon tajribasi va qarorlari:

  • Proxy + trust proxy tajribasi (yuqoridagi jadval) — Express 5.3.0, Node ichidagi 20 qatorli proxy bilan. nginx yo'q.
  • HOST sukut bo'yicha 127.0.0.1 — holat 05 dan beri shunday (createServer darsi).
  • trust proxy loyihaga keyinroq kiradi: Env validatsiyasi darsida TRUST_PROXY muhit o'zgaruvchisi qo'shiladi (sukut false; qiymatlar: true, son, loopback). Lokal ishlashda proxy yo'q — false to'g'ri.
  • Rate limit (express-rate-limit) kanonga kirmadi — sabablaridan biri aynan shu: to'g'ri trust proxy siz IP noto'g'ri (mashhur middleware'lar darsi).

8. Ko'p uchraydigan xatolar

Belgi Sabab Davosi
Hamma so'rov 127.0.0.1 dan trust proxy o'rnatilmagan app.set("trust proxy", 1)
Rate limit hammani bloklaydi bir IP — proxy xuddi shu
req.ip mijoz tanlagan qiymat trust proxy = true aniq son yoki IP
https sayt http:// havola yasaydi X-Forwarded-Proto yo'q yoki ishonilmagan nginx'da $scheme, trust proxy
WebSocket ulanmaydi yoki 60 s da uziladi Upgrade uzatilmagan, proxy_read_timeout nginx WebSocket sozlamasi
Proxy'siz ham sayt ochiladi Node 0.0.0.0 da HOST=127.0.0.1

9. Mashqlar

Yechimlar kurs/mashqlar/25/08-proxy/ da.

1-mashq (oson): to'ldiring

  • Mijoz protokolini aytadigan sarlavha — X-Forwarded-
  • X-Forwarded-* o'rnidagi standart sarlavha (RFC 7239) —
  • Bitta proxy ortida Express sozlamasi — app.set("trust proxy", )
  • XFF zanjirida haqiqatni proxy qo'shgan tomon — tomon
  • Node tashqaridan ko'rinmasligi uchun tinglash manzili —
Yechim
  • Proto — https yoki http.
  • Forwarded — for=…;proto=…;host=….
  • 1 — bitta ishonchli hop.
  • o'ng — har proxy oxiriga qo'shadi; chap tomonni mijoz yozadi.
  • 127.0.0.1 — faqat shu kompyuterdagi proxy ulanadi.

2-mashq (o'rta): ikki proxy

Sxema: mijoz → Cloudflare → nginx → Node. nginx $proxy_add_x_forwarded_for ishlatadi. Node'ga XFF: 6.6.6.6, 203.0.113.7, 172.70.1.1 keldi, soket — 127.0.0.1. mijozIpsi («Algoritm — toza funksiya» bo'limidan) bilan trust proxy = 1, 2 va true uchun natijani chiqaring. Qaysi biri to'g'ri va nega?

Yechim
js
function mijozIpsi(soket, xff, ishonch) {
  const royxat = xff ? xff.split(",").map((s) => s.trim()) : [];
  const zanjir = [soket, ...royxat.reverse()];
  for (let i = 0; i < zanjir.length - 1; i++) {
    const ishonchli = ishonch === true
      || (typeof ishonch === "number" && i < ishonch)
      || (Array.isArray(ishonch) && ishonch.includes(zanjir[i]));
    if (!ishonchli) return zanjir[i];
  }
  return zanjir.at(-1);
}

const xff = "6.6.6.6, 203.0.113.7, 172.70.1.1";
for (const t of [1, 2, true]) {
  console.log(String(t).padEnd(5), mijozIpsi("127.0.0.1", xff, t));
}

Konsolda:

text
1     172.70.1.1
2     203.0.113.7
true  6.6.6.6

To'g'risi — 2. Ikkita proxy bor: nginx (soket) va Cloudflare (172.70.1.1). 1 bilan Cloudflare'ning IP'si "mijoz" bo'lib qoladi — butun sayt bitta IP'dan kelgandek. true bilan mijoz yozgan 6.6.6.6 olinadi. 203.0.113.7 — Cloudflare ko'rgan haqiqiy mijoz.

3-mashq (qiyin): Forwarded sarlavhasini o'qish

forwardedOqi(sarlavha) funksiyasini yozing. U RFC 7239 sarlavhasini obyektlar massiviga aylantirsin: for=192.0.2.43;proto=https, for="[2001:db8::1]:4711" → [{ for: "192.0.2.43", proto: "https" }, { for: "[2001:db8::1]:4711" }]. Elementlar vergul bilan, juftlar nuqtali vergul bilan ajraladi; kalit — kichik harf; qiymat qo'shtirnoqda bo'lsa, qo'shtirnoq olib tashlanadi. Soddalik uchun qiymat ichida vergul yo'q deb hisoblang. Saytda ham ishlaydi.

Yechim
js
function forwardedOqi(sarlavha) {
  return sarlavha.split(",").map((element) => {
    const obj = {};
    for (const juft of element.split(";")) {
      const [k, ...qolgan] = juft.trim().split("=");
      if (!k || qolgan.length === 0) continue;
      const v = qolgan.join("=").replace(/^"(.*)"$/, "$1");
      obj[k.toLowerCase()] = v;
    }
    return obj;
  });
}

const s = 'for=192.0.2.43;Proto=https, for="[2001:db8::1]:4711"';
console.log(JSON.stringify(forwardedOqi(s)));

Konsolda:

text
[{"for":"192.0.2.43","proto":"https"},{"for":"[2001:db8::1]:4711"}]

IPv6 manzil va port bo'lsa, qiymat qo'shtirnoqda keladi (: belgisi tufayli). ...qolgan va join("=") — qiymat ichida = bo'lsa ham buzilmasin. Bu yerda ham ishonch qoidasi o'sha: elementlar o'ngdan chapga, faqat ishonchli proxy qo'shganlari haqiqat.

10. Real ishda

  • Har prodakshn Node — nginx, Caddy, Traefik yoki bulut LB (AWS ALB, Cloudflare) ortida. trust proxy — deploy ro'yxatidagi majburiy band.
  • Cloudflare — haqiqiy IP'ni CF-Connecting-IP sarlavhasida ham beradi. Unga ham faqat so'rov Cloudflare IP'laridan kelganda ishoniladi.
  • Kubernetes Ingress (nginx-ingress) — X-Forwarded-* ni o'zi qo'yadi; zanjirda bir nechta proxy bo'lishi mumkin — sonni to'g'ri hisoblang.
  • Intervyu: "req.ip nega 127.0.0.1?", "trust proxy: true nega xavfli?", "TLS termination va X-Forwarded-Proto bog'liqligi?".

Xulosa

  • Proxy ortida Node mijozni faqat sarlavhalardan biladi: X-Forwarded-For (zanjir), -Proto, -Host; standart — Forwarded.
  • XFF'ni o'ngdan chapga o'qing; ishonchli proxy'larni tashlang; birinchi ishonchsiz manzil — mijoz.
  • trust proxy = true soxta IP'ni qabul qiladi; to'g'risi — proxy'lar soni yoki IP'lari.
  • Node 127.0.0.1 da tinglasin, aks holda proxy'ni chetlab o'tishadi.
  • TLS, siqish, WebSocket uzatish va sekin mijozlar — proxy'ning ishi; nginx WebSocket uchun Upgrade sarlavhalari kerak.

Keyingi dars: Express'ga kirish va Express 5 — node:http ustidagi yupqa qatlam: routing va middleware, vazifalar-api ni Express'ga ko'chirish.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Reverse proxy orqasida Node.js: nginx, Caddy, X-Forwarded-For va trust proxy — IlmHamroh