প্রক্সি কে ২ ভাগে ভাগ করা যায়, ফরওয়ার্ড প্রক্সি এবং রিভার্স প্রক্সি।
ফরওয়ার্ড প্রক্সি হল, এক বা একাধিক ক্লায়েন্ট যখন ইন্টারনেট সার্ভারে সরাসরি রিকুয়েস্ট না করে একটি প্রক্সি সার্ভারে রিকুয়েস্ট করবে এবং সেই প্রক্সি সার্ভার সরাসরি ইন্টারনেটের মাধ্যমে সার্ভারকে রিকুয়েস্ট করবে। ফরওয়ার্ড প্রক্সি-তে সার্ভার জানবে না কোন ক্লায়েন্ট তাকে রিকুয়েস্টটি দিয়েছে।
ফরওয়ার্ড প্রক্সির ব্যবহার করার সুবিধা হল,
রিভার্স প্রক্সি হল, ক্লায়েন্ট ইন্টারনেটের মাধ্যমে প্রক্সি সার্ভারে রিকুয়েস্ট করবে এবং সেই প্রক্সি সার্ভার বলে দিবে এক বা একাধিক সার্ভারের মধ্যে কোন সার্ভার রিকুয়েস্ট টা নিবে, যার ফলে ক্লায়েন্ট কখোনই জানতে পারবে না কোন সার্ভার তাকে রিকুয়েস্টটি নিয়েছে।
রিভার্স প্রক্সির ব্যবহার করার সুবিধা হল,
আমরা যদি প্রাক্টিকালি বলতে যাই, লোড ব্যালেন্সিং একটি টেকনিক যা আমাদের ক্লায়েন্ট রিকুয়েস্টগুলোকে একাধিক সার্ভারের মধ্য থেকে এক একটি সার্ভারে ডিসট্রিবিউট করতে পারে। উদাহরণ হল, NGINX।
ধরুন আমাদের একটি ওয়েবসাইট আছে, যেখানে ইউজাররা ভালোভাবে ব্যবহার করতে পারছে,
এখন আমাদের ওয়েবসাইটে কোন একসময় প্রচুর ইউজার ব্যবহার করা শুরু করল,
এত সংখ্যক ইউজারের লোড সহ্য করতে না পেরে সার্ভার ক্রাশ করতে পারে। এই প্রবলেম সমাধানের জন্য লোড ব্যালেন্সিং করা হয়।
লোড ব্যালেন্সিং হল ইউজারের রিকুয়েস্টকে ওয়েবসাইটের একাধিক সার্ভারের মধ্যে যেকোন একটিতে ডিসট্রিবিউট করা।
এতেকরে আমরা অত্যাধিক ইউজারের লোড নিয়ন্ত্রণ করতে পারি, এবং আমাদের সাইট ক্রাশ হওয়ার সম্ভাবনা কমে যায়।
Load Balancer সাধারণত ৩টি পদ্ধতিতে মেনে চলে লোড ডিসট্রিবিউট করতে পারে, রাউন্ড রবিন, লোড বেইজড ডিসট্রিবিউশন এবং রিসোর্স বেইজড ডিসট্রিবিউশন।
লোড ব্যালেন্সার ব্যবহারের সুবিধা হল,
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 ELB মূলত ইনকামিং ট্রাফিকগুলোকে এক একটি নির্দিষ্ট টার্গেট এর মধ্যে ডিস্ট্রিবিউট করে। এখানে টার্গেট হতে পারে EC2 Instance।
দুটির মধ্যে তফাৎ NGINX Load Balancer সরাসরি এপ্লিকেশন লেভেল এর মধ্যে ডিস্ট্রিবিউট করে আর AWS ELB ইনস্ট্যান্স লেভেল এর ডিস্ট্রিবিউট করে। আমরা আমাদের সিস্টেমের Availability জন্য দুটোই ব্যবহার করতে পারি।