توزيع الحمل (Load Balancing): كيف تضبطه لسيرفرك

Nginx كـ reverse proxy + upstream servers. توزيع الحمل يضمن أداء مستقر حتى في الذروة. نشرح الإعداد الكامل.
ما هي موازنة الحمل؟
موازنة الحمل (Load Balancing) هي توزيع الطلبات الواردة على عدة سيرفرات بدلاً من سيرفر واحد. الهدف: لا يوجد سيرفر واحد يتحمل كل الضغط، وإذا توقف سيرفر تستمر الخدمة من السيرفرات الأخرى.
متى تحتاج موازنة الحمل؟
- موقعك يستقبل أكثر من 1,000 زيارة متزامنة
- تحتاج توفر عالي (High Availability) بدون انقطاع
- تطبيقك يستهلك موارد عالية ولا يكفيه سيرفر واحد
- تريد صيانة سيرفرات بدون توقف الخدمة
البنية الأساسية
┌──────────────┐
│ العميل │
└──────┬───────┘
│
┌──────▼───────┐
│ Load Balancer │
│ (nginx) │
└──────┬───────┘
│
┌────────────┼────────────┐
│ │ │
┌──────▼──┐ ┌──────▼──┐ ┌──────▼──┐
│ Web 1 │ │ Web 2 │ │ Web 3 │
│10.0.1.10│ │10.0.1.11│ │10.0.1.12│
└─────────┘ └─────────┘ └─────────┘
إعداد موازنة الحمل بـ nginx
تثبيت nginx على سيرفر الموازنة
sudo apt update
sudo apt install nginx -y
الإعداد الأساسي (Round Robin)
# ملف: /etc/nginx/conf.d/load-balancer.conf
upstream backend_servers {
server 10.0.1.10:80;
server 10.0.1.11:80;
server 10.0.1.12:80;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
خوارزميات التوزيع
# 1. Round Robin (افتراضي) — توزيع بالتساوي
upstream backend {
server 10.0.1.10;
server 10.0.1.11;
server 10.0.1.12;
}
# 2. Least Connections — يرسل للسيرفر الأقل اتصالات
upstream backend {
least_conn;
server 10.0.1.10;
server 10.0.1.11;
server 10.0.1.12;
}
# 3. IP Hash — نفس العميل يروح لنفس السيرفر دائماً
upstream backend {
ip_hash;
server 10.0.1.10;
server 10.0.1.11;
server 10.0.1.12;
}
# 4. Weighted — توزيع حسب قوة السيرفر
upstream backend {
server 10.0.1.10 weight=5; # يستقبل 5 طلبات
server 10.0.1.11 weight=3; # يستقبل 3 طلبات
server 10.0.1.12 weight=2; # يستقبل 2 طلبات
}
فحص صحة السيرفرات (Health Checks)
upstream backend_servers {
server 10.0.1.10:80 max_fails=3 fail_timeout=30s;
server 10.0.1.11:80 max_fails=3 fail_timeout=30s;
server 10.0.1.12:80 max_fails=3 fail_timeout=30s;
}
# سيرفر احتياطي — يعمل فقط إذا توقفت جميع السيرفرات الأساسية
upstream backend_servers {
server 10.0.1.10:80;
server 10.0.1.11:80;
server 10.0.1.12:80;
server 10.0.1.99:80 backup;
}
إدارة الجلسات (Session Persistence)
مشكلة شائعة: المستخدم يسجّل الدخول على سيرفر A، والطلب التالي يروح لسيرفر B فيخرج من الجلسة.
الحل 1: IP Hash
upstream backend {
ip_hash;
server 10.0.1.10;
server 10.0.1.11;
}
الحل 2: جلسات مركزية (Redis)
# تثبيت Redis على سيرفر مستقل
sudo apt install redis-server -y
# في تطبيق Laravel — ملف .env
SESSION_DRIVER=redis
REDIS_HOST=10.0.1.50
REDIS_PORT=6379
هذا الحل أفضل — الجلسات مخزنة في مكان واحد يصل له كل السيرفرات.
إضافة SSL
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
المراقبة والتحقق
# التحقق من حالة الإعدادات
sudo nginx -t
# مراقبة الاتصالات
sudo nginx -T | grep upstream
# حالة nginx
curl -s http://localhost/nginx_status
تطبيق عملي على كلاود
مع سيرفرات كلاود (cloud.net.sa)، تقدر تبني بنية موازنة حمل بسرعة. اطلب 3 سيرفرات VPS في الرياض — واحد كموازن حمل واثنين كسيرفرات تطبيق. زمن الاستجابة بين السيرفرات داخل نفس مركز البيانات أقل من 1ms.
ابدأ بسيرفرين وأضف المزيد حسب النمو. كلاود يتيح الترقية في أي وقت بدون إعادة ضبط البنية كاملة.
ابدأ الآن
جاهز تبني بنيتك التحتية؟ اختر خادمك السحابي بالمواصفات اللي تناسبك، أو راجع باقات الاستضافة.


