سریع، هوشمند و پراستفاده! اینها خصوصیات HAproxy هستند. نرمافزاری که قرار است در این مقاله راجع به آن صحبت کنیم. میخواهیم ببینیم HAproxy چیست.
HAproxy از آن دسته نرمافزارهایی است که شاید نامش کمتر شنیده باشد، اما نقش بسیار مهمی در دنیای اینترنت ایفا میکند. بدون اغراق! مثلاً سایتهای پرترافیکی مثل گیتهاب، توییتر و اینستاگرام، بدون این نرمافزار – یا حداقل نرمافزاری مشابه – شاید حتی وجود هم نداشتند!!
در ادامه راجع به قابلیتهای این نرمافزار، الگوریتمها و چگونگی نصب آن صحبت خواهیم کرد. ابتدا بیایید کمی بیشتر با این نرمافزار آشنا شویم.
HAproxy چیست؟
HAproxy مخفف High Availability Proxy است. این نرمافزار نقش Load Balancing و Reverse Proxy در پروتکلهای HTTP و TCP را برای سایتها و اپلیکیشنها ایفا میکند. در ضمن زبانی که برنامه با آن ساخته شده، C است!
⚠ اجازه دهید کاربرد HAproxy را با مثال برایتان توضیح دهیم:
فرض کنید قصد تمدید معاینه فنی ماشینتان را دارید و به یکی از مراکز مشخصشده برای این امر میروید. صفی بیانتها میبینید و متاسفانه ساعتهای زیادی را در انتظار از دست خواهید داد. اوضاع زمانی بدتر میشود که فقط یک خط برای بررسی خودروها وجود داشته باشد و قرار باشد همه آن صف وارد همان خط شوند!
اما اگر مرکزی که به آن مراجعه کرده باشید، بزرگ و دارای چندین خط معاینه باشد، مسلماً کار سریعتر پیش میرود. در چنین حالتی، فردی در نزدیکی مرکز میایستد و ماشینها را به خطهای خلوتتر هدایت میکند. اگر صف خطی طولانی شد، بقیه ماشینها به خطوط دیگر فرستاده میشوند. این روند بهمنظور تقسیم بار و تسریع امور دائماً ادامه خواهد داشت.
HAproxy، همین کار را برای سرورهای سایتها و اپلیکیشنها انجام میدهد؛ به این صورت که ترافیک ورودی، به جای اینکه مستقیماً به سرور متصل شود، به HAproxy میرسد و سپس توسط این نرمافزار، به سمت سروری که خلوتتر است فرستاده میشود.
با این تقسیم ترافیک، عملکرد سایتها و اپلیکیشنها بهبود پیدا میکند و کاربران تجربه بهتری خواهند داشت.
البته که HAproxy قابلیتهای زیادی دارد.
HAproxy چه قابلیتهایی دارد؟
در کنار سرعت، پراستفاده بودن و هوشمندی، مهمترین خصوصیت HAproxy متنباز بودن آن است. در ضمن این نرمافزار در بسیاری از توزیعهای مختلف لینوکس هم وجود دارد.
البته نسخه شرکتی این نرمافزار هم وجود دارد که سرویس حرفهایتری را در کنار پشتیبانی کامل ارائه میکند.
خب برویم سراغ قابلیتها:
Transparent Proxy
پراکسی شفاف که به آن Inline Proxy, Intercepting Proxy و Forced Proxy هم میگویند، امکان اتصال مستقیم کاربر به سرور را فراهم میکند. بگذارید اینطور بگوییم: پراکسی هست، اما انگار نیست!! از آن جملههای قصار.
Content Inspections
این قابلیت، بلاک کردن پروتکلهای ناخواسته را برای کاربران ممکن میکند.
CLI For Server Management
اگر قصد ایجاد تغییرات در محیط سرور را دارید، CLI کمکتان خواهد کرد. تغییراتی مثل خاموش و روشن کردن سرور، بهوسیله این قابلیت انجام میشوند.
** منظور از خاموش و روشن کردن سرور، همان فعال و غیرفعال کردن سرور داخل haproxy است.
پشتیبانی از پروتکلهای مختلف
HAproxy با پروتکلهای گوناگونی مثل HTTP, HTTP/2, gPRC و FastCGI سازگار است.
HTTP Authenticator
فرایند احراز هویت در پروتکل HTTP بسیار ساده و ابتدایی است. HAproxy اینکار را انجام میدهد. به این صورت که سرور از کاربر Username و Password میخواهد تا اجازه ورود او را صادر کند.
Multithreading
مولتیتردینگ، مدلی از اجرای برنامه است که امکان ساخت چندین Thread در یک پروسه را فراهم میکند. با کمک HAproxy، میتوان از این مدل استفاده کرد.
در این مدل، Threadها بهصورت مستقل ولی همزمان، از منابع پروسه استفاده میکنند.
Load Balancing لایه 4 و لایه 7
مهمترین قابلیت HAproxy، همین Load Balancing است. همین قابلیت است که ترافیک ورودی را بین سرورهای مختلف تقسیم میکند و در نهایت، عملکرد سایت یا اپلیکیشن را بهبود میبخشد.
همچنین HAproxy بهخوبی مقیاسپذیر است؛ یعنی حتی میتوان آن را برای اتصال به هزاران سرور Back-end هم آماده کرد.
اما بیایید کمی بیشتر راجع به Load Balancing صحبت کنیم.
Load Balancing چیست و چند نوع از آن وجود دارد؟
مثال معاینه فنی را خاطرتان هست؟ در آن مثال، فرستادن ماشینها به خطوط مختلف، دقیقاً همین فرایند لود بلنسینگ است. برای اینکه یک خط خیلی شلوغ نباشد و خط دیگر خالی، بار ورودی بین آنها تقسیم میشود.
همانطور که گفتیم، HAProxy ابتدا یک نرمافزار مخصوص Load Balancing است و در مراحل بعدی قابلیتهای دیگری هم دارد (همانهایی که درموردشان صحب کردیم)؛ یعنی این HAproxy است که وظیفه دارد تا فرایند Load Balancing را برای تقسیم ترافیک ورودی به سایت یا اپلیکیشن انجام دهد.
در مجموع 2 نوع لود بلنسینگ داریم: لایه 4 و لایه 7. در ادامه راجع به این دو نوع صحبت خواهیم کرد و البته حالتی که استفادهای از لود بلنسینگ نمیشود.
بدون لود بلنسینگ
در این حالت، کاربر بدون هیچ واسطهای و بهصورت مستقیم به وبسرور متصل میشود. تصویر زیر را ببینید:
از آنجایی که لود بلنسری در کار نیست، اگر وب سرور از دسترس خارج شود، به دنبال آن، سایت هم از دسترس خارج میشود. یا اگر بار ترافیکی زیادی روی یک وب سرور باشد، تجربه کاربری ناخوشایندی برای بازدیدکنندگان رقم میزند. حتی ممکن است مانع اتصال آنها شود!
لود بلنسینگ لایه 4
سادهترین راه تقسیم ترافیک بین چند سرور، استفاده از لود بلنسر لایه 4 است. تصویر زیر این نوع را نشان میدهد:
در این حالت، درخواست کاربر به لود بلنسر میرسد و نرمافزار (مثلاً HAproxy) درخواست را برای گروهی از سرورهای Backend میفرستد. هر سروری که آزادتر باشد، پاسخ درخواست را مستقیماً برای کاربر ارسال میکند . (پاسخ همان صفحهای است که کاربر قصد بازدید از آن را دارد.) اگر به تصویر بالا دقت کنید، متوجه خواهید شد که هر دو وب سرور به یک دیتابیس متصل هستند. به همین خاطر، محتوای یکسانی از جانب هر دو به دست مخاطب خواهد رسید.
لود بلنسینگ لایه 7
این نوع از Load Balancing، طرز کار پیچیدهتری نسبت به لایه 4 دارد. ماهیت کلی این نوع را در تصویر زیر میبینید:
مثلاً درخواستهایی که برای بازدید وبلاگ هستند، به blog backend میروند و دیگر درخواستها به web backend! در ضمن هردو مجموعه سرورها، در نهایت به یک دیتابیس مشترک متصل هستند.
خب از Load Balancing هم گفتیم و حالا میخواهیم در مورد امنیت HAproxy بگوویم.
آیا HAproxy امنیت بالایی دارد؟
از آنجایی که این نرمافزار متنباز است، امنیتش هم توسط کاربران تامین میشود! اما فکر نکنید که HAproxy ناامن است. اتفاقاً طی سالهای اخیر، موارد بسیار نادری از آسیبپذیری در این نرمافزار مشاهده شده است.
همچنین HAproxy این قابلیت را دارد که هنگام شناسایی نقص امنیتی، سطح حمله رخ داده را بهشدت محدود و کنترل میکند.
ویژگی دیگر این نرمافزار در موضوع امنیت، رصد کردن رفتار کاربران برای شناسایی موارد مشکوک است. اگر حرکت نامتعارفی از جانب کاربری سر بزند، اقدامات لازم بهسرعت انجام میشوند و کاربر از دسترسی به سایت یا اپلیکیشن محروم میشود.
حتی HAproxy امکان Rate Limiting و استفاده از Black List و White List را هم برای کاربرانش فراهم میکند.
اما یک سوال: Load Balancer چگونه تصمیم میگیرد که درخواست را برای کدام سرور بفرستند؟ این انتخاب بر اساس الگوریتمهای این نرمافزار انتخاب میشود.
HAproxy بر اساس چه الگوریتمهایی عمل میکند؟
HAproxy برای انجام لود بلنسینگ، از الگوریتمهای مختلف استفاده میکند. حتی پارامتری وجود دارد که میزان تناوب استفاده از هر سرور را هم مشخص میکند. الگوریتمهای زیادی در این نرمافزار وجود دارند، اما ما در این مقاله فقط 3 الگوریتم را بررسی خواهیم کرد.
roundrobin
الگوریم پیشفرض HAproxy همین roundrobin است. الگوریتمی ساده که در انتخاب سرورها نوبت را در نظر میگیرد!
leastconn
در این الگوریتم، سروری انتخاب میشود که کمترین اتصال را دارد. به بیان دیگر، آن سروری که سرش از باقی همکارانش خلوتتر است، پذیرای درخواست کاربران است. اپلیکیشنها و سایتهایی که در آنها اتصال کاربران طولانیتر است، بیشتر از این الگوریتم استفاده میکنند.
Source
در الگوریتم Source، سرور بر اساس هش IP درخواستکننده انتخاب میشود. به این ترتیب، تضمین میشود که یک کاربر، همیشه به یک سرور مشخص متصل میشود.
تقریباً در مورد همه جوانب HAproxy صحبت کردیم؛ اما این نرمافزار دو ویژگی دیگر هم در زمینه Load Balancing دارد.
منظور از Sticky Sessions و Health Check چیست؟
همانطور که تا اینجا متوجه شدید، HAproxy نرمافزاری بینظیر برای سایتها و اپلیکیشنهای بزرگ و کوچک است. خب حالا میخواهیم از دو ویژگی جذاب دیگر این نرمافزار در رابطه با موضوع Load Balancing بگوییم.
Sticky Sessions
سازوکار برخی از سایتها و اپلیکیشنها، بهگونهای است که هر کاربر فقط باید به یک سرور متصل بماند و امکان تغییر سرور وجود ندارد. با کمک قابلیت Sticky Sessions این موضوع ممکن میشود.
Health Check
HAproxy همه سرورها را بررسی میکند تا بفهمد آیا توانایی پردازش درخواستها را دارند یا خیر! اگر سروری، به هر دلیلی امکان پاسخدهی نداشته باشد، بهصورت خودکار غیرفعال میشود و ترافیکی هم به سمتش نمیرود.
همچنین اگر همه سرورها از دسترس خارج شوند، کل سایت یا اپلیکیشن مسدود میشود تا حداقل یک سرور Backend مجدداً به چرخه فعالیت بازگردد.
چگونه میتوان نرمافزار HAproxy 1.8.8 را روی centos نصب کرد؟
برای اینکه بتوانید از HAproxy و ویژگیهای کارآمدش بهره ببرید، باید آن را روی سایت یا اپلیکیشنتان نصب کنید.
قبل از هرکاری، باید پیشنیازهای این نرمافزار را نصب کنید:
`sudo yum install gcc pcre-static pcre-devel –y`
حالا باید نرمافزار را نصب و فایل haproxy.cfg را پیکربندی کنید:
cd /etc/haproxy/ yum -y install haproxy mv haproxy.cfg haproxy.cfg.orig nano haproxy.cfg
در مرحله بعدی، باید محتوای زیر را در فایل قرار دهید:
#--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global log /dev/log local0 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 10000 user haproxy #Haproxy running under user and group "haproxy" group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 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 10000 #--------------------------------------------------------------------- #HAProxy Monitoring Config #--------------------------------------------------------------------- listen webfarm bind 0.0.0.0:8080 mode http stats enable stats uri / stats realm Strictly\ Private stats auth test:test #--------------------------------------------------------------------- # FrontEnd Configuration #--------------------------------------------------------------------- frontend main default_backend app-main bind *:80 option http-server-close option forwardfor #--------------------------------------------------------------------- # BackEnd roundrobin as balance algorithm #--------------------------------------------------------------------- backend app-main balance roundrobin #Balance algorithm option httpchk HEAD / HTTP/1.1\r\nHost:\ localhost #Check the server application is up and healty - 200 status code server SERVER-NAME SERVER-IP:PORT check
از طریق سرور Haproxy و در بخش HAproxy Monitoring Config، میتوانید با قرار دادن یک Username و Password، از طریق وب، وضعیت وبسرورها را بررسی کنید.
برای دسترسی به سرور این نرمافزار، باید از آدرس زیر استفاده کنید:
http://IP-haproxy-server:8080/stats
سپس در فایل /etc/rsyslog.conf، باید دو خط زیر را از حالت کامنت خارج کنید:
$ModLoad imudp $UDPServerRun 514
بعد از آن، باید خط زیر را داخل همین فایل add کنید:
$UDPServerAddress 127.0.0.1
حالا باید فایل /etc/rsyslog.d/haproxy.conf را ایجاد کنید و محتوای زیر را داخل آن قرار دهید:
local2.=info /var/log/haproxy-access.log #For Access Log local2.notice /var/log/haproxy-info.log #For Service Info - Backend, loadbalancer
در این مرحله باید سرویسها را Start کنید، اینکار توسط دستور زیر انجام میشود:
systemctl restart rsyslog systemctl start haproxy systemctl enable haprox
در مرحله آخر، باید پورت 80 و 8080 را به Firewall اضافه کنید:
iptables -I INPUT -p tcp -m tcp --dport 8080 -j ACCEPT iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT service iptables save
نکته: در Centos 7، که یکی از توزیعهای معروف لینوکس است، احتمال دارد که iptables در سرور فعال نباشد! در چنین شرایطی باید ابتدا Firewalld را، توسط دستور زیر غیرفعال و iptables را فعال کنید:
systemctl stop firewalld systemctl mask firewalld yum install iptables-services systemctl enable iptables
در صورت اعمال هرگونه تغییر در فایل haproxy.cfg، باید haproxy را reload کنید. دستور زیر برای انجام این کار است:
service haproxy reload
همچنین برای فعالسازی پروتکل HTTPS در front-end main، باید از دستور زیر استفاده کنید:
frontend www-https pem.example.com/bind haproxy_www_public_IP:443 ssl crt /etc/ssl/private reqadd X-Forwarded-Proto:\ https default_backend www-backend
خب این هم تمام آن چیزی که لازم بود راجع به نرمافزار HAproxy بدانید.
حرف آخر: HAproxy در کنار NginX قدرتمندتر است!
خب متوجه شدیم که HAproxy، نرمافزاری است که وظیفهاش بهبود عملکرد نهایی سایت و اپلیکیشن است. وب سرور Nginx بهخاطر خصوصیاتش، زمانی که همراه با HAproxy استفاده میشود، عملکرد بهتری خواهد داشت. همچنین HAproxy هم در کنار این وب سرور، کارآمدتر از همیشه نشان میدهد.
برای تهیه این مقاله از سایتهای DigitalOcean و TechTarget کمک گرفتیم.
اگر سوال یا نظری در این زمینه دارید، در قسمت کامنتها منتظرتان هستیم. 💙