Nginx Reverse Proxy

7 minutes to read
1 view

Nginx Reverse Proxy

Reverse Proxy ဆိုတာ ဘာလဲ?

Production Server Setup တွေမှာ Nginx ကို Install လုပ်ပြီး Node.js Server ရှေ့မှာထားတာကို မကြာခဏ တွေ့ဖူးမြင်ဖူးကြမှာပါ။ ဒါပေမယ့် Application ကို Internet ဆီ Direct Expose မလုပ်ဘဲ Nginx ကို ကြားခံထားရတဲ့ အကြောင်းအရင်းကို နားလည်ထားတဲ့ Developer ဟာ Production Architecture ကို ပိုကောင်းကောင်း Design လုပ်နိုင်ပါတယ်။


Proxy ဆိုတာ ဘာလဲ?

Reverse Proxy ကို နားလည်ဖို့ အရင်ဆုံး Proxy (Forward Proxy) ဆိုတာ ဘာလဲဆိုတာ သိထားဖို့လိုပါတယ်။ Forward Proxy ဆိုတာ Client နဲ့ Internet ကြားမှာ ကြားခံအနေနဲ့ လုပ်ဆောင်ပေးတဲ့ Server ဖြစ်ပါတယ်။ Client က Website တစ်ခုကို ဝင်ချင်တဲ့အခါ Request ကို Proxy ဆီ အရင်ပို့ပြီး Proxy က Website ဆီကို ဆက်လက်ပို့ပေးပါတယ်။

Corporate Network တွေမှာ Employee တွေရဲ့ Internet Usage ကို စောင့်ကြည့်တာ၊ Website တချို့ကို Block လုပ်တာ၊ ဒါမှမဟုတ် Cache လုပ်ပြီး Bandwidth လျှော့ချတာမျိုးတွေအတွက် Forward Proxy ကို အသုံးများပါတယ်။ ဒီနေရာမှာ Proxy ကို အသုံးပြုတာက Client ကိုယ်စား Request ပို့ပေးတာ ဖြစ်ပါတယ်။


Reverse Proxy ဆိုတာ ဘာလဲ?

Reverse Proxy ကတော့ အဲ့ဒါနဲ့ ဆန့်ကျင်ဘက်ပါ။ Client က Server ကို တိုက်ရိုက်မခေါ်တော့ဘဲ Reverse Proxy ကိုပဲ Request ပို့ပါတယ်။ Reverse Proxy ကမှ နောက်ကွယ်မှာရှိတဲ့ Application Server ဆီ Request ကို Forward လုပ်ပေးပြီး Response ကို Client ဆီ ပြန်ပို့ပေးပါတယ်။

တစ်နည်းအားဖြင့် Reverse Proxy ဟာ Server ကိုယ်စား Request တွေကို Handle လုပ်ပေးတဲ့ Middle-man တစ်ခု ဖြစ်ပါတယ်။ Client အတွက်တော့ Application Server ဘယ်နှစ်လုံးရှိတယ်၊ ဘယ် Port မှာ Run နေတယ်ဆိုတာကို သိစရာမလိုတော့ပါဘူး။ Client က Reverse Proxy တစ်ခုတည်းကိုပဲ ဆက်သွယ်ရပါတယ်။


ဘာကြောင့် Application ကို Direct Expose မလုပ်တာလဲ?

Node.js Application တစ်ခုကို localhost:3000 မှာ Run နေတယ်ဆိုပါစို့။ Production မှာ Port 3000 ကို Internet ဆီ Direct ဖွင့်ပေးလို့ရပေမယ့် ဒါဟာ အကောင်းဆုံး Architecture မဟုတ်ပါဘူး။

Nginx ကို ရှေ့မှာထားလိုက်ရင် Client Request အားလုံးကို Nginx က အရင်လက်ခံပြီး Node.js Application ဆီ Forward လုပ်ပေးပါတယ်။ ဒါကြောင့် Application Server ဟာ Public Internet နဲ့ တိုက်ရိုက်မထိတွေ့တော့ဘဲ Security၊ Performance နဲ့ Scalability ပိုကောင်းလာပါတယ်။


Nginx ဘာကြောင့် အသုံးများတာလဲ?

Nginx ဟာ Lightweight ဖြစ်ပြီး Concurrent Connection သောင်းနဲ့ချီကို Memory အသုံးပြုမှုနည်းနည်းနဲ့ Handle လုပ်နိုင်ပါတယ်။ Static File Serving၊ Reverse Proxy၊ Load Balancing နဲ့ SSL Termination လို Feature တွေကို Built-in Support လုပ်ပေးတာကြောင့် Production Environment အများစုမှာ အသုံးများပါတယ်။

Node.js က Business Logic ကို အာရုံစိုက်နိုင်ပြီး HTTP Connection Management၊ Static File Serving နဲ့ SSL Handling လို Infrastructure အပိုင်းတွေကို Nginx က တာဝန်ယူပေးပါတယ်။


Node.js Example

Express Application တစ်ခုကို Port 3000 မှာ Run နေတယ်ဆိုပါစို့။

import express from "express";

const app = express();

app.get("/", (req, res) => {
  res.send("Hello from Node.js");
});

app.listen(3000);

