এই লেখায় আমরা দেখাব কিভাবে HAProxy কে লোড ব্যালেন্সার হিসেবে কনফিগার করবেন দুটি Nginx ওয়েব সার্ভারের জন্য (আপনি চাইলে Apache দিয়ে প্রতিস্থাপন করতে পারেন)। সব ক্ষেত্রে হোস্ট অপারেটিং সিস্টেম হিসেবে CentOS ব্যবহার করা হয়েছে।
HAProxy হল একটি সার্ভার সফটওয়্যার যা TCP এবং HTTP অ্যাপ্লিকেশনগুলির জন্য হাই এভেলেবিলিটি এবং লোড ব্যালেন্সিং প্রদান করে, ইনকামিং রিকোয়েস্টগুলো একাধিক ব্যাকএন্ড সার্ভারের মধ্যে বিতরণ করে। HAProxy অনেক জনপ্রিয় রিসোর্সে ব্যবহার করা হয় যেমন Twitter, Instagram, GitHub, Amazon ইত্যাদি।
HAProxy একটি আলাদা সার্ভারে ইনস্টল করা হয় যা ক্লায়েন্টের রিকোয়েস্ট গ্রহণ করে এবং সেগুলো Nginx ওয়েব সার্ভারগুলোর দিকে রিডাইরেক্ট করে। সাধারণ সিস্টেম আর্কিটেকচারটি নিচে দেখানো হয়েছে:

ব্যাকএন্ড সার্ভারগুলোর Nginx কনফিগারেশন
আমরা লোড ব্যালেন্স করা ওয়েব সার্ভারগুলোর Nginx ইনস্টলেশন এবং কনফিগারেশন দিয়ে শুরু করব। EPEL রিপোজিটরি ইনস্টল করে yum (বা RHEL/CentOS 8-এ dnf) ব্যবহার করে nginx ইনস্টল করুন:
# yum install epel-release -y
# yum install nginx -y
তারপর, nginx.conf ফাইলে নির্দিষ্ট করুন যে সার্ভারগুলোর শুধু HAProxy সার্ভার এবং ব্যাকএন্ড সার্ভারগুলোর রিকোয়েস্ট প্রসেস করতে হবে:
ব্যাকএন্ড সার্ভার ১:
server { listen current_server_IP_address:80 default_server; allow second_backend_server_IP_address; allow IP_haproxy; deny all; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { }
ব্যাকএন্ড সার্ভার ২:
server { listen current_server_IP_address:80 default_server; allow first_backend_server_IP_address; allow IP_haproxy; deny all; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { }
Nginx কনফিগারেশন ফাইলটি ডিফল্ট, আমরা শুধু listen IP এ সার্ভারগুলো যোগ করেছি এবং allow এবং deny ডিরেক্টিভ ব্যবহার করে আমাদের সার্ভারগুলো ছাড়া সবার অ্যাক্সেস ব্লক করেছি।
ওয়েব সার্ভার শুরু করার জন্য, firewalld বা iptables ব্যবহার করে ফায়ারওয়াল HTTP পোর্ট খুলুন:
# firewall-cmd --permanent –add-service=http
# firewall-cmd –reload
আপনার যেকোনো ব্যাকএন্ড সার্ভারে একটি টেস্ট চেক করুন:
# curl IP_of_the_second_server
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "https://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> here you will get an html file
সার্ভারটি একটি স্ট্যান্ডার্ড nginx ইন্ডেক্স ফাইল রিটার্ন করেছে। চেক করা আরও সুবিধাজনক করার জন্য, আমি প্রতিটি ব্যাকএন্ড সার্ভারের ইন্ডেক্স ফাইলের কন্টেন্ট পরিবর্তন করেছি যাতে ব্রাউজারে দেখতে পাই কোন সার্ভার বর্তমান রিকোয়েস্টটি প্রসেস করেছে।
Nginx ইন্ডেক্স ফাইলটি অবস্থিত /usr/share/nginx/html/-এ।
HAProxy লোড ব্যালেন্সার কনফিগারেশন
যে সার্ভারটি লোড ব্যালেন্সার হিসেবে ব্যবহার করা হবে সেটিতে HAProxy ইনস্টল এবং কনফিগার করা যাক।
HAProxy ইনস্টল করুন:
# yum install epel-release -y
# yum install haproxy -y
Running transaction Installing : haproxy-1.5.18-9.el7.x86_64 1/1 Verifying : haproxy-1.5.18-9.el7.x86_64 1/1 Installed: haproxy.x86_64 0:1.5.18-9.el7 Complete!
HAProxy সক্ষম করতে, /etc/default/haproxy ফাইলে Enabled=1 যোগ করতে হবে:
# nano /etc/default/haproxy
এখন HAProxy কনফিগারেশনে যাই। আমাদের সবচেয়ে সহজ কনফিগারেশনে, লোড ব্যালেন্সার সার্ভার সকল HTTP রিকোয়েস্ট প্রসেস করবে এবং সেগুলো ক্রমশই ব্যাকএন্ড সার্ভারগুলোর পাঠাবে:
# nano /etc/haproxy/haproxy.cfg
log /dev/log local0 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon defaults mode http log global option httplog option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 frontend www bind balancer_IP_address:80 default_backend nginx_pool backend nginx_pool balance roundrobin mode http server web1 IP_of_the_first_backend_server:80 check server web2 IP_of_the_second_backend_server:80 check
কনফিগারেশন সংরক্ষণ করার পর, haproxy.cfg সিনট্যাক্স চেক করুন:
# haproxy -f /etc/haproxy/haproxy.cfg -c
যদি সব ঠিক থাকে, আপনি এই ম্যাসেজ পাবেন:
Configuration file is valid
তারপর HAProxy রিস্টার্ট করুন এবং লিনাক্স স্টার্টআপে যোগ করুন। এবং ফায়ারওয়ালে HTTP পোর্ট খুলুন।
# systemctl restart haproxy
# systemctl enable haproxy
# firewall-cmd —permanent –add-service=http
# firewall-cmd –reload
এভাবে, লোড ব্যালেন্সার কনফিগার করা হয়েছে। ব্রাউজারে HAProxy সার্ভারের IP ঠিকানা খুলে চেক করুন:

আপনি দেখতে পাচ্ছেন, উভয় সার্ভার ক্রমশই কন্টেন্ট রিটার্ন করেছে, সুতরাং ব্যালেন্সারটি কাজ করছে।
Haproxy.cfg কনফিগারেশন ফাইল প্যারামিটার
HAProxy অ্যালগরিদমের প্রধান উদাহরণগুলো বিবেচনা করা যাক:
roundrobin— এটি ডিফল্ট অ্যালগরিদম, রিকোয়েস্টগুলো ক্রমশ সার্ভারগুলোর পাঠায়। আমাদের উদাহরণে এই পদ্ধতি ব্যবহার করা হয়েছে।leastconn— সক্রিয় সংযোগের সংখ্যা সবচেয়ে কম যে সার্ভারে, সেটি বেছে নেয়। দীর্ঘ সময় সেশন ব্যবহার করা প্রজেক্টের জন্য এটি প্রস্তাবিত।source— ইউজার IP ঠিকানার হ্যাশের ভিত্তিতে সার্ভার বেছে নেয়। এই মোডে, ইউজার IP অপরিবর্তিত থাকলে ক্লায়েন্ট একই ওয়েব সার্ভারের সাথে সংযুক্ত হবে।
কনফিগারেশন ফাইলের কিছু প্যারামিটার বর্ণনা করা যাক।
global ব্লক:
log— /dev/log-এ লগ লেখে, local0 অবজেক্ট ভ্যালু হিসেবে সংরক্ষণ করেchroot— সিকিউরিটি সেটিং, HAProxy কে নির্দিষ্ট ডিরেক্টরিতে লক করেmaxconn— প্রতিটি প্রসেসের জন্য সর্বোচ্চ সমকালীন সংযোগdaemon— প্রসেসকে ডেমন হিসেবে চালায়
defaults ব্লক। এই ব্লকটি其後বর্তী সব সেকশনের জন্য ডিফল্ট প্যারামিটার সেট করে:
log— কোন লগে এন্ট্রি লেখা হবে তা সেট করে (এখানে global মানে global সেকশনে সেট করা প্যারামিটার ব্যবহার করা হবে)mode— কমিউনিকেশন প্রোটোকল সেট করে যার মান হতে পারে: tcp, http বা healthretries— ব্যর্থতার ক্ষেত্রে সার্ভারের সাথে সংযোগের রিট্রাই সংখ্যাoption httplog— HAProxy HTTP রিকোয়েস্ট প্রক্সি করলে যে লগ ফরম্যাট ব্যবহার করা হবেoption redispatch— সার্ভার ব্যর্থতার ক্ষেত্রে সেশন টার্মিনেট এবং রিডিসপ্যাচ করার অনুমতি দেয়contimeout— সার্ভারের সাথে সংযোগ সফলভাবে thiết립 হওয়া পর্যন্ত সর্বোच्च অপেক্ষা সময়
বিভিন্ন টাইমআউট সংক্রান্ত আরও অনেক প্যারামিটার রয়েছে।
HAProxy স্ট্যাটস সংগ্রহ
কনফিগারেশন ফাইলে stats ব্লক যোগ করুন:
listen stats bind :10001 stats enable stats uri /haproxy_stats stats auth admin:admin
বিবরণ:
bind– যে পোর্টে পরিসংখ্যান দেখতে পারবেনstats enable– পরিসংখ্যান রিপোর্ট সক্ষম করেstats uri– পরিসংখ্যান পেজের ঠিকানা সেট করেstats auth– অ্যাক্সেসের জন্য লগইন এবং পাসওয়ার্ড
আপনি যে কোনো TCP পোর্ট নির্দিষ্ট করতে পারেন। যদি উপরের নির্দিষ্ট পোর্ট ব্যস্ত থাকে বা উপযুক্ত না হয়।
ফায়ারওয়ালে নির্দিষ্ট পোর্টে ইনকামিং সংযোগ অনুমতি দিন:
firewall-cmd --permanent –add-port=10001/tcp
firewall-cmd –reload
HAProxy রিপোর্ট देखने জন্য এই লিংক ফলো করুন:
https://hostname_haproxy:10001/haproxy_stats
ব্রাউজারে ব্যালেন্সার IP ঠিকানা খুলুন এবং F5 বারবার চাপুন। HAproxy পরিসংখ্যান পরিবর্তন হবে।
এই লেখায় আমরা মৌলিক HAProxy কনফিগারেশন নিয়ে আলোচনা করেছি। HAProxy মডিউল ব্যবহারের আরও অনেক ক্ষেত্র রয়েছে।
আমাদের স্কিমায়, লোড ব্যালেন্সিং HAProxy সার্ভারটি একটি একক পয়েন্ট অফ ফেইলচার হয়ে যায়। আপনার ওয়েব সার্ভিসের ফল্ট টলারেন্স বাড়াতে, আপনি অন্য একটি HAProxy সার্ভার যোগ করে Keepalived ব্যবহার করে হাই-এভেলেবিলিটি লোড ব্যালেন্সার কনফিগারেশন বাস্তবায়ন করতে পারেন। আপনি নিচের স্কিমার মতো একটি আর্কিটেকচার পাবেন:
