لماذا تستضيف HAProxy على خادم VPS مخصّص؟
HAProxy (High Availability Proxy) برنامج مفتوح المصدر لموازنة الأحمال وproxy من نوع TCP/HTTP، معروف بأدائه العالي في الإنتاج. تتيح لك استضافته على خادم VPS مخصّص مركزة توزيع حركة المرور بين خوادمك التطبيقية، وضمان استمرارية الخدمة عند تعطّل إحدى العقد، وإدارة قواعد التوجيه بدقّة دون رسوم ترخيص. على خادم VPS بـ 2 vCPU و2 غيغابايت من RAM، يعالج HAProxy آلاف الاتصالات المتزامنة بيُسر.
ما يمكنك فعله بـ HAProxy
- توزيع حركة مرور HTTP/HTTPS بين عدة خوادم تطبيقية بخوارزميات قابلة للتهيئة (roundrobin، leastconn، source…)
- إعداد reverse proxy لعرض عدة خدمات داخلية خلف عنوان IP عام واحد
- مراقبة صحة الخوادم الخلفية بفحوص صحة تلقائية واستبعاد خادم مُعطَّل دون انقطاع الخدمة
- إنهاء اتصالات SSL/TLS في الواجهة الأمامية (offloading) لتخفيف عبء التشفير عن خوادمك التطبيقية
- توجيه حركة المرور حسب النطاق أو المسار بفضل قوائم ACL (host_hdr، path_beg) على المنفذ 443 وحده
- الاطّلاع على إحصاءات حركة المرور في الوقت الفعلي عبر واجهة الويب المدمجة (stats uri /stats)
تثبيت HAProxy وتهيئته على خادم VPS من ServOrbit
اطلب خادم VPS Cloud من ServOrbit وابدأ التثبيت
توجّه إلى صفحة /vps-cloud واختر عرضًا بـ 2 vCPU على الأقل و2 غيغابايت من RAM. افتح Marketplace من لوحة معلومات خادم VPS، وابحث عن «HAProxy»، ثم انقر على «تثبيت». يُجهَّز HAProxy تلقائيًا عبر apt — لا يلزم أي اتصال SSH في هذه المرحلة. يمكن التثبيت اليدوي أيضًا:
sudo apt update && sudo apt install -y haproxyفهم بنية ملف haproxy.cfg
يقع ملف التهيئة الرئيسي في
/etc/haproxy/haproxy.cfg. يتألّف من أربعة أقسام:global(العملية والسجلات وحدود النظام)،defaults(المهلات والأوضاع الموروثة)،frontend(منافذ الاستماع وقواعد ACL)، وbackend(الخوادم الهدف والخوارزمية وفحوص الصحة). حرّره بـ:sudo nano /etc/haproxy/haproxy.cfgتهيئة frontend وbackend كاملَين لـ HTTP/HTTPS
إليك تهيئة كاملة لخادمَين تطبيقيَّين مع إنهاء SSL:
global log /dev/log local0 maxconn 50000 user haproxy group haproxy defaults log global mode http option httplog timeout connect 5s timeout client 30s timeout server 30s frontend http_front bind *:80 redirect scheme https code 301 frontend https_front bind *:443 ssl crt /etc/haproxy/certs/bundle.pem default_backend app_servers backend app_servers balance roundrobin option httpchk GET /health server app1 192.168.1.10:3000 check weight 1 inter 2s fall 3 rise 2 server app2 192.168.1.11:3000 check weight 2 inter 2s fall 3 rise 2يُوجِّه المعامل
weightنسبةً أكبر من حركة المرور إلى app2. يُرسلoption httpchk GET /healthطلب HTTP إلى المسار/healthللتحقّق من استجابة كل backend.تهيئة قوائم ACL للتوجيه حسب النطاق والمسار
تتيح قوائم ACL توجيه حركة المرور إلى backends مختلفة حسب اسم النطاق أو مسار الطلب. أضف في frontend:
frontend https_front bind *:443 ssl crt /etc/haproxy/certs/bundle.pem acl host_api hdr(host) -i api.monsite.com acl host_app hdr(host) -i app.monsite.com acl path_admin path_beg /admin use_backend api_servers if host_api use_backend admin_servers if path_admin use_backend app_servers if host_app default_backend app_serversتفحص
hdr(host)رأسية HTTP Host لتحديد النطاق. تُوجِّهpath_beg /adminكل الطلبات التي يبدأ مسارها بـ/adminإلى backend مخصّص.إنهاء SSL/TLS مع Let's Encrypt وإنشاء bundle PEM
يتوقّع HAProxy ملفًا
.pemيحتوي على الشهادة والسلسلة الوسيطة والمفتاح الخاص بهذا الترتيب. بعد الحصول على شهادتك مع Certbot، أنشئ الحزمة:sudo mkdir -p /etc/haproxy/certs sudo cat /etc/letsencrypt/live/monsite.com/fullchain.pem \ /etc/letsencrypt/live/monsite.com/privkey.pem \ | sudo tee /etc/haproxy/certs/bundle.pem sudo chmod 600 /etc/haproxy/certs/bundle.pemلأتمتة التجديد، أضف سكريبت post-hook في
/etc/letsencrypt/renewal-hooks/post/haproxy.shيُعيد بناء الحزمة ويُشغّلsystemctl reload haproxy.تفعيل صفحة إحصاءات HAProxy
تعرض صفحة الإحصاءات المدمجة حالة كل frontend وbackend وخادم في الوقت الفعلي. أضف كتلة frontend مخصّصة:
frontend stats bind *:8404 stats enable stats uri /stats stats refresh 10s stats auth admin:MotDePasseSecret stats hide-versionادخل إليها على
http://your-ip:8404/stats. يحميstats authالصفحة بمصادقة HTTP Basic. يُخفيstats hide-versionإصدار HAProxy للحدّ من التعرّض للثغرات المنشورة.التحقّق من التهيئة وإعادة التحميل دون انقطاع
قبل أي إعادة تحميل، تحقّق من صحة بناء ملف التهيئة:
sudo haproxy -c -f /etc/haproxy/haproxy.cfgإن عرضت الأمرُ
Configuration file is valid، أعِد تحميل HAProxy دون قطع الاتصالات النشطة:sudo systemctl reload haproxyتأكّد من أن الخدمة نشطة:
sudo systemctl status haproxy. يضمنreload(وليسrestart) إعادةَ تحميل آمنة: تنتهي الاتصالات القائمة بصورة طبيعية قبل توقّف العمّال القدامى.فحص السجلات والمراقبة المستمرة
يُرسل HAProxy سجلاته إلى syslog. اعرضها في الوقت الفعلي:
sudo journalctl -u haproxy -fتُظهر كل سطر الـ frontend والـ backend والخادم المختار ورمز HTTP وأوقات الاتصال — ضروريٌّ لتشخيص مشكلة توجيه أو backend بطيء.
فحوص الصحة المتقدّمة: اكتشاف الخوادم الخلفية المُعطَّلة
يُفعِّل توجيه check على كل سطر server فحوصَ الصحة. يفتح HAProxy اتصال TCP افتراضيًا للتحقّق من استجابة المنفذ. للتعمّق أكثر، يُرسل option httpchk GET /health طلبًا HTTP حقيقيًا وينتظر رمز 2xx. تعني معاملات inter 2s fall 3 rise 2: الفحص كل ثانيتين، إزالة الخادم بعد 3 حالات فشل متتالية، إعادة إدماجه بعد نجاحين. تضمن هذه التهيئة إقصاء backend مُعطَّل من المجمّع في 6 ثوانٍ بالحد الأقصى. أضف option redispatch ليُعيد HAProxy محاولة الطلبات الفاشلة على خادم آخر في المجمّع.
خوارزميات موازنة الأحمال: أيّها تختار؟
مرّر الجدول أفقيًا
| الخوارزمية | السلوك | الأنسب لـ |
|---|---|---|
| roundrobin | يوزّع الطلبات دوريًا بين الخوادم. يدعم المعامل weight لضبط التوزيع. | الـ backends ذات القدرات المتكافئة |
| leastconn | يُرسل كل طلب جديد إلى الخادم ذي أقل عدد من الاتصالات النشطة. | الاتصالات الطويلة (WebSocket، قاعدة البيانات) |
| source | يُجزِّئ عنوان IP المصدر لثبات الجلسة دون cookie. | الجلسات التي لا يمكن مشاركتها بين الـ backends |
| uri | يُجزِّئ URI الطلب للتوجيه دائمًا إلى الـ backend ذاته. | ذاكرات التخزين المؤقت حيث تُهمّ موضعية البيانات |
استكشاف الأخطاء وإصلاحها: الأخطاء الشائعة والحلول
إليك أكثر خمسة أخطاء شيوعًا عند تهيئة HAProxy أو إعادة تحميله، مع سببها وخطوات إصلاحها.
الأخطاء الشائعة وطرق حلّها
[ALERT] Starting frontend http_front: cannot bind socket [0.0.0.0:80]— المنفذ 80 يستخدمه عملية أخرى (nginx، apache2). حدّدها بـsudo ss -tlnp | grep ':80'، وأوقف الخدمة المنافسة (sudo systemctl stop nginx)، ثم أعِد تحميل HAProxy.[WARNING] Server app_servers/app1 is DOWN, reason: Layer4 connection problem— لا يستطيع HAProxy الوصول إلى عنوان IP أو منفذ الـ backend. تحقّق من أن الخادم التطبيقي يعمل، وأن جداره الناري يسمح بالاتصالات من IP خادم VPS لـ HAProxy، وأن العنوان فيhaproxy.cfgصحيح.[ALERT] parsing [/etc/haproxy/haproxy.cfg:42] : unknown keyword 'serveur'— خطأ في بناء جملة ملف التهيئة. يُشير الأمرhaproxy -c -f /etc/haproxy/haproxy.cfgإلى رقم السطر بالضبط. كلمات HAProxy المفتاحية بالإنجليزية:server،frontend،backend. تحقّق أيضًا من المسافات البادئة (HAProxy يقبل المسافات فقط).[ALERT] ssl library has no cert for frontend https_frontأو certificate expired — ملف bundle.pem غائب أو فارغ أو يحتوي شهادة منتهية. أعِد بناء الحزمة من ملفات Let's Encrypt المحدَّثة (fullchain.pem+privkey.pem) ثم أعِد التحميل.- صفحة الإحصاءات تُعيد HTTP 403 — تهيئة
stats authموجودة لكن بيانات الاعتماد لم تُرسَل، أو عنوان IP المصدر ليس في قائمةstats allow-from. تحقّق من العنوان (/statsافتراضيًا) وبيانات الاعتماد، وأضف مؤقتًاstats allow-from 0.0.0.0/0للتشخيص.
نصيحة: بعد كل تعديل على haproxy.cfg، شغّل دائمًا sudo haproxy -c -f /etc/haproxy/haproxy.cfg قبل systemctl reload. يستغرق هذا التحقّق من الصحة أقل من ثانية ويمنع أي انقطاع في الخدمة إن كان الملف يحتوي خطأً.
للتعمّق أكثر
تُفصِّل الوثائق الرسمية لـ HAProxy جميع التوجيهات وخيارات TCP المتقدّمة ودعم QUIC/HTTP3 (HAProxy 2.6+) وتهيئة التوافر العالي مع Keepalived لتبادل الملكية على IP افتراضي بين نسختَي HAProxy. يغطّي هذا الدليل النشر على خادم VPS من ServOrbit؛ وتبقى وثائق الناشر المرجع للضبط الدقيق.