كيفية إعداد HAProxy كموازن حمل لـ Nginx على CentOS 8

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

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، فهذا يعني أن خادم الويب المثبت على جهاز العميل يعمل بشكل صحيح.

Test Nginx Installation on All CentOS 8 Client Machines

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
Verify HAProxy Status in CentOS 8

٨. الآن سنقوم بتكوين HAProxy باستخدام ملف التكوين التالي.

# vi /etc/haproxy/haproxy.cfg

يتم تقسيم ملف التكوين إلى أربعة أقسام رئيسية.

  • الإعدادات العامة – تعيين معلمات على مستوى العملية.
  • الافتراضيات – يقوم هذا القسم بتعيين معلمات افتراضية لجميع الأقسام الأخرى التي تتبع إعلانها.
  • الواجهة الأمامية – يصف هذا القسم مجموعة من مقابس الاستماع التي تقبل اتصالات العميل.
  • الخلفية – يصف هذا القسم مجموعة من الخوادم التي سيتصل البروكسي بها لتوجيه الاتصالات الواردة.

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

إعداد تسجيل HAProxy

٩. عندما يتم نشر HAProxy مرة واحدة، ستلعب دورًا هامًا في بنية البنية التحتية لتكنولوجيا المعلومات الخاصة بك، وبالتالي تكوين تسجيل لها هو متطلب أساسي؛ وهذا يسمح لك بالحصول على رؤى حول كل اتصال إلى خوادم الويب الخلفية الخاصة بك.

معامل السجل (الموضح في لقطة الشاشة التالية) يعلن عن خادم Syslog عالمي (مثل rsyslog الافتراضي في CentOS) الذي سيتلقى رسائل السجل. يمكن الإعلان عن أكثر من خادم هنا.

التكوين الافتراضي يشير إلى localhost (127.0.0.1) و local2 هو رمز المرفق الافتراضي المستخدم لتحديد رسائل سجل HAProxy تحت rsyslog.

HAProxy Default Log Parameter

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

قم بتعليق أي أقسام أمامية وخلفية أخرى كما هو موضح في اللقطة المصورة التالية. احفظ الملف وأغلقه.

Configuring HAProxy Front-end and Back-ends

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/
Check HAProxy Setup

19. للوصول إلى صفحة الإحصائيات HAProxy، استخدم العنوان التالي.

http://10.42.0.247:9000/stats

ثم استخدم اسم المستخدم وكلمة المرور التي قمت بتحديدها في ملف تكوين HAProxy (راجع معلمة الاعتمادين الإحصائية).

HAProxy Stats Login Page

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

لتوضيح كيفية عمل تقرير الحالة بالألوان، قمنا بوضع أحد خوادم الخلفية.

HAProxy Statistics Report

الخطوة ٤: تكوين 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
Create SSL for HAProxy

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
Configure HAProxy Front-end with SSL

احفظ الملف وأغلقه.

22. ثم أعد تشغيل خدمة HAProxy لتطبيق التغييرات الجديدة.

# systemctl restart haproxy.service

23. بعد ذلك، افتح متصفح الويب وحاول الوصول إلى الموقع مرة أخرى. سيظهر المتصفح خطأ بسبب الشهادة الموقعة ذاتياً، انقر فوق متقدم للمتابعة.

HAProxy SSL Connection Error
Proceed with Connection
Access Site Over HTTPS

هذا كل شيء الآن! كل تطبيق ويب له مجموعة خاصة من المتطلبات، تحتاج إلى تصميم وتكوين توازن الحمل ليناسب بنية تكنولوجيا المعلومات ومتطلبات التطبيق الخاصة بك.

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

Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/