لضمان توفير أقصى قدر من توفر تطبيق الويب وتوسيعه وأدائه العالي، أصبح من الشائع الآن تنفيذ التقنيات التي تقدم التكرار، مثل تجميع الخوادم وتوازن الحمل. على سبيل المثال، إعداد مجموعة من الخوادم التي تعمل جميعها على نفس التطبيقات، ثم نشر موزعات الحمل أمامها لتوزيع حركة المرور.
HAProxy هو موزع حمل مفتوح المصدر وقوي وذو أداء عالي وموثوق به وآمن ومستخدم على نطاق واسع لتوفير التوافر العالي للـ TCP/HTTP وخادم الوكيل وإنهاء SSL/TLS المبني لمواقع الويب عالية الحركة جدًا. يعمل بشكل موثوق على أنظمة التشغيل Linux و Solaris و FreeBSD و OpenBSD وأيضًا أنظمة التشغيل AIX.
يوضح هذا الدليل كيفية إعداد موزع حمل مخصص للتوافر العالي مع HAProxy على CentOS 8 للتحكم في حركة المرور في مجموعة من خوادم الويب NGINX. كما يوضح كيفية تكوين إنهاء SSL/TLS في HAProxy.
الشروط المسبقة:
A total of 4 servers with minimal CentOS 8 installation.
إعداد بيئة الاختبار
----------- HAProxy Server Setup ----------- HA Proxy Server - hostname: haproxy-server.tecmint.lan; IP: 10.42.0.247 Test Site Domain: www.tecmint.lan ----------- Client Web Servers Setup ----------- Web Server #1 - hostname: websrv1.tecmint.lan; IP: 10.42.0.200 Web Server #2 - hostname: websrv2.tecmint.lan; IP: 10.42.0.21 Web Server #3 - hostname: websrv3.tecmint.lan; IP: 10.42.0.34
الخطوة 1: إعداد خادم Nginx HTTP على آلات العميل
1. تسجيل الدخول إلى جميع آلات العميل CentOS 8 الخاصة بك وتثبيت خادم الويب Nginx باستخدام مدير الحزم dnf كما هو موضح.
# dnf install Nginx
2. بعد ذلك، ابدأ خدمة Nginx، وللوقت الحالي، قم بتمكينها لتبدأ تلقائيًا عند بدء تشغيل النظام وتأكد من أنها تعمل وذلك بفحص حالتها، باستخدام أوامر systemctl (قم بذلك على جميع أجهزة العميل).
# systemctl start nginx # systemctl enable nginx # systemctl status nginx
3. أيضًا، إذا كانت خدمة firewalld تعمل على جميع أجهزة العميل (والتي يمكنك التحقق منها بتشغيل systemctl start firewalld)، يجب عليك إضافة خدمات HTTP وHTTPS في تكوين جدار الحماية للسماح بمرور الطلبات من موازن الحمل عبر جدار الحماية إلى خوادم الويب Nginx. ثم أعد تحميل خدمة firewalld لتطبيق التغييرات الجديدة (قم بذلك على جميع أجهزة العميل).
# firewall-cmd --zone=public --permanent --add-service=http # firewall-cmd --zone=public --permanent --add-service=https # firewall-cmd --reload
4. بعد ذلك، افتح متصفح ويب على أجهزتك المحلية واختبر ما إذا كانت تثبيت Nginx يعمل بشكل جيد. استخدم عناوين IP للعميل للتنقل، وبمجرد أن ترى صفحة اختبار Nginx، فهذا يعني أن خادم الويب المثبت على جهاز العميل يعمل بشكل صحيح.

