system-design-bangla

Forward Proxy এবং Reverse Proxy

প্রক্সি কে ২ ভাগে ভাগ করা যায়, ফরওয়ার্ড প্রক্সি এবং রিভার্স প্রক্সি।

ফরওয়ার্ড প্রক্সি হল, এক বা একাধিক ক্লায়েন্ট যখন ইন্টারনেট সার্ভারে সরাসরি রিকুয়েস্ট না করে একটি প্রক্সি সার্ভারে রিকুয়েস্ট করবে এবং সেই প্রক্সি সার্ভার সরাসরি ইন্টারনেটের মাধ্যমে সার্ভারকে রিকুয়েস্ট করবে। ফরওয়ার্ড প্রক্সি-তে সার্ভার জানবে না কোন ক্লায়েন্ট তাকে রিকুয়েস্টটি দিয়েছে।

Forward Proxy

ফরওয়ার্ড প্রক্সির ব্যবহার করার সুবিধা হল,

রিভার্স প্রক্সি হল, ক্লায়েন্ট ইন্টারনেটের মাধ্যমে প্রক্সি সার্ভারে রিকুয়েস্ট করবে এবং সেই প্রক্সি সার্ভার বলে দিবে এক বা একাধিক সার্ভারের মধ্যে কোন সার্ভার রিকুয়েস্ট টা নিবে, যার ফলে ক্লায়েন্ট কখোনই জানতে পারবে না কোন সার্ভার তাকে রিকুয়েস্টটি নিয়েছে।

Reverse Proxy

রিভার্স প্রক্সির ব্যবহার করার সুবিধা হল,

Load Balancing

আমরা যদি প্রাক্টিকালি বলতে যাই, লোড ব্যালেন্সিং একটি টেকনিক যা আমাদের ক্লায়েন্ট রিকুয়েস্টগুলোকে একাধিক সার্ভারের মধ্য থেকে এক একটি সার্ভারে ডিসট্রিবিউট করতে পারে। উদাহরণ হল, NGINX।

কেন Load Balancing

ধরুন আমাদের একটি ওয়েবসাইট আছে, যেখানে ইউজাররা ভালোভাবে ব্যবহার করতে পারছে,

Load Balancing

এখন আমাদের ওয়েবসাইটে কোন একসময় প্রচুর ইউজার ব্যবহার করা শুরু করল,

Load Balancing

এত সংখ্যক ইউজারের লোড সহ্য করতে না পেরে সার্ভার ক্রাশ করতে পারে। এই প্রবলেম সমাধানের জন্য লোড ব্যালেন্সিং করা হয়।

লোড ব্যালেন্সিং হল ইউজারের রিকুয়েস্টকে ওয়েবসাইটের একাধিক সার্ভারের মধ্যে যেকোন একটিতে ডিসট্রিবিউট করা।

Load Balancing

এতেকরে আমরা অত্যাধিক ইউজারের লোড নিয়ন্ত্রণ করতে পারি, এবং আমাদের সাইট ক্রাশ হওয়ার সম্ভাবনা কমে যায়।

Load Balancer সাধারণত ৩টি পদ্ধতিতে মেনে চলে লোড ডিসট্রিবিউট করতে পারে, রাউন্ড রবিন, লোড বেইজড ডিসট্রিবিউশন এবং রিসোর্স বেইজড ডিসট্রিবিউশন।

Load Balancer এর সুবিধাগুলো

লোড ব্যালেন্সার ব্যবহারের সুবিধা হল,

রিভার্স প্রক্সি হিসেবে NGINX

NGINX একটি জনপ্রিয় রিভার্স প্রক্সি। এর মত আরো কিছু রিভার্স প্রক্সি রয়েছে। সাধারণত NGINX রিকোয়েস্টকে একাধিক সার্ভার এর মধ্য থেকে একটি সার্ভারে ফরওয়ার্ড করে দেয়, প্রসেসিং এর জন্য।

NGINX এর কনফিগারেশন ফাইল সাধারণত এরকম থাকে।

worker_processes 1;  # Number of worker processes
events {
  worker_connections 1024;  # Maximum number of simultaneous connections per worker
}

http {
  include       mime.types;  # Include MIME types
  default_type  application/octet-stream;  # Default MIME type

  sendfile          on;  # Enable efficient file transfers
  keepalive_timeout 65;  # Timeout for persistent connections

  server {
    listen 80;  # Listen on port 80 (HTTP)
    server_name example.com www.example.com;  # Your domain names

    location / {
      root /var/www/html;  # Root directory for your files
      index index.html;  # Default file to serve
    }

    error_page 404 /404.html;  # Custom error page
  }
}

এখানে / সংযুক্ত রিকোয়েস্টগুলোকে /var/www/html ডিরেক্টরির index.html ফাইল দেখাবে।

এখন আপনি যদি Node.js NGINX দ্বারা পয়েন্ট করে দিতে চান,

server {
  listen 80 default_server;
  listen [::]:80 default_server;
  server_name  localhost;

  # Load configuration files for the default server block.
  include /etc/nginx/default.d/*.conf;

  location /api/ {
    proxy_pass http://localhost:4000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}

উপরের server ব্লক এর মধ্যে দেখা যাচ্ছে, রিকোয়েস্ট এর মধ্যে /api থাকলে তা আমাদের node.js ইনস্ট্যান্স কে হিট করবে, যার পোর্ট হচ্ছে 4000।

আমরা চাইলে NGINX এর Load Balancing এর সুবিধা নিতে পারবো, যদি আমরা Performance, Reliability এবং Scalability চিন্তা করি।

NGINX Load Balancer ব্যবহারের সর্বোত্তম সময় আমাদের consider করতে হবে,

এসব ক্ষেত্রে লোড ব্যালেন্সিং করবো।

উপরের NGINX কোড কে লোড ব্যালেন্সিং করলে,

http {
  upstream backend_servers {
    # Define the backend servers
    server 127.0.0.1:4000;  # Primary backend server
    server 127.0.0.1:4001;  # Secondary backend server
    server 127.0.0.1:4002;  # Tertiary backend server
  }

  server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name localhost;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location /api/ {
      proxy_pass http://backend_servers;  # Pass requests to the load balancer
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection 'upgrade';
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;

      # Additional settings for proxying
      proxy_connect_timeout 60s;
      proxy_read_timeout 60s;
      proxy_send_timeout 60s;
    }
  }
}

NGINX Load Balancer এবং AWS Elastic Load Balancer

NGINX Load Balancer মূলত একাধিক ইনকামিং রিকোয়েস্টগুলোকে একাধিক সার্ভারের মধ্য থেকে এক একটি সার্ভারে ডিস্ট্রিবিউট করে দেয়।

Load Balancing

AWS ELB মূলত ইনকামিং ট্রাফিকগুলোকে এক একটি নির্দিষ্ট টার্গেট এর মধ্যে ডিস্ট্রিবিউট করে। এখানে টার্গেট হতে পারে EC2 Instance।

Load Balancing

দুটির মধ্যে তফাৎ NGINX Load Balancer সরাসরি এপ্লিকেশন লেভেল এর মধ্যে ডিস্ট্রিবিউট করে আর AWS ELB ইনস্ট্যান্স লেভেল এর ডিস্ট্রিবিউট করে। আমরা আমাদের সিস্টেমের Availability জন্য দুটোই ব্যবহার করতে পারি।