HAProxy، یک نرمافزار پراکسی معکوس (revers proxy) و توزیع بار (load balancer) متنباز است که برای بهبود عملکرد و افزایش قابلیت اطمینان برنامههای وب استفاده میشود. این ابزار، با استفاده از الگوریتمهای مختلف، درخواستهای کاربران را به سرورهای پشتیبان ارسال میکند و باعث بهبود بار گذاری سرورها و کاهش احتمال خرابی یک سرور میشود.
تنظیمات HAProxy میتواند بسیار گسترده باشد، از جمله کنترل ترافیک ورودی، توزیع متوازن ترافیک به سرورهای پشتیبان، و مدیریت پاسخ به خطاها. این تنظیمات اساسی برای بهینه سازی عملکرد HAProxy و ارتقاء عملکرد سرورها است.
در این مقاله، ما به برخی از مفاهیم اولیه و پارامترهای اساسی تنظیمات HAProxy اشاره میکنیم. این مفاهیم و پارامترها به عنوان پایهای برای تنظیم صحیح HAProxy عنوان شدهاند و به شما کمک میکنند تا این ابزار را با دقت و هوشمندانه پیکربندی کنید، به ویژه با در نظر گرفتن مقاله پیشین در زمینه “نصب HAProxy” که قبلاً ارائه دادهایم.
مطالعه بیشتر : آموزش نصب HAPROXY در سیستم های لینوکسی
مطالعه بیشتر : Load balancing و Load Balancer چیست؟
مفاهیم اولیه HAProxy
1. Frontend:
فرانتاند (Frontend) در HAProxy نقطه ورود به سیستم است که درخواستهای ورودی را دریافت میکند.
این قسمت تنظیماتی را شامل میشود که به HAProxy اجازه میدهد از یک پورت خاص برای گوش دادن به درخواستها استفاده کند و پروتکلهای متنوعی از جمله HTTP، HTTPS و TCP را پشتیبانی میکند.
با اعمال تنظیمات دقیق در فرانتاند، این قسمت از HAProxy میتواند درخواستها را بر اساس معیارهای مختلفی همچون نوع پروتکل یا پورت درخواست را به Backendهای مرتبط هدایت نماید.
به عبارت دیگر، فرانتاند HAProxy نقش اصلی در مدیریت ترافیک ورودی دارد و با اعمال قوانین و شرایط مختلف، تعیین میکند که یک درخواست ورودی به کدام سرویس یا سرور پشتیبان ارسال شود.
این امکان به مدیران سیستم اجازه میدهد تا با دقت تنظیمات خود را مدیریت کرده و کنترل دقیقی بر روی ترافیک ورودی به HAProxy داشته باشند.
مطالعه بیشتر : پرتکل 2 /3 HTTP چیست ؟
2. Backend:
بکاند (Backend) در HAProxy، بخشی است که به عنوان نقطه خروج از سیستم عمل میکند و در آن پیکربندیها و تنظیمات مربوط به سرورها و خدمات پشتیبان قرار دارند.
این بخش از HAProxy تعیین میکند که چگونه درخواستهایی که از فرانتاند دریافت شدهاند، به سمت سرورهای پشتیبان هدایت شود.
تنظیمات بکاند شامل اطلاعاتی مانند نشانی IP و پورتهای سرورهای پشتیبان، استراتژیهای توزیع بار، و قوانین مربوط به مدیریت درخواستها و اتصالات است. با تنظیم بهینه بکاند، HAProxy میتواند ترافیک را به صورت موازی بین سرورهای پشتیبان توزیع کرده و از مقیاسپذیری و اطمینان بالا برخوردار شود.
3. ACL (Access Control List):
در HAProxy، قابلیت ACL (لیست کنترل دسترسی) به مدیران امکان میدهند کنترل دقیقی بر روی ترافیک و درخواستهای ورودی اعمال کنند.
این مفهوم باعث میشود که با ایجاد شرایط و قوانین خاص، به صورت اختصاصی تصمیمگیریها را بر اساس ویژگیهای مختلف درخواستها و پاسخها داشته باشید.
تنظیمات ACL در HAProxy اجازه میدهند تا بر اساس آدرس IP، نوع درخواست (مانند GET یا POST)، هدرهای HTTP، یا حتی مقادیر خاص در درخواستها، تصمیمگیری کنید.
به عبارت دیگر، میتوانید سیاستهای دسترسی خود را بر اساس معیارهای دقیق و دلخواه تنظیم و به راحتی تنظیماتی را برای مسدودسازی یا مجوزدهی بر اساس نیازهای خاص خود پیکربندی کنید.
4. SSL Offloading:
این قابلیت به HAProxy اجازه میدهد تا به عنوان یک Reverse Proxy عمل کند و رمزنگاری SSL/TLS را بر عهده بگیرد.
با این کار، سرورهای وب پشتیبانی شده میتوانند از بار محاسباتی رمزنگاری SSL/TLS بینیاز شوند و کارایی سیستم بهبود یابد.
مطالعه بیشتر : درباره الگوریتم SSL Acceleration
5. Logging:
HAProxy قابلیت ثبت لاگهای جزئیات ترافیک و عملکرد سیستم را دارد. میتوانید سطح ثبت لاگ را تنظیم کنید و به اطلاعات مربوط به درخواستها، پاسخها، زمان پاسخ دهی و غیره دسترسی داشته باشید. این اطلاعات میتواند برای مانیتورینگ و تحلیل عملکرد سیستم و رفع مشکلات مفید باشد.
ساختار HAproxy:
ساختاریک فایل کانفیگ عموما به صورت زیر است و از۴ بخش اصلی تشکیل شده است:
global
# global settings here
defaults
# defaults here
frontend
# a frontend that accepts requests from clients
backend
# servers that fulfill the requests
یک بخش آغاز میشود زمانی که یک کلمه کلیدی مانند global یا defaults دیده میشود و از تمام خطوطی که پس از آن آمدهاند تشکیل شده است، تا زمانی که به یک کلمه کلیدی بخش دیگر برسید. خطوط خالی و تورفتگی (فاصلهگذاری) نادیده گرفته میشوند. بنابراین، بخش global ادامه دارد تا زمانی که به عنوان مثال به یک کلمه کلیدی defaults بر روی خط مجزا برسید.
1. گلوبال (Global) :
در ابتدای فایل پیکربندی HAProxy شما، بخش گلوبال واقع شده است که با کلمه “global” در یک خط جداگانه شناخته میشود. تنظیمات زیر گلوبال، تنظیمات امنیت و بهینهسازی عملکرد سیستم را که تأثیر مستقیمی بر HAProxy در سطح پایین دارند، تعریف میکنند.
global
maxconn 50000
log /dev/log local0
user haproxy
group haproxy
stats socket /run/haproxy/admin.sock user haproxy group haproxy mode 660 level admin
ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
ببینیم چگونه هر یک از این دستورات کار میکنند.
maxconn : تنظیمات maxconn تعداد حداکثر اتصالاتی را که HAProxy میپذیرد محدود میکند. با استفاده از این دستور از اتمام حافظه جلوگیری میشود.
log : تنظیمات log اطمینان میدهد که هشدارهایی که در زمان راهاندازی صادر میشوند و مشکلاتی که در زمان اجرا پیش میآیند، در سیستم syslog ثبت شوند. همچنین درخواستها را در زمان ورود ثبت میکند.
میتوانید سوکت UNIX سنتی سیستم Syslog یا journald، گوش کننده /dev/log، راهاندازی کنید یا یک سرور rsyslog از راه دور را مشخص کنید تا دادههای لاگ به صورت خارجی از سرور توازن بار شما نگه داشته شوند.
یک امکان Syslog فعال کنید که معمولاً local0 نام دارد و یک امکان برای استفاده شخصی تعریف شده است. توجه داشته باشید که برای خواندن لاگها، باید هر یک از دیمونهای syslog یا journald را پیکربندی کنید تا آنها را در یک فایل بنویسند.
user / group : خطوط user و group به HAProxy میگویند که پس از راه اندازی ابتدایی، امتیازات امنیتی خود را از دست بدهد. لینوکس نیازمند این است که فرآیندها برای گوش دادن به پورتهای زیر 1024، در سطح امنیتی ریشه یا روت باشند.
همچنین به طور معمول، میخواهید که کلیدهای خصوصی TLS شما نیز تنها توسط روت قابل خواندن باشند.
بدون تعریف یک کاربر و گروه برای ادامه فرآیند، HAProxy امتیازات ریشه را حفظ خواهد کرد که یک عمل نادرست است. توجه داشته باشید که HAProxy خود کاربر و گروه را ایجاد نمیکند و بنابراین آنها باید به موقع ایجاد شوند.
stats socket : خطوط stats socket API Runtime را فعال میکند که شما میتوانید از آن برای غیرفعال کردن سرورهای پویا و چکهای سلامتی، تغییر وزنهای توازن بار سرورها و کشیدن دیگر دستههای مفید استفاده نمایید.
ssl-default-bind-ciphers : تنظیمات ssl-default-bind-ciphers فهرستی از رمزگذاریهای SSL و TLS را که هر دستور بایند به صورت پیشفرض از آن استفاده میکند، ارائه میدهد.
میتوانید با افزودن پارامتر ciphers دستور بایند، این تنظیم را با یک تنظیم خاصتر جایگزین کنید.
HAProxy اولین مورد را که مشتری نیز پشتیبانی میکند، انتخاب خواهد کرد، مگر اینکه گزینه prefer-client-ciphers فعال شده باشد.
ssl-default-bind-options : تنظیمات ssl-default-bind-optionsگزینههای SSL/TLS مانند ssl-min-ver را پیکربندی میکند تا پشتیبانی از پروتکلهای قدیمیتر را غیرفعال کند.
به عنوان مثال، ممکن است بخواهید تنها اتصالاتی را قبول کنید که از نسخهی 1.2 یا جدیدتر TLS استفاده میکنند.
2. پیشفرضها (Defaults) :
هر چقدر پیکربندی شما بزرگتر شود، استفاده از بخش پیشفرضها به کاهش تکرار کمک میکند.
تنظیمات آن برای تمام بخشهای frontend و backend که پس از آن میآیند، اعمال میشود. شما هنوز هم آزادید که این تنظیمات را در داخل بخشهایی که بعد از آن میآیند، تغییر دهید.
شما همچنین محدودیتی در تعداد پیشفرضها ندارید. بخشهای پیشفرضی که بعد از آن میآیند، تمامی پیشفرضهای قبلی را نادیده میگیرند و همه گزینهها را به مقادیر پیشفرض باز میگردانند.
بنابراین، ممکن است تصمیم بگیرید یک بخش پیشفرض تنظیم کنید که شامل تمام تنظیمات TCP شما باشد و سپس بخشهای frontend و backend فقط برای TCP را بعد از آن قرار دهید. سپس، تمام تنظیمات HTTP خود را در یک بخش پیشفرض دیگر قرار داده و بعد از آن بخشهای frontend و backend مربوط به HTTP را قرار دهید.
این مثال را در نظر بگیرید:
defaults
timeout connect 10s
timeout client 30s
timeout server 30s
log global
mode http
option httplog
maxconn 3000
بیایید در مورد معنای هر یک از این دستورات بیشتر دقت کنیم.
timeout connect / timeout client / timeout server : تنظیم timeout connect زمانی را که HAProxy برای برقراری اتصال TCP به سرور backend انتظار میدهد، پیکربندی میکند. پسوند “s” به ثانیه اشاره دارد.
بدون هیچ پسوندی، زمان به میلیثانیه در نظر گرفته میشود. تنظیم timeout client در دورههایی که انتظار میرود مشتری صحبت کند یا به عبارت دیگر TCP segments را ارسال کند، بیفعالیت را اندازهگیری میکند. تنظیم timeout server در دورههایی که انتظار میرود سرور backend صحبت کند، بیفعالیت را اندازهگیری میکند. زمانی که یک timeout منقضی میشود، اتصال بسته میشود. داشتن timeout مناسب، ریسک فرآیندهای متوقفشده را کاهش میدهد، که ممکن است اتصالات را که در غیر این صورت میتوانستند مجدداً استفاده شوند، محدود کنند.
در حالت عملی HAProxy در حالت TCP عمل میکند، که با mode tcp تنظیم میشود، timeout server باید با timeout client یکسان باشد.
این به دلیل این است که HAProxy نمیداند کدام طرف باید صحبت کند و چون هر دو همیشه اعمال میشوند، داشتن مقادیر مختلف احتمال ایجاد ابهام را بیشتر میکند.
log global : تنظیم log global یک روش برای اطلاع دادن به هر frontend بعدی استفاده از تنظیم logی است که در بخش global تعریف کردهاید. این برای لاگ گذاری لازم نیست، زیرا میتوانید خطوط لاگ جدید را در اینجا یا در هر frontend اضافه کنید. با این حال، در اکثر موارد که فقط یک سرور syslog استفاده میشود، این امر معمولی است.
mode : تنظیم mode تعیین میکند که HAProxy به عنوان یک پراکسی ساده TCP عمل کند یا آیا میتواند پیامهای بالاتر HTTP ورودی را بررسی کند. جایگزینی برای مشخص کردن mode http، استفاده از mode tcp است که در سطح سریعتر اما کمتر آگاه عمل میکند. اگر اکثر بخشهای frontend و backend شما از همان mode استفاده کنند، منطقی است که آن را در بخش defaults مشخص کنید تا از تکرار جلوگیری شود.
maxconn : تنظیم maxconn تعداد اتصالاتی را که هر frontend قبول میکند محدود میکند و به طور پیشفرض به 2000 تنظیم شده است. اگر میخواهید اتصالات بیشتری را اجازه دهید، میتوانید آن را افزایش دهید تا به حداکثر maxconn سراسری شما برسد. از سوی دیگر، ممکن است بخواهید از یک عدد استفاده کنید که هر frontend به اندازه منصفانهای از اتصالات سراسری استفاده کند.
option httplog : تنظیم option httplog یا به ندرت option tcplog به HAProxy میگوید که از یک فرمت لاگ جزئیتر زمان ارسال پیامها به Syslog استفاده کند. به طور کلی، احتمالاً option httplog را در بخش defaults ترجیح خواهید داد، زیرا هنگامی که HAProxy با یک frontend روبرو میشود که از mode tcp استفاده میکند، هشدار میدهد و آن را به option tcplog کاهش میدهد.
اگر هیچکدام مشخص نشود، سپس فرمت لاگ connect استفاده میشود که جزئیات بسیار کمی را به جز آدرسها و پورتهای IP مشتری و backend دارد. گزینهای دیگر این است که یک فرمت لاگ سفارشی با تنظیم log-format تعریف کنید، در این صورت option httplog و option tcplog لازم نیستند.
3. Frontend :
بطور خلاصه، Frontend در HAProxy به عنوان بخش مربوط به تنظیمات دریافت درخواستهای ورودی، عمل میکند. این درخواستها میتوانند از طریق پورتهای مختلف و با استفاده از پروتکلهای مختلفی به HAProxy برسند. مفاهیم اصلی مرتبط با تنظیمات Frontend عبارتند از:
1. Bind: در این بخش، شما مشخص میکنید که HAProxy بر روی کدام آدرس IP و پورت گوش کند. برای مثال، میتوانید آدرس IP سرور خود و پورت 80 را برای گوش دادن به ترافیک HTTP تعیین کنید.
2. Mode: با استفاده از این تنظیم، شما پروتکل مورد استفاده را مشخص میکنید. HAProxy از پروتکلهای HTTP و TCP برای ترافیک وب استفاده میکند. به عنوان مثال، با تنظیم mode http، HAProxy برای دریافت درخواستهای HTTP پیکربندی میشود.
3. ACL (Access Control List): از ACL برای تعریف شرایط و قوانین برای مدیریت ترافیک و توزیع آن استفاده میشود. شما میتوانید ACLها را بر اساس معیارهای مختلفی مانند آدرس IP، پروتکل، روش درخواست و… تعریف کنید. با استفاده از ACLها، میتوانید مسیریابی ترافیک را به Backendهای مختلف بر اساس قوانین مشخص کنید.
4. Use Backend: در این بخش، مشخص میکنید که درخواستهایی که شرایط ACL مورد نظر را برآورده میکنند، به کدام Backend باید ارسال شوند. این Backend ممکن است شامل یک یا چند سرور وب باشد که درخواستها به آنها توزیع میشود.
با استفاده از این تنظیمات Frontend، شما میتوانید دریافت کننده درخواستهای ورودی باشید، ترافیک را مدیریت کنید و آن را به Backendهای مختلف توزیع کنید. همچنین میتوانید قوانین مشخصی را برای مسیریابی ترافیک و اعمال سیاستهای امنیتی تعریف کنید. در زیر یک مثال از تنظیمات یک Frontend در HAProxy آورده شده است:
frontend http_front
bind *:80
mode http
option forwardfor
acl acl_example
path_beg /example
use_backend example_backend if acl_example
default_backend default_backend
در این مثال، یک Frontend با نام http_front تعریف شده است. توضیحات برخی از تنظیمات این Frontend عبارتند از:
- bind *:80: این تنظیم بیانگر این است که Frontend روی همه آدرسهای IP و پورت 80 تنظیم شود.
- mode http: با تنظیم این مورد به http، به HAProxy گفته میشود که برای ارتباط با سرورهای پشتیبان از پروتکل HTTP استفاده کند.
- option forwardfor: با تنظیم این گزینه، HAProxy اطلاعات آدرس IP مشتری اصلی را در هدرهای HTTP ارسال میکند.
- acl acl_example path_beg /example: این ACL یک شرط بر اساس مسیر درخواست اعمال میکند. در اینجا، درخواستهایی که با /example شروع میشوند، با این ACL مطابقت میکنند.
- use_backend example_backend if acl_example: با استفاده از این تنظیم، اگر درخواست با شرط ACL مطابقت داشته باشد، HAProxy از Backend با نام example_backend استفاده میکند.
- default_backend default_backend: این تنظیم بیانگر این است که اگر هیچ یک از شرایط ACL مطابقت نکنند، HAProxy از Backend با نام default_backend استفاده میکند.
در این مثال، هر درخواستی که با /example شروع میشود، به Backend example_backend هدایت میشود. سایر درخواستها به Backend default_backend هدایت میشوند. شما میتوانید تنظیمات Frontend را بر اساس نیازهای خود تغییر دهید.
4. Backend :
Backend در HAProxy به معنای سرورهای وب یا منابع پشتیبان است که توسط HAProxy برای ارسال درخواستهای کاربران استفاده میشود. Backend مسئول پاسخ دادن به درخواستها است و میتواند شامل یک یا چند سرور باشد.
مفاهیم اصلی مرتبط با تنظیمات Backend عبارتند از:
1. Server: در این بخش، شما مشخص میکنید که Backend شامل چه سرورهای وبی است. شما باید آدرس IP و پورت سرورها را مشخص کنید. همچنین میتوانید ویژگیهای دیگری مانند وزن (weight) و فعال بودن یا غیرفعال بودن سرورها را تعیین کنید.
2. Balancing Algorithm: این تنظیم مربوط به الگوریتم توزیع بار بین سرورها است. شما میتوانید الگوریتمهایی مانند round-robin، leastconn، source و غیره را انتخاب کنید. این الگوریتمها مشخص میکنند که درخواستها به کدام سرورها ارسال شوند.
مطالعه بیشتر : الگوریتم های توزیع بار
3. Haproxy Health Check: از Health Check برای بررسی وضعیت سرورها استفاده میکند. با تعیین یک آدرس و پورت برای Health Check، HAProxy میتواند وضعیت سرورها را بررسی کند و در صورتی که یک سرور غیرفعال شود، به سرور دیگری هدایت کند.
4. Session Persistence: در صورت نیاز به حفظ وضعیت سشن کاربران، شما میتوانید Session Persistence را تنظیم کنید. این تنظیم به HAProxy میگوید که چگونه درخواستهای یک کاربر را به یک سرور خاص توجیه کند تا وضعیت سشن حفظ شود.
با استفاده از این تنظیمات Backend، شما میتوانید سرورهای وب را به صورت موثر توزیع کنید، بار ترافیک را مدیریت کنید، ویژگیهای امنیتی را اعمال کنید و کنترل دقیقی بر روی فرآیند ارسال درخواستها داشته باشید. در ادامه یک مثال از تنظیمات یک Backend در HAProxy آورده شده است:
backend example_backend
balance roundrobin
server server1 192.168.0.101:80 check
server server2 192.168.0.102:80 check
در این مثال، یک Backend با نام example_backend تعریف شده است. برخی از تنظیمات این Backend عبارتند از:
- balance roundrobin: این دستور بیانگر این است که HAProxy از الگوریتم توزیع بار round-robin برای توزیع درخواستها بین سرورهای پشتیبان استفاده کند. در این الگوریتم، درخواستها به صورت متوالی به هر سرور ارسال میشوند.
مطالعه بیشتر : الگوریتم توزیع بار round-robin
- server server1 192.168.0.101:80 check:این دستور نیز بیانگر این است که یک سرور با نام server1 و آدرس IP:192.168.0.101 و پورت 80 به عنوان سرور پشتیبان در نظر گرفته شده است. check بیانگر این است که HAProxy باید وضعیت سرور را بررسی کند و اطمینان حاصل کند که آن در دسترس است.
- server server2 192.168.0.102:80 check:همانند دستور قبلی، این دستور بیانگر وجود سروری با نام `server2` و آدرس IP:192.168.0.102 و پورت 80 است که به عنوان سرور پشتیبان در نظر گرفته شده است.
در این مثال، درخواستها بین دو سرور پشتیبان (‘server1’ و ‘server2’) با استفاده از الگوریتم توزیع بار round-robin توزیع میشوند. شما میتوانید تنظیمات Backend را بر اساس نیازهای خود تغییر دهید، مانند استفاده از الگوریتمهای توزیع بار دیگر، افزودن سرورهای بیشتر و غیره.
5. ACL (Access Control List) :
ACL (Access Control List) در HAProxy یک دستور قدرتمند برای مدیریت دسترسی و کنترل ترافیک است. این دستور به شما امکان تعریف قوانین و شرایطی را که مشخص میکنند کدام درخواستها به کدام Backend ارسال شوند یا چه اقدامات دیگری انجام شود، را می دهد. در واقع، با استفاده از ACL میتوانید تصمیمگیریهای پیچیدهتری در مورد مسیریابی و توزیع ترافیک انجام دهید.
تعریف ACL میتواند بر اساس معیارهای مختلفی صورت بگیرد، از جمله:
- آدرس IP: قوانینی برای ترافیک مبتنی بر آدرس IP تعریف کنید. برای مثال، میتوانید مجموعهای از آدرسهای IP را محدود کنید و به یک Backend خاص هدایت کنید.
- پروتکل: مشخص کنید کدام درخواستها براساس نوع پروتکل ارسال شده (مانند HTTP یا HTTPS) به Backend مناسب هدایت شوند.
- روش درخواست: میتوانید درخواستها را بر اساس روش درخواست (GET، POST، PUT و غیره) جدا کنید و به Backendهای مختلف هدایت کنید.
- مسیر (URL): مسیرهای (URLs) مشخصی را بر اساس الگویی (مانند `/api/*`) تعریف کنید و به Backendهای مربوطه هدایت کنید.
- هدر درخواست: میتوانید بر اساس مقادیر هدر درخواست، مثلاً User-Agent یا Referer، قوانینی را تعریف کنید و به Backendهای مختلف هدایت کنید.
- متغیرهای دلخواه: متغیرهای دلخواه خود را تعریف کنید و بر اساس آنها قوانینی را تعیین کنید. به عنوان مثال، میتوانید بر اساس نوع دستگاه (مانند موبایل یا دسکتاپ) به Backendهای مختلف هدایت کنید.
در هر ACL، شما میتوانید یک یا چند شرط را تعریف کنید و سپس به آن شرایط عملکرد خاصی نسبت دهید، از جمله هدایت به یک Backend، عدم هدایت و نادیده گرفتن درخواست، تغییر هدر درخواست و غیره. استفاده از ACL در HAProxy به شما امکان میدهد سیاستهای پیچیدهتری را برای مسیریابی و مدیریت ترافیک اعمال کنید و کنترل دقیقتری را بر روی درخواستها داشته باشید.
البته کد ACL بستگی به نیازها و متغیرهای مختلف دارد. اما در ادامه چند مثال از دستورات ACL در HAProxy آورده شده است:
1- آدرس IP:
acl is_internal src 192.168.1.0/24
2- بر اساس نوع درخواست (GET یا POST):
acl is_get_method method GET
acl is_post_method method POST
3- بر اساس هدرهای HTTP:
acl is_mobile hdr_reg(User-Agent) -i mobile
4- بر اساس URL:
acl is_secure_url path_beg /secure
5- بر اساس مقدار هدر خاص:
acl is_api_request hdr(X-Requested-With) -i XMLHttpRequest
6- بر اساس پورت مبدا:
acl is_secure_port src_port 443
7- بر اساس روشن بودن SSL (HTTPS):
acl is_https ssl_fc
8- بر اساس نوع محتوا (Content-Type):
acl is_json_req hdr_sub(Content-Type) application/json
9- بر اساس زمان:
acl is_office_hours time MTWHF 08:00-17:00
10- بر اساس مقدار cookie:
acl is_admin_cookie hdr_sub(cookie) admin=true
6. SSL Offloading:
SSL Offloading به معنای حذف بار SSL است و به روشی اشاره دارد که در آن پردازش ترافیک SSL/TLS از HAProxy جدا شده و به سرورهای پشتیبان انتقال داده میشود. HAProxy با استفاده از SSL Offloading، وظیفه بررسی و رمزگشایی ترافیک SSL را بر عهده دارد و سپس درخواستها را به سرورهای پشتیبان بدون رمزگشایی مجدد ارسال میکند.
توضیحات کامل در مورد SSL Offloading عبارتند از:
- شناسایی ترافیک SSL HAProxy : قادر است ترافیک SSL را شناسایی کند و آن را از ترافیک غیر SSL تمیز کند. برای این کار، HAProxy به پورت SSL گوش میکند (معمولاً پورت 443 برای HTTPS) و پروتکل SSL/TLS را به درستی تجزیه و تحلیل میکند.
- گواهینامه SSL: برای اجرای SSL Offloading، شما باید یک گواهینامه SSL برای HAProxy تنظیم کنید. این گواهینامه برای بررسی صحت گواهینامه مشتریان و برقراری ارتباط امن با آنها استفاده میشود.
- رمزگشایی SSL: با دریافت درخواستهای SSL از مشتریان، HAProxy از گواهینامه SSL برای رمزگشایی ترافیک استفاده میکند. سپس، HAProxy درخواستها را به صورت غیر رمزگشایی شده به سرورهای پشتیبان ارسال میکند.
- عملکرد هدایت: HAProxy مسئول هدایت درخواستها بر اساس آدرسهای IP و پورتهای مقصد در سرورهای پشتیبان است. درخواستهای غیر SSL نیز به سرورهای پشتیبان هدایت میشوند.
- عملکرد توازن بار: SSL Offloading همچنین قابلیت توزیع بار بین سرورهای پشتیبان را دارد. HAProxy میتواند بر اساس الگوریتمهای توزیع باری مانند round-robin، leastconn و… درخواستها را بین سرورهای پشتیبان تقسیم کند.
با استفاده از SSL Offloading، میتوانید بار SSL/TLS را از سرورهای پشتیبان برداشته و عملکرد سرورها را بهبود بخشید. همچنین، میتوانید قابلیتهای امنیتی اضافی را از جمله بررسی صحت گواهینامه، رمزنگاری و اعتبارسنجی مشتری را اعمال کنید.
# تعریف یک فرانتاند با استفاده از پروتکل HTTPS
frontend web_frontend
bind *:443 ssl crt /etc/haproxy/certs/example.com.pem
# تعریف ارتباط ssl در قسمت بکند
backend backend_servers
mode http
balance roundrobin
# تنظیمات SSL برای ارتباط با سرورهای پشتیبان
server web_server_1 192.168.1.1:443 check ssl verify none
server web_server_2 192.168.1.2:443 check ssl verify none
7. Logging :
Logging در HAProxy به معنای ثبت و ذخیره رویدادها و اطلاعات مربوط به عملکرد HAProxy است. با استفاده از قابلیت Logging، میتوانید رویدادهای مهمی مانند درخواستها، وضعیت سرورها، خطاها و غیره را ثبت کرده و از این اطلاعات بسیار مفید برای پیگیری، تحلیل و مانیتورینگ عملکرد سیستم میکنند.
توضیحات کامل در مورد Logging عبارتند از:
- نوع Log: انواع مختلفی از Log را پشتیبانی میکند، از جمله Logهای متنی، Syslog، TCP، UDP و غیره. شما میتوانید نوع Log را بر اساس نیازهای خود انتخاب کنید.
- فرمت Log: شما میتوانید فرمت Log را برای ثبت اطلاعات دلخواه تنظیم کنید. HAProxy فرمتهای استانداردی مانند CLF (Common Log Format)، Custom Format و… را پشتیبانی میکند. همچنین، شما میتوانید الگوهای سفارشی برای ثبت اطلاعات خاص تعریف نمایید.
- سطح Log: انواع سطوح Log را پشتیبانی کرده، از جمله سطوح زیر: emergency، alert، critical، error، warning، notice، info و debug. با تعیین سطح Log مورد نظر، میتوانید میزان جزئیات و دقت در ثبت اطلاعات را تعیین نمایید.
- متغیرهای Log: از متغیرهای مختلفی برای استفاده در فرمت Log پشتیبانی میشود. به عنوان مثال، میتوانید از متغیرهایی مانند client IP، server IP، زمان، روش درخواست و… برای ثبت اطلاعات دلخواه بکار ببرید.
- مقصد Log: شما میتوانید تصمیم بگیرید که Logها را به کجا ارسال کنید. HAProxy اجازه میدهد تا Logها را به یک فایل محلی، سرویس Syslog، سرور Log مرکزی و یا هر مقصد دیگری که انتخاب کردهاید، ارسال نمایید.
استفاده از Logging در HAProxy به شما امکان میدهد عملکرد سیستم را پیگیری کرده، خطاها را تشخیص داده، مانیتورینگ نموده و تصمیمگیریهای بهتری در مورد بهینهسازی و مدیریت ترافیک اتخاذ نمایید.
مطالعه بیشتر : آدرس ip چیست و چگونه کار میکند؟
# تنظیمات log برای HTTP
global
log /dev/log local0
log /dev/log local1 notice
8- مانیتورینگ:
قسمت “stat” یا “Statistics” در HAProxy به شما امکان مانیتورینگ و مشاهده آمار و اطلاعات مربوط به عملکرد لود بالانسر را میدهد. این بخش از HAProxy به صورت یک واسط وبی قابل دسترسی ارائه شده است که میتوانید اطلاعاتی نظیر تعداد درخواستها، زمان پاسخ، وضعیت سرورها، و دیگر مقادیر مرتبط را بررسی کنید. این اطلاعات میتواند در مدیریت و بهینهسازی عملکرد سیستم لود بالانسر و سرورهای پشتیبان مفید باشد.
برخی از اطلاعات و عملکردهای قابل دسترس در بخش stat عبارتند از:
-
تعداد کل درخواستها (Total Requests): تعداد کل درخواستهایی که توسط لود بالانسر پردازش شده است.
-
تعداد درخواستهای فعال (Active Requests): تعداد درخواستهایی که در حال حاضر در حال پردازش توسط سرورهای پشتیبان هستند.
-
وضعیت سرورها (Server Status): وضعیت هر یک از سرورهای پشتیبان، اعم از فعال، غیرفعال یا در وضعیت نگهداری.
-
آمارهای مربوط به لایه 7 (Layer 7 Stats): اطلاعات جزئیتر مانند تعداد درخواستها بر اساس URL، زمان پاسخ، و غیره.
-
تعداد کانکشنها (Connections): تعداد کل اتصالات برقرار شده با لود بالانسر.
-
آمارهای مربوط به توازن بار (Balancer Stats): اطلاعات مرتبط با توازن بار اعم از تعداد توزیعهای انجام شده بر اساس سرورها.
برای دسترسی به صفحه آمار و اطلاعات مربوط به “stat”، شما باید تنظیمات مربوط به آن را در فایل تنظیمات HAProxy خود فعال کنید و یک رابط وبی مطابق نیازهای شما مشخص کنید. برای مثال:
listen stats
bind :9000
mode http
stats enable
stats uri /stats
stats realm Haproxy\ Statistics
stats auth username:password
در این تنظیمات، شما به لود بالانسر اجازه دادهاید که یک رابط وب را روی پورت 9000 با مسیر /stats
فعال کند و برای دسترسی به این صفحه، احراز هویت (Authentication) با نام کاربری و رمز عبور موردنیاز است.
پیشنهاد مطالعه : DNS چیست؟ راهنمای جامع DNS برای کاربران
یک نمونه از فایل کانفیگ کامل HAProxy:
در پایان یک نمونه از فایل کانفیگ آورده شده که تنظیمات پایه ای هستند البته که این تنظیمات تمامی تنظیمات موجود نیستند. HAProxy دارای تنظیمات پیشرفتهتری نیز مانند حفاظت از DDoS، تنظیمات SSL، کنترل دسترسی و مدیریت دسترسی به API است.
برای تنظیمات دقیقتر و استفاده از قابلیتهای پیشرفته HAProxy، به مستندات رسمی HAProxy مراجعه کنید.
از دستور زیر میتوانید برای تست کانفیگ خود استفاده کنید.
haproxy -c -f /etc/haproxy/haproxy.cfg
# /etc/haproxy/haproxy.cfg
global
log /var/log/haproxy.log
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http_front
bind *:80
default_backend http_back
backend http_back
balance roundrobin
server webserver1 192.168.0.101:80 check
server webserver2 192.168.0.102:80 check
frontend https_front
bind *:443 ssl crt /etc/haproxy/certs/example.com.pem
default_backend https_back
backend https_back
balance roundrobin
server webserver1 192.168.0.101:443 check ssl verify none
server webserver2 192.168.0.102:443 check ssl verify none
listen stats
bind *:9000
stats enable
stats uri /stats
stats refresh 10s