5. بعد ذلك، نحتاج إلى إنشاء صفحات اختبار على أجهزة العميل التي سنستخدمها لاحقًا لاختبار إعداد HAProxy.
----------- Web Server #1 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv1.tecmint.lan"> /usr/share/nginx/html/index.html ----------- Web Server #2 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv2.tecmint.lan"> /usr/share/nginx/html/index.html ----------- Web Server #3 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv3.tecmint.lan"> /usr/share/nginx/html/index.html
الخطوة 2: تثبيت وتكوين خادم HAProxy على CentOS 8
٦. قم الآن بتثبيت حزمة HAProxy على خادم HAProxy عن طريق تشغيل الأمر التالي.
# dnf install haproxy
٧. بعد ذلك، قم بتشغيل خدمة HAProxy، وتمكينها للبدء التلقائي عند تشغيل النظام، والتحقق من حالتها.
# systemctl start haproxy # systemctl enable haproxy # systemctl status haproxy

٨. الآن سنقوم بتكوين HAProxy باستخدام ملف التكوين التالي.
# vi /etc/haproxy/haproxy.cfg
يتم تقسيم ملف التكوين إلى أربعة أقسام رئيسية.
- الإعدادات العامة – تعيين معلمات على مستوى العملية.
- الافتراضيات – يقوم هذا القسم بتعيين معلمات افتراضية لجميع الأقسام الأخرى التي تتبع إعلانها.
- الواجهة الأمامية – يصف هذا القسم مجموعة من مقابس الاستماع التي تقبل اتصالات العميل.
- الخلفية – يصف هذا القسم مجموعة من الخوادم التي سيتصل البروكسي بها لتوجيه الاتصالات الواردة.
لفهم الخيارات تحت الإعدادات العامة و الافتراضيات، اقرأ وثائق HAProxy (الرابط المقدم في نهاية المقال). لهذا الدليل، سنستخدم القيم الافتراضية.
إعداد تسجيل HAProxy
٩. عندما يتم نشر HAProxy مرة واحدة، ستلعب دورًا هامًا في بنية البنية التحتية لتكنولوجيا المعلومات الخاصة بك، وبالتالي تكوين تسجيل لها هو متطلب أساسي؛ وهذا يسمح لك بالحصول على رؤى حول كل اتصال إلى خوادم الويب الخلفية الخاصة بك.
معامل السجل (الموضح في لقطة الشاشة التالية) يعلن عن خادم Syslog عالمي (مثل rsyslog الافتراضي في CentOS) الذي سيتلقى رسائل السجل. يمكن الإعلان عن أكثر من خادم هنا.
التكوين الافتراضي يشير إلى localhost (127.0.0.1) و local2 هو رمز المرفق الافتراضي المستخدم لتحديد رسائل سجل HAProxy تحت rsyslog.

