اگر چند سرور دارید، بهتر است همۀ درخواستهای کاربران به یک سرور نرسند. Load Balancer ترافیک را بین سرورها تقسیم میکند و HAProxy یکی از ابزارهای شناختهشده برای این کار است. اما HAProxy چیست و در عمل چطور ترافیک را مدیریت میکند؟ در ادامه میبینیم haproxy چیست، چگونه کار میکند و چطور میتوان آن را روی Ubuntu نصب و راهاندازی کرد. اگر هنوز با مفهوم لود بالانسینگ آشنا نیستید، پیشنهاد میکنیم ابتدا مطلب «لود بالانسر چیست» را بخوانید.
دقت داشته باشید نسخۀ مرجع این آموزش Ubuntu 24.04 LTS است و مسیرها و دستورها بر اساس ساختار همین نسخه نوشته شدهاند.
HAProxy چیست؟
HAProxy نرمافزاری متنباز برای Load Balancing و Proxy ترافیک شبکه است. وظیفۀ این نرمافزار این است که درخواستهای ورودی را دریافت میکند و بر اساس تنظیمات، آنها را میان چند سرور Backend توزیع میکند.
برای نمونه، فرض کنید دو سرور وب با آدرسهای زیر دارید:
Server 1: 192.168.1.10 Server 2: 192.168.1.11
در این سناریو، کاربر بهجای اتصال مستقیم به یکی از سرورها، ابتدا به HAProxy متصل میشود. haproxy با توجه به الگوریتمی که برای آن تعیین کردهاید، درخواست را به Backend مناسب میفرستد. به این ترتیب بار میان سرورها بهتر تقسیم میشود و مدیریت ترافیک هم سادهتر خواهد بود.
HAProxy چگونه کار میکند؟
HAProxy معمولاً بین Client و سرورهای Backend قرار میگیرد؛ یعنی زمانی که کاربر درخواست را به IP یا دامنهای میفرستد که به HAProxy متصل است، haproxy هم آن را دریافت میکند و به یکی از Backendها میفرستد.
نمای ساده این معماری به شکل زیر است:
کاربران ↓ HAProxy Web Server 1: 192.168.1.10 Web Server 2: 192.168.1.11
انتخاب Backend میتواند با الگوریتمهایی مثل Round Robin انجام شود. HAProxy در کنار آن با Health Check وضعیت سرورها را بررسی میکند و اگر یکی از Backendها از دسترس خارج شود، درخواستها به سرورهای سالم فرستاده میشوند.
تفاوت HAProxy با Nginx و سایر Load Balancerها
HAProxy و Nginx هر دو برای توزیع ترافیک به کار میروند، اما تمرکز آنها یکسان نیست. به عبارت سادهتر:
- HAProxy: تمرکز اصلی این ابزار روی Load Balancing ،Proxy و مدیریت اتصالهای شبکه است. وقتی کنترل دقیق توزیع ترافیک بین چند Backend اهمیت دارد، haproxy انتخاب قدرتمندی است.
- Nginx: علاوه بر Load Balancing، بهعنوان Web Server،از Reverse Proxy و Cache هم استفاده میشود. به همین دلیل، برای پروژههایی که هم سرویسدهی فایل و هم Reverse Proxy میخواهند، میتواند گزینۀ مناسبی باشد.
- سایر Load Balancerها: بعضی راهکارها بهصورت سختافزاری یا سرویس ابری ارائه میشوند و قابلیتهایی مانند Auto Scaling ،High Availability و مدیریت متمرکز زیرساخت دارند.
در نتیجه، نمیتوان HAProxy را در همۀ سناریوها بهتر از Nginx یا سایر Load Balancerها دانست و انتخاب نهایی به معماری، حجم ترافیک، قابلیتهای موردنیاز و شیوۀ مدیریت زیرساخت بستگی دارد.
چرا از HAProxy روی VPS استفاده کنیم؟
نصب HAProxy روی سرور مجازی لینوکس بیشتر برای پروژههایی معنا پیدا میکند که چند Backend دارند یا میخواهند یک لایۀ مستقل برای کنترل و توزیع ترافیک داشته باشند. این ساختار چند مزیت اصلی دارد که عبارتاند از:
- توزیع بار: درخواستها میان چند سرور تقسیم میشوند تا همۀ فشار روی یک Backend نباشد.
- افزایش دسترسپذیری: اگر یک Backend خراب شود، ترافیک میتواند به سرور سالم منتقل شود.
- Health Check: وضعیت Backendها بهصورت مداوم بررسی میشود.
- مقیاسپذیری: با افزایش ترافیک میتوان Backendهای بیشتری به معماری اضافه کرد.
- مدیریت متمرکز: بخشی از کنترل ترافیک از یک نقطه انجام میشود.
یک نکتۀ مهم را هم باید در نظر گرفت: خود haproxy میتواند به نقطۀ حساس معماری تبدیل شود. اگر فقط یک سرور HAProxy داشته باشید و همان سرور از دسترس خارج شود، ممکن است ترافیک کاربران متوقف شود. بنابراین در زیرساختهای حساس معمولاً از چند Load Balancer و معماری High Availability استفاده میشود.
پیشنیازهای نصب HAProxy روی Ubuntu
پیش از نصب HAProxy، این موارد را آماده کنید:
- یک VPS با Ubuntu
- دسترسی SSH و یک کاربر با مجوز sudo
- حداقل دو Backend برای Load Balancing
- یک IP یا دامنه که به سرور HAProxy اشاره کند
در این آموزش فرض میکنیم HAProxy روی یک سرور نصب شده و دو Backend با آدرسهای زیر در اختیار داریم:
HAProxy: 192.168.1.5 Backend 1: 192.168.1.10 Backend 2: 192.168.1.11
توجه داشته باشید که در محیط واقعی باید این IPها را با آدرس سرورهای خودتان جایگزین کنید.
آموزش نصب HAProxy روی Ubuntu
ابتدا فهرست بستههای Ubuntu را بهروزرسانی کنید:
sudo apt update
حالا HAProxy را نصب کنید:
sudo apt install haproxy -y
پس از نصب، وضعیت سرویس را بررسی کنید:
sudo systemctl status haproxy
برای اینکه HAProxy بعد از Restart یا Boot شدن سرور هم بهصورت خودکار اجرا شود، سرویس را فعال کنید:
sudo systemctl enable haproxy
اگر نصب و اجرای سرویس بدون مشکل انجام شده باشد، باید در خروجی عبارتی مشابه مورد زیر ببینید:
Active: active (running)
خروجی ممکن است اطلاعات دیگری مثل زمان اجرا، PID و تعداد پردازشها هم داشته باشد. در این مرحله مهمترین بخش همان «active (running)» است. فایل اصلی تنظیمات HAProxy معمولاً در این مسیر قرار دارد:
/etc/haproxy/haproxy.cfg
قبل از ویرایش فایل تنظیمات، بهتر است یک نسخۀ پشتیبان از آن بگیرید:
sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup
پیکربندی HAProxy برای Load Balancing
برای یک پیکربندی ساده، فرض کنید میخواهیم درخواستهای HTTP روی پورت 80 را میان دو Backend تقسیم کنیم. ابتدا Frontend را به شکل زیر تعریف کنید:
frontend web_front bind *:80 default_backend web_servers
بعد نوبت تعریف Backendهاست:
backend web_servers balance roundrobin server web1 192.168.1.10:80 check server web2 192.168.1.11:80 check
در این تنظیمات، bind *:80 باعث میشود HAProxy روی پورت 80 منتظر اتصالهای ورودی باشد. گزینۀ roundrobin درخواستها را بهصورت چرخشی بین Backendها تقسیم میکند و عبارت check نیز وضعیت سرورها را بررسی میکند. بعد از ذخیرۀ فایل، قبل از Restart کردن سرویس، صحت تنظیمات را بررسی کنید:
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
اگر خطایی گزارش نشد، سرویس را Restart کنید:
sudo systemctl restart haproxy
از اینجا به بعد، درخواستهایی که به HAProxy میرسند میتوانند بین دو Backend توزیع شوند.
باز کردن پورت 80 در UFW
اگر UFW روی VPS فعال است، اجرای HAProxy بهتنهایی کافی نیست و باید پورت 80 را هم برای اتصالهای ورودی باز کنید. در غیر این صورت ممکن است سرویس درست اجرا شود، اما کاربران نتوانند به آن دسترسی داشته باشند. بنابراین ابتدا وضعیت UFW را ببینید:
sudo ufw status
اگر فایروال فعال است، اجازۀ دسترسی به پورت HTTP را اضافه کنید:
sudo ufw allow 80/tcp
سپس یک بار دیگر قوانین را بررسی کنید:
sudo ufw status
اگر قانون بهدرستی اضافه شده باشد، باید موردی مشابه «80/tcp ALLOW» را در خروجی ببینید.
نکته: اگر HTTPS را هم روی haproxy راهاندازی میکنید، باید پورت 443 را متناسب با تنظیمات فایروال باز کنید.
تست نهایی Load Balancing
برای تست Round Robin بهتر است پاسخ دو Backend با هم فرق داشته باشد؛ مثلاً Backend اول «Backend 1» و Backend دوم «Backend 2» را برگرداند. در این حالت جابهجایی درخواستها بین دو سرور را راحتتر میبینید.
حالا IP سرور HAProxy را چند بار با curl فراخوانی کنید:
curl http://192.168.1.5 curl http://192.168.1.5 curl http://192.168.1.5 curl http://192.168.1.5
اگر هر دو Backend سالم باشند و Round Robin درست کار کند، باید در چند درخواست متوالی پاسخ هر دو سرور را ببینید؛ برای مثال: ترتیب دقیق پاسخها ممکن است با توجه به وضعیت Connection و تنظیمات سرویس فرق کند. معیار اصلی این است که پس از چند درخواست، پاسخ هر دو Backend دیده شود.
Backend 1 Backend 2 Backend 1 Backend 2
3 الگوریتم Load Balancing در HAProxy
HAProxy برای انتخاب Backend 3 الگوریتم در اختیار شما میگذارد که عبارتاند از:
- Round Robin: درخواستها بهترتیب میان سرورها تقسیم میشوند و برای Backendهایی با منابع مشابه، انتخاب سادهای است.
- Least Connections: درخواست جدید به سروری میرود که کمترین اتصال فعال را دارد. وقتی زمان پردازش درخواستها یکسان نیست، این روش میتواند مناسبتر باشد.
- IP Hash: بکاند بر اساس IP کاربر انتخاب میشود و در شرایط مشخص میتواند یک کاربر را به Backend ثابتی هدایت کند.
به این نکته دقت کنید که انتخاب الگوریتم بهتر است بر اساس رفتار واقعی برنامه و الگوی ترافیک انجام شود و Round Robin همیشه بهترین انتخاب نیست.
haproxy و HTTPS
HAProxy میتواند بخشی از معماری HTTPS هم باشد. یکی از روشها این است که TLS روی خود HAProxy Terminate شود و سپس درخواست به Backendها فرستاده شود. در این حالت، گواهی SSL روی HAProxy مدیریت میشود و Backendها میتوانند داخل شبکۀ داخلی قرار بگیرند. البته در محیطهای حساس، باید دربارۀ رمزنگاری ارتباط بین HAProxy و Backendها هم بر اساس نیاز امنیتی پروژه تصمیم بگیرید.
اگر برنامۀ Backend به IP واقعی کاربر نیاز دارد، باید مطمئن شوید این اطلاعات به آن منتقل میشود، در غیر این صورت ممکن است برنامه فقط IP مربوط به haproxy را ببیند.
HAProxy و GitHub
اگر تنظیمات HAProxy بخشی از یک پروژۀ نرمافزاری است، نگهداری فایلهای Configuration در سیستم کنترل نسخه میتواند مدیریت تغییرات را سادهتر کند (برای آشنایی بیشتر با این موضوع میتوانید راهنمای گیت هاب را ببینید). فقط دقت کنید که اطلاعات حساس مثل کلید خصوصی، رمز عبور و Secret را داخل Repository عمومی قرار ندهید.
HAProxy روی سرور مجازی ایران
محل قرارگیری Load Balancer روی کیفیت ارتباط کاربران اثر دارد. اگر بیشتر کاربران سایت داخل ایران هستند، استفاده از سرور مجازی ایران در بعضی سناریوها میتواند فاصلۀ شبکه و Latency را کاهش دهد.
با این حال، لوکیشن مناسب فقط به کشور کاربران وابسته نیست. مسیرهای شبکه، کیفیت دیتاسنتر و محل Backendها هم مهماند؛ بنابراین پیش از تصمیم نهایی بهتر است پینگ و کیفیت اتصال را از چند نقطه بررسی کنید.
محدودیتهای haproxy
HAProxy با وجود امکانات زیادی که دارد، جایگزین همG اجزای معماری وب نیست. Load Balancing بهتنهایی مشکل کدنویسی ضعیف، کوئریهای سنگین دیتابیس یا کمبود منابع Backend را حل نمیکند. از طرف دیگر، وقتی تمام ترافیک از یک haproxy عبور میکند، CPU ،RAM و ظرفیت شبکۀ همان سرور باید متناسب با حجم درخواستها باشد. به همین دلیل در ترافیک بالا ممکن است به چند Load Balancer، معماری High Availability و مانیتورینگ حرفهای نیاز پیدا کنید.
جمعبندی
HAProxy یک Load Balancer و Proxy متنباز است که درخواستهای ورودی را میان چند Backend توزیع میکند و میتواند وضعیت سرورها را هم زیر نظر داشته باشد. نصب HAProxy روی Ubuntu پیچیده نیست، اما کیفیت معماری، بیشتر از خود فرایند نصب اهمیت دارد. در یک پروژۀ واقعی باید تعداد Backendها، الگوریتم توزیع بار، Health Check ،HTTPS، منابع سرور و احتمال از دسترس خارج شدن Load Balancer را از قبل در نظر بگیرید.
برای شروع کار، میتوانید یک سرور مجازی لینوکس و دو Backend آزمایشی راهاندازی کنید و رفتار الگوریتمهای مختلف را زیر بار بررسی کنید. قبل از انتقال ترافیک اصلی هم خرابی یکی از Backendها را شبیهسازی کنید تا مطمئن شوید HAProxy سرور معیوب را از چرخه توزیع خارج میکند.
سؤالات متداول
HAProxy چیست؟
HAProxy نرمافزاری متنباز برای Load Balancing و Proxy ترافیک شبکه است. این نرمافزار بین کاربران و Backendها قرار میگیرد، درخواستها را توزیع میکند و با قابلیتهایی مثل Health Check میتواند وضعیت سرورها را هم بررسی کند.
آیا میتوان HAProxy را روی VPS نصب کرد؟
بله. HAProxy روی VPSهای لینوکسی مانند Ubuntu قابل نصب و پیکربندی است. برای استفادۀ از آن، علاوه بر منابع VPS باید ظرفیت شبکه، تعداد اتصالها و تعداد Backendهای موردنیاز را هم در نظر بگیرید.
آیا HAProxy فقط برای وبسایتها استفاده میشود؟
خیر. HAProxy علاوه بر HTTP و HTTPS، میتواند برای برخی سرویسهای TCP هم بهعنوان Load Balancer و Proxy به کار برود. نوع پیکربندی نیز باید با پروتکل و نیاز همان سرویس هماهنگ باشد.
تفاوت HAProxy و Load Balancer چیست؟
Load Balancer یک نقش در معماری شبکه است، اما HAProxy نرمافزاری است که میتواند این نقش را اجرا کند. به بیان ساده، HAProxy یکی از راهکارهای Load Balancing است و گزینههای نرمافزاری و سختافزاری دیگری هم وجود دارند.
آیا HAProxy باعث افزایش سرعت سایت میشود؟
HAProxy مستقیماً سرعت اجرای کد یا دیتابیس را بیشتر نمیکند. کاری که انجام میدهد، توزیع درخواستها میان چند Backend است؛ بنابراین در یک معماری درست میتواند فشار روی سرورها را کمتر و عملکرد سرویس را در زمان افزایش ترافیک پایدارتر کند.
آیا HAProxy از HTTPS پشتیبانی میکند؟
بله. HAProxy میتواند ترافیک HTTPS را مدیریت کند و TLS Termination را در لایۀ Load Balancer انجام دهد. در این حالت گواهی SSL روی HAProxy قرار میگیرد و برای سرویسهای حساس باید امنیت ارتباط بین HAProxy و Backendها هم بررسی شود.





