آموزش HAProxy
احتمالاً همه ما تجربه ایستادن در صف چک پاسپورت در فرودگاهها را داشتهایم. گاهی اوقات بوده که تنها یک باجه برای این کار فعال بوده است و ناگهان دو یا چند پرواز با یکدیگر وارد فرودگاه شده و تعداد زیادی از مسافران به سمت باجه حرکت میکنند. صف طولانی ایجاد میشود و این موضوع باعث کلافگی و شکایت مسافران میشود. مسئول آن بخش وقتی با این وضعیت روبرو میشود، دو باجهی دیگر را نیز فعال میکند و مسافران را بین این سه باجه تقسیم میکند تا کار به سرعت انجام شود. عملاً با یک مدیریت صحیح این مشکل به راحتی حل شد.
حال فرض کنید که شما یک سایت با ورودی بالا دارید که در لحظه افراد زیادی وارد صفحات آن میشوند. تمامی درخواستها مستقیم به سمت سرور سایت میروند که این موضوع در مواقعی که میزان درخواستها بالاست، ما را دچار مشکل میکند. مدیر سایت تصمیم میگیرد تعداد سرورهای سایت را بیشتر کند و دو سرور دیگر به عنوان سرور کمکی به سرور اول اضافه نماید. ما در اینجا سه سرور داریم، اما مشکل همچنان حل نشده زیرا همچنان تمامی درخواستها به سمت سرور اول میرود. مدیر سایت برای رفع مشکل، یک سرور در جلوی سه سرور سایت قرار میدهد که تمامی درخواستهای مربوط به سایت، به آن سرور برسد و سپس سرور مربوطه تصمیم بگیرد که آن درخواستها را به سمت سه سرور سایت ارسال نماید. موضوع این مقاله در رابطه با همین سرور واسط است که در جلوی سرورهای سایت قرار گرفته و وظیفه مدیریت ارسال درخواستها را برعهده دارد.
این سرور واسط در اصطلاح یک پراکسی معکوس (Revese Proxy) است که وظیفه تقسیم بار یا Load Balancing را نیز برعهده دارد. نرمافزارهای زیادی برای انجام این کار وجود دارند که یکی از محبوبترین آنها HAProxy است.
نکته: در مواردی در این مقالۀ آموزشی برای راحتی کار از عبارت ha به جای haproxy استفاده میشود.
لود بالانسر چیست؟
تقسیم بار یا لود بالانسینگ به فرآیندی گفته میشود که به کمک یک لود بالانسر، کارهای محاسباتی بین دو یا چند سرور توزیع میشود و با این تقسیم ترافیک عملاً بار بر روی یک سرور قرار نگرفته و تقسیم میشود. این موضوع باعث میشود که کارایی سیستم بالاتر رفته و پاسخدهی به مشتریان سریعتر گردد.
HAProxy چیست؟
همانطور که گفته شد نرمافزار haproxy یک Reverse Proxy و لود بالانسر (Load Balancer) است که با زبان برنامه نویسی C و به صورت رایگان و Open Source عرضه شده است. عبارت haproxy مخفف High Availability Proxy است. این نرمافزار وظیفه خود را برای دو پروتکل TCP و HTTP انجام میدهد و یکی از دلایل اصلی محبوبیت آن سرعت و کارایی آن است.
پروژه کدنویسی haproxy در سال ۲۰۰۰ توسط آقای Willy Tarreau که یکی از مشارکت کنندگان در کدنویسی هسته لینوکس است، آغاز شد. بعد از گذشت بیش از ۲۰ سال او همچنان این پروژه را مدیریت میکند. این پروژه بعد از چند سال بیش از حد انتظار به موفقیت دست یافت و به همین دلیل در سال ۲۰۱۳ یک شرکت از نوع بامسئولیت محدود با نام HAProxy Technologies ثبت شد. از این به بعد این شرکت به جنبه اقتصادی نرم افزار نیز نیم نگاهی داشت و پیشنهاد نسخه پولی را به کاربران خود میداد. البته همچنان نسخه اصلی این شرکت کاملاً رایگان است و امکانات وسیعی را به کاربران خود ارائه میدهد.
برای اینکه به اهمیت این نرمافزار بیشتر پی برید در زیر لیستی از بزرگترین وب سایتهایی که از ha استفاده میکنند را نام خواهیم برد:
- GoDaddy
- GitHub
- Bitbucket
- Stack Overflow
- Speedtest.net
- Tumblr
آموزش نصب و پیکربندی haproxy
HAProxy یک راه حل محبوب، قابل اعتماد و مقرون به صرفه برای متعادل کردن بار ترافیک ورودی است. این نرم افزار به دلیل قوی و قابل اعتماد بودن شناخته شده است و بسیاری از وب سایتهای محبوب دنیا از آن استفاده میکنند.
برای نصب haproxy نیاز به یک سیستم عامل لینوکسی مانند اوبونتو، دبیان، ردهت، فدورا و یا غیره دارید. به عنوان یک Load Balancer (متعادل کننده بار)، نرمافزار HAProxy در دو حالت کار میکند:
- TCP Mode
- HTTP Mode
برای نصب این نرم افزار میتوانید از مخازن دبیانی و یا ردهتی و با استفاده از yum و یا apt استفاده نمایید.
در سیستم عاملهای مبتنی بر دبیان، مطابق دستورات زیر ابتدا لیست برنامههای مخازن موجود را بهروزرسانی کرده و سپس با استفاده از apt اقدام به نصب این برنامه مینماییم.
#sudo apt update
#sudo apt install haproxy
در سیستم عاملهای مبتنی بر ردهت نیز همین کار را انجام میدهیم، اما اینبار با دستورات دیگری:
#sudo yum update
#sudo yum install haproxy
ثانیههایی صبر کنید تا فرآیند نصب تمام شود.
تبریک میگوییم، haproxy با موفقیت نصب شد و اکنون نوبت به کانفیگ haproxy میرسد.
HAProxy دارای یک نمونه فایل پیکربندی واقع در آدرس زیر است. این فایل حاوی یک راه اندازی استاندارد بدون هیچگونه گزینه متعادل کننده بار است. برای افزودن قابلیتهای ویژه نیز باید از همین فایل اقدام نمایید. بهطور کلی تمام تنظیمات این نرم افزار در همین فایل haproxy.cfg انجام میشود.
#vim /etc/haproxy/haproxy.cfg
راه اندازی haproxy
برای راهاندازی سرویس haproxy باید از دستور زیر استفاده نمایید:
#systemctl start haproxy
با استفاده از دستور زیر نیز میتوانید این سرویس را متوقف و مجدد راه اندازی نمایید:
#systemctl restart haproxy
در صورتی که سرویس حساسی بر روی ha فعال است و نمیخواهید فرآیند راه اندازی آن را دچار وقفه نمایید، باید از دستور زیر استفاده نمایید تا فقط تنظیمات این سرویس مجدد خوانده شود. اگر اشتباهی در تنظیمات وجود داشته باشد که منجر به دریافت خطا شود، این روش به شما کمک میکند که سرویس زیر بار دچار وقفه نشود.
#systemctl reload haproxy
کانفیگ HAProxy
فایل اصلی کانفیک haproxy دارای ۵ قسمت اصلی است که تنظیمات در داخل این بخشها قرار میگیرند. این بخشها عبارتند از:
haproxy.cfg - Main Sections
global
defaults
frontend
backend
listen
در ادامه که آموزش بخشهای مختلف را بیان میکنیم، شما نیز میتوانید موارد گفته شده را جایگزین موارد پیش فرض فایل مربوطه نمایید. حتی برای راحتی کار میتوانید، تنظیمات پیش فرض را کاملاً پاک نموده و از مقادیر گفته شده استفاده نمایید.
بخش Global
بخش گلوبال شامل تنظیمات پیکربندی برای HAProxy، مانند آدرس SSL، اطلاعات مربوط به گزارشهای نرم افزار و کاربر و گروهی که میتوانند توابع HAProxy را اجرا کنند، میباشد. تنها یک قسمت گوبال در فایل haproxy.cfg وجود دارد و نمیتوانید چند نمونه از آن تعریف نمایید.
haproxy.cfg - Global Sections
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
master-worker
nbthread 8
cpu-map auto:1/1-8 0-7
tune.bufsize 16384
tune.ssl.default-dh-param 2048
tune.ssl.cachesize 1000000
tune.ssl.lifetime 3600
ssl-engine rdrand
ssl-mode-async
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:TLS13-CHACHA20-POLY1305-SHA256:EECDH+AESGCM:EECDH+CHACHA20:ECDH+AES256
ssl-default-bind-options no-sslv3 no-tlsv10
ssl-default-server-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
بخش Defaults
مقادیری که در این بخش تعیین میشوند به تمام بخشهای frontend و backend اعمال میشوند مگر اینکه در آن بخش، یک قانون مجزایی نوشته شده باشد. استفاده از بخش defaults به شما کمک میکند که برای هر قسمت نیاز به تکرار یک قانون نداشته باشید و عملاً فقط یکبار آن قانون را در این بخش بنویسید و خودش برای تمام نودهای frontend و backend اعمال میشود.
haproxy.cfg - Defaults Sections
global
log global
mode http
option httplog
option dontlognull
option forwardfor
option httpclose
option abortonclose
option http-keep-alive
option tcp-smart-accept
option tcp-smart-connect
retries 2
timeout connect 5s
timeout client 50s
timeout server 50s
maxconn 1000000
timeout http-request 10s
timeout http-keep-alive 2s
timeout queue 5s
timeout tunnel 2m
timeout client-fin 1s
timeout server-fin 1s
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
در بخش defaults پنج قانون زیر که حالت عملیاتی و timeoutها را مشخص میکنند از اهمیت زیادی برخوردار هستند:
mode http
timeout client 5s
timeout connect 5s
timeout server 5s
timeout http-request 5s
خط اول دستورالعملی است که حالت عملیاتی را برای haproxy تعریف میکند. HAProxy میتواند در دو حالت مختلف اجرا شود: TCP یا HTTP. وقتی در حالت TCP کار میکنیم، میگوییم که به عنوان یک پروکسی لایه ۴ عمل کند. در حالت HTTP میگوییم که به عنوان یک پروکسی لایه ۷ عمل کند. برای درک تفاوت این دو، باید در مورد مدل OSI تحقیق نمایید. مدل OSI در واقع تنها راه برای ساده کردن نحوه تفکر در مورد یک شبکه و اجزای موجود در آن است. این مدل از هفت لایه تشکیل شده است که هر یک مسئولیت مجموعه عملکردهای متفاوتی را بر عهده دارند، اما درنهایت همه با یکدیگر مرتبط هستند.
اما باید از کدام یک از این دو mode برای haproxy استفاده نماییم؟ پاسخ به این سوال بستگی به نیاز شما دارد. اگر میخواهید از haproxy به عنوان یک پراکسی برای پورتهای ۸۰ و ۴۴۳ استفاده نمایید، باید حالت آن را http تعریف کرده و در صورتی که بخواهید به سراغ سایر پورتها بروید، باید از حالت tcp استفاده کنید. حالت tcp یک قابلیت ویژه در haproxy است که شما را تنها محدود به استفاده از این نرم افزار برای ترافیک وب نمیکند بلکه میتوانید از آن برای رنج وسیعی از سایر نرمافزارها مانند دیتابیسها نیز استفاده نمایید.
در زیر میتوانید نمونهای از پیکربندی هر کدام از این دو حالت را مشاهده نمایید:
haproxy.cfg - Defaults Sections - Mode=TCP
defaults
# mode is inherited by sections that follow
mode tcp
frontend db
# receives traffic from clients
bind :3306
default_backend databases
backend databases
# relays the client messages to servers
server db1 192.168.1.10:3306
server db2 192.168.1.11:3306
haproxy.cfg - Defaults Sections - Mode=HTTP
defaults
# mode is inherited by sections that follow
mode http
frontend www
# receives traffic from clients
bind :80
default_backend web_servers
backend web_servers
# relays the client messages to servers
server s1 192.168.1.10:3000
server s2 192.168.1.11:3000
بهطور کلی در صورتی که میخواهید از haproxy برای ترافیک وب استفاده نمایید، پیشنهاد میکنیم از حالت http استفاده کنید زیرا نهتنها تمام قابلیتهای tcp را دارد بلکه امکانات بیشتری را نیز به شما عرضه میکند.
خب بقیه آموزش چی شد؟