10. بعد ذلك، تحتاج إلى إخبار خادم rsyslog كيفية استقبال ومعالجة رسائل سجل HAProxy. افتح ملف تكوين rsyslog في /etc/rsyslog.conf أو أنشئ ملفًا جديدًا داخل دليل /etc/rsyslog.d، على سبيل المثال /etc/rsyslog.d/haproxy.conf.
# vi /etc/rsyslog.d/haproxy.conf
انسخ والصق التكوين التالي لجمع السجل باستخدام UDP على المنفذ الافتراضي 514.
$ModLoad imudp $UDPServerAddress 127.0.0.1 $UDPServerRun 514
أضف أيضًا هذه الأسطر لتوجيه rsyslog للكتابة إلى ملفين منفصلين للسجل بناءً على الخطورة، حيث local2 هو رمز المرفق المحدد في تكوين HAProxy أعلاه.
local2.* /var/log/haproxy-traffic.log local2.notice /var/log/haproxy-admin.log
11. احفظ الملف وأغلقه. ثم أعد تشغيل خدمة rsyslog لتطبيق التغييرات الأخيرة.
# systemctl restart rsyslog
تكوين واجهات وخلفيات HAProxy
١٢. في هذا القسم، سنقوم بشرح كيفية تكوين الوكيلين الأمامي والخلفي. عد إلى ملف تكوين HAProxy وقم بتعديل الأقسام الأمامية والخلفية الافتراضية على النحو التالي. لن ندخل في شرح مفصل لكل معلمة، يمكنك دائمًا الرجوع إلى التوثيق الرسمي.
التكوين التالي يعرف قسمًا listen يستخدم لتقديم صفحة إحصاءات HAProxy. المعلمة bind تعين مستمعًا لعنوان IP معين (*
للجميع في هذه الحالة) والمنفذ (9000).
إعداد الإحصائيات enable يمكن الصفحة الإحصائية التي ستتم الوصول إليها باستخدام URI /stats (أي http://server_ip:9000/stats
).
إعداد auth للإحصائيات يُستخدم لإضافة مصادقة أساسية عند الوصول إلى الصفحة (استبدل haproxy و Lostp@1ss باسم مستخدم وكلمة مرور اختيارك).
listen stats bind *:9000 stats enable stats hide-version stats uri /stats stats admin if LOCALHOST stats auth haproxy:Lostp@1ss
١٣. التكوين التالي يعرف قسمًا أماميًا يُسمى TL (يمكنك إعطاء اسم يليق بك). المعلمة mode تحدد وضعية تشغيل HAProxy.
يُستخدم مُعامِل قائمة التحكم في الوصول (ACL) لاتخاذ قرار بناءً على المحتوى المُستخرج من الطلب. في هذا المثال، يُعتبر الطلب HTTP عاديًا إذا لم يتم إجراؤه عبر SSL.
ثم يُستخدم إعداد http-request set-header لإضافة رأس HTTP إلى الطلب. هذا يساعد على إعلام Nginx بأن الطلب الأولي تم عبر HTTP (أو عبر المنفذ 80).
تُعرّف التوجيهات default_backend أو use_backend خوادم الخلفية، وفي هذه الحالة، يُشار إليها بـ TL_web_servers.
لاحظ أن HAProxy سيُعيد خطأ “خدمة غير متوفرة 503” إذا لم يتم توجيه طلب بواسطة توجيه use_backend أو default_backend.
frontend TL bind *:80 mode http acl http ssl_fc,not http-request set-header X-Forwarded-Protocol http if http default_backend TL_web_servers
14. ثم نحتاج إلى تعريف قسم الخلفية حيث يُعرّف إعداد balance كيف يختار HAProxy خوادم الخلفية لمعالجة طلب إذا لم يتجاوز أي طريقة استمرارية هذا الاختيار.
تُمكّن التوجيهة cookie الاستمرارية المبنية على الكوكيز، حيث تُعلِم HAProxy بإرسال كوكي باسم SERVERID إلى العميل وربطه بـ ID الخادم الذي قدم الاستجابة الأولية.
التوجيه الخادم يستخدم لتحديد خوادم الوصول في التنسيق اسم_الخادم (على سبيل المثال websrv1)، عنوان_IP_الخادم:المنفذ و الخيارات.
أحد الخيارات الرئيسية هو check الذي يخبر HAProxy بالاستمرار في التحقق من توافر خادم وتقديم تقرير على صفحة الإحصائيات.
backend TL_web_servers mode http balance roundrobin option httpchk HEAD / cookie SERVERUID insert indirect nocache server websrv1 10.42.0.200:80 cookie websrv1 check server websrv2 10.42.0.21:80 cookie websrv2 check server websrv3 10.42.0.34:80 cookie websrv3 check
قم بتعليق أي أقسام أمامية وخلفية أخرى كما هو موضح في اللقطة المصورة التالية. احفظ الملف وأغلقه.

15. الآن أعد تشغيل خدمة HAProxy لتطبيق التغييرات الجديدة.
# systemctl restart haproxy
16. بعد ذلك، تأكد من فتح خدمات HTTP (المنفذ 80) و HTTPS (المنفذ 433) في جدار الحماية لقبول طلبات العميل على النحو التالي. كما، قم بفتح المنفذ 9000 في جدار الحماية للوصول إلى صفحة الإحصائيات وإعادة تحميل إعدادات جدار الحماية.
# firewall-cmd --zone=public --permanent --add-service=http # firewall-cmd --zone=public --permanent –add-service=https # firewall-cmd --zone=public --permanent --add-port=9000/tcp # firewall-cmd --reload
الخطوة 3: اختبار إعداد HAProxy وعرض الإحصائيات
17. الآن حان الوقت لاختبار إعداد HAPrxoy. على سطح المكتب المحلي حيث تقوم بالوصول إلى جميع الخوادم منه، أضف السطر التالي في ملف /etc/hosts لتمكيننا من استخدام نطاق الموقع الوهمي.
10.42.0.247 www.tecmint.lan
18. ثم افتح متصفحًا وانتقل باستخدام إما عنوان الخادم أو نطاق الموقع.
http://10.42.0.247/ OR http://www.tecmint.lan/