Nginx Configuration မှာတော့ Client Request တွေကို Node.js ဆီ Proxy လုပ်ပေးနိုင်ပါတယ်။

server {
    listen 80;

    server_name example.com;

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

Client က example.com ကို Request လုပ်တဲ့အခါ Request ဟာ Nginx ဆီ အရင်ရောက်ပြီးမှ Node.js Server ဆီ Forward လုပ်သွားပါတယ်။ Client ဘက်ကတော့ Application ဟာ Port 3000 မှာ Run နေတာကို သိစရာမလိုတော့ပါဘူး။


SSL Termination

HTTPS အသုံးပြုဖို့ SSL Certificate လိုအပ်ပါတယ်။ SSL ကို Node.js Application တိုင်းမှာ Configure လုပ်လို့ရပေမယ့် Production မှာတော့ SSL ကို Nginx က Handle လုပ်ပေးတာ ပိုအသုံးများပါတယ်။

Client နဲ့ Nginx ကြားမှာ HTTPS Encryption ကို အသုံးပြုပြီး Nginx က Request ကို Decrypt လုပ်ကာ Internal Network ထဲက Node.js Application ဆီ Forward လုပ်ပေးပါတယ်။ ဒီလိုလုပ်တာကို SSL Termination လို့ခေါ်ပါတယ်။

ဒါကြောင့် SSL Certificate Management၊ Renewal နဲ့ HTTPS Configuration တွေကို Nginx တစ်နေရာတည်းမှာပဲ ထိန်းသိမ်းနိုင်ပြီး Backend Application တွေကို ပိုရိုးရှင်းစေပါတယ်။


Load Balancing

Traffic များလာတဲ့အခါ Node.js Server တစ်လုံးတည်းနဲ့ မလုံလောက်တော့ပါဘူး။ Application Server အများကြီး Run ထားပြီး Load ကို မျှဝေပေးဖို့ လိုလာပါတယ်။

Nginx ဟာ Client Request တွေကို Backend Server အများကြီးဆီ အလှည့်ကျ ပို့ပေးနိုင်ပါတယ်။

upstream app_servers {
    server localhost:3000;
    server localhost:3001;
    server localhost:3002;
}

server {
    listen 80;

    location / {
        proxy_pass http://app_servers;
    }
}

ဒီ Configuration မှာ Client က Request တစ်ခုပဲ ပို့ပေမယ့် Nginx က Backend Server သုံးလုံးကြားမှာ Request တွေကို ခွဲဝေပေးပါတယ်။ Server တစ်လုံးတည်းမှာ Load မပုံတော့တဲ့အတွက် System ဟာ ပိုမို Scale လုပ်လို့ရလာပါတယ်။


Static File Serving

React၊ Next.js ဒါမှမဟုတ် HTML Website တွေမှာ Image၊ CSS နဲ့ JavaScript File တွေလို Static File တွေကို မကြာခဏ Request လုပ်ရပါတယ်။

ဒီလို File တွေကို Node.js က Serve လုပ်ခိုင်းမယ့်အစား Nginx က တိုက်ရိုက် Serve လုပ်ပေးနိုင်ပါတယ်။ Nginx ဟာ Static File Serving အတွက် Optimize လုပ်ထားတာဖြစ်လို့ Memory အသုံးပြုမှုနည်းပြီး Response Time လည်း ပိုမြန်ပါတယ်။

ဒါကြောင့် Node.js Application က API နဲ့ Business Logic ကိုပဲ Handle လုပ်ရတော့ပြီး Server Resource ကို ပိုမိုထိရောက်စွာ အသုံးပြုနိုင်ပါတယ်။


Reverse Proxy ရဲ့ အကျိုးကျေးဇူးများ

  • Application Server ကို Internet ဆီ Direct Expose မလုပ်ရတော့ဘူး။
  • HTTPS (SSL) ကို Nginx က Centralized Handle လုပ်ပေးနိုင်တယ်။
  • Static File တွေကို မြန်မြန် Serve လုပ်နိုင်တယ်။
  • Backend Server အများကြီးကို Load Balance လုပ်နိုင်တယ်။
  • Backend Server ရဲ့ Port နဲ့ Internal Architecture ကို Client မသိစေဘူး။
  • Performance၊ Security နဲ့ Scalability ကို ပိုမိုကောင်းမွန်စေတယ်။

အကျဉ်းချုပ်အားဖြင့် Reverse Proxy ဆိုတာ Client နဲ့ Application Server ကြားမှာ ကြားခံအဖြစ် လုပ်ဆောင်ပေးတဲ့ Server ဖြစ်ပါတယ်။ Production Environment တွေမှာ Nginx ကို Reverse Proxy အဖြစ် အသုံးပြုခြင်းဟာ Application ကို ပိုမိုလုံခြုံစေပြီး၊ HTTPS၊ Static File Serving နဲ့ Load Balancing လို Infrastructure အလုပ်တွေကို Handle ပေးတာကြောင့် Node.js Application က Business Logic ကိုပဲ အာရုံစိုက်နိုင်သလို System တစ်ခုလုံးရဲ့ Performance နဲ့ Scalability ကိုလည်း သိသိသာသာ တိုးတက်စေပါတယ်။

Related Posts