19. للوصول إلى صفحة الإحصائيات HAProxy، استخدم العنوان التالي.
http://10.42.0.247:9000/stats
ثم استخدم اسم المستخدم وكلمة المرور التي قمت بتحديدها في ملف تكوين HAProxy (راجع معلمة الاعتمادين الإحصائية).

بعد تسجيل الدخول الناجح، ستهبط على صفحة إحصائيات HAProxy التي تعرض لك المقاييس التي تغطي صحة خوادمك، معدلات الطلب الحالية، أوقات الاستجابة، وأكثر من ذلك بكثير.
لتوضيح كيفية عمل تقرير الحالة بالألوان، قمنا بوضع أحد خوادم الخلفية.

الخطوة ٤: تكوين HTTPS في HAProxy باستخدام شهادة SSL موقعة ذاتياً
20. في هذا القسم النهائي، سنقوم بتوضيح كيفية تكوين SSL/TLS لتأمين جميع التواصلات بين خادم HAProxy والعميل. يدعم HAProxy أربعة أوضاع رئيسية لتكوين HTTPS، ولكن لهذا الدليل، سنستخدم نمط إلغاء SSL/TLS.
في وضع إلغاء SSL/TLS، يقوم HAProxy بفك تشفير حركة المرور على الجانب الخاص بالعميل ويتصل بحركة مرور واضحة بالخوادم الخلفية.
سنبدأ بإنشاء الشهادة والمفتاح كما هو موضح (أجب على الأسئلة وفقًا لتفاصيل شركتك أثناء إنشاء الشهادة، كما هو موضح في اللقطة المصورة).
# mkdir /etc/ssl/tecmint.lan # cd /etc/ssl/tecmint.lan/ # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/tecmint.lan.key -out /etc/ssl/tecmint.lan.crt # cd /etc/ssl/tecmint.lan/ # cat tecmint.crt tecmint.key >tecmint.pem # ls -l

21. بعد ذلك، افتح ملف تكوين HAProxy (/etc/haproxy/haproxy.cfg) وقم بتحرير القسم الأمامي.
frontend TL bind *:80 bind *:443 ssl crt /etc/ssl/tecmint.lan/tecmint.pem redirect scheme https if !{ ssl_fc } mode http acl http ssl_fc,not acl https ssl_fc http-request set-header X-Forwarded-Protocol http if http http-request set-header X-Forwarded-Protocol https if https default_backend TL_web_servers

احفظ الملف وأغلقه.
22. ثم أعد تشغيل خدمة HAProxy لتطبيق التغييرات الجديدة.
# systemctl restart haproxy.service
23. بعد ذلك، افتح متصفح الويب وحاول الوصول إلى الموقع مرة أخرى. سيظهر المتصفح خطأ بسبب الشهادة الموقعة ذاتياً، انقر فوق متقدم للمتابعة.



هذا كل شيء الآن! كل تطبيق ويب له مجموعة خاصة من المتطلبات، تحتاج إلى تصميم وتكوين توازن الحمل ليناسب بنية تكنولوجيا المعلومات ومتطلبات التطبيق الخاصة بك.
للحصول على مزيد من الرؤى حول بعض خيارات التكوين المستخدمة في هذا الدليل، وبشكل عام كيفية استخدام HAProxy، راجع الوثائق الرسمية لإصدار مجتمع HAProxy أو وثائق إصدار HAProxy المؤسسي. يمكنك نشر أي أسئلة أو أفكار من خلال نموذج التعليقات أدناه.
Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/