איזון עומסים עם Nginx ו-HAProxy
פעם פנתה אלינו פרויקט עם חמישה שרתים: בשיא של 3000 RPS, חלק מהבקשות החזירו 503 עקב חלוקה לא אופטימלית. לאחר יישום איזון עומסים עם בדיקות בריאות אקטיביות וחיבור מינימלי (least-connections), העומס התחלק באופן שווה, וזמינות המערכת עלתה ל-99.99%. אנו מגדירים איזון עומסים שמחלק בקשות בין מספר שרתי backend, מבטל נקודות כשל בודדות, ומאפשר קנה מידה ללא הפסקת שירות. במשך יותר מ-5 שנים, השלמנו יותר מ-50 פרויקטים עם תשתית בעומס גבוה, שבהם העומס השיא הגיע ל-30,000 RPS, ואף אחד מהם לא קרס לאחר פריסת איזון העומסים.
אילו בעיות פותר איזון עומסים?
איזון עומסים מטפל בשלוש משימות מרכזיות. ראשית, סובלנות לתקלות: כאשר שרת backend אחד נופל, התעבורה מופנית אוטומטית לאחרים, ומשיגה זמינות של 99.95%. שנית, קנה מידה אופקי: ניתן להוסיף שרתים תוך כדי תנועה ללא צורך בהפעלה מחדש של מאזן העומסים. שלישית, חלוקת עומס אופטימלית: אלגוריתמים כמו least-connections ו-weighted round-robin מפזרים בקשות באופן שווה, ומונעים עומס יתר על צמתים בודדים.
מדוע בדיקות בריאות חשובות וכיצד להגדיר אותן?
ללא בדיקות בריאות, מאזן העומסים ממשיך לשלוח בקשות לשרת שנפל, מה שגורם לשגיאות לחלק מהמשתמשים. בדיקות פסיביות (מובנות ב-Nginx) מוציאות שרת לאחר מספר מסוים של שגיאות בתוך מרווח נתון. בדיקות אקטיביות (HAProxy, Nginx Plus) בודקות את נקודת הקצה /health כל 2–3 שניות ומוציאות מיד שרת בעייתי. בפרויקט עם 10,000 RPS, החלפת בדיקות פסיביות באקטיביות הפחיתה שגיאות 5xx ב-80%.
השוואה בין Nginx ל-HAProxy
| פרמטר | Nginx | HAProxy |
|---|---|---|
| RPS מקסימלי | ~20,000 | ~50,000+ |
| בדיקות בריאות | פסיביות (חינם) / אקטיביות (Plus) | אקטיביות מובנות |
| ACL/ניתוב | מוגבל (location) | ACLs גמישים, use_backend |
| סטטיסטיקות | בסיסיות (stub_status) | מפורטות (stats) |
| סיום SSL | כן (מובנה) | כן (מובנה) |
| סשנים דביקים | ip_hash | cookie insert |
| איזון TCP | מודול stream | כן (mode tcp) |
HAProxy מתמודד עם עד 50,000 RPS—בערך פי 2.5 יותר מ-Nginx במצב איזון. יתרה מזאת, HAProxy מזהה תקלות מהר יותר בזכות בדיקות אקטיביות: לפי התיעוד הרשמי של HAProxy, זמן הזיהוי של שרת שנפל מצטמצם ל-2 שניות.
כיצד לבחור בין Nginx ל-HAProxy?
הבחירה תלויה בעומס ובדרישות נוספות. Nginx מתאים אם אתה צריך שרת אינטרנט ומאזן עומסים באחד, עם עומס של עד 20,000 RPS. HAProxy מיועד לאיזון טהור עם ביצועים גבוהים (עד 50,000+ RPS) ו-ACLs גמישים. בפרויקט אחד, החלפת Nginx ב-HAProxy הפחיתה את זמן ההשהיה ב-20% בזכות בדיקות בריאות מהירות ו-least-connections.
הגדרת איזון עומסים עם Nginx
Nginx הוא כלי רב-תכליתי: הוא עובד גם כשרת אינטרנט וגם כמאזן עומסים. עבור 5–20 שרתי backend, היכולות שלו מספיקות. תצורה בסיסית כוללת בלוק upstream עם keepalive ופרוקסי עם timeouts:
upstream myapp_backend {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
server 10.0.1.12:8080;
keepalive 32;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://myapp_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
proxy_next_upstream error timeout http_502 http_503;
}
}לעומסים גבוהים, אנו משתמשים באלגוריתמים של least-connections או ip-hash (לסשנים דביקים). שרתי גיבוי ובדיקות בריאות פסיביות מוגדרים באמצעות פרמטרים upstream myapp_backend { server 10.0.1.10:8080; server 10.0.1.11:8080; server 10.0.1.12:8080; keepalive 32; } server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location / { proxy_pass http://myapp_backend; proxy_http_version 1.1; proxy_set_header Connection ""; 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; proxy_connect_timeout 5s; proxy_read_timeout 60s; proxy_next_upstream error timeout http_502 http_503; } } ו-max_fails.
הגדרת איזון עומסים עם HAProxy
HAProxy הוא מאזן עומסים ייעודי לעומסים מ-10,000 RPS. הוא מציע ACLs גמישים, סטטיסטיקות מפורטות, ובדיקות בריאות אקטיביות. דוגמת תצורה ליישום אינטרנט ו-API:
global
maxconn 100000
nbthread 4
stats socket /run/haproxy/admin.sock mode 660 level admin
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 60s
frontend http_front
bind *:80
bind *:443 ssl crt /etc/haproxy/certs/example.com.pem alpn h2,http/1.1
acl is_api path_beg /api/
use_backend api_backend if is_api
default_backend web_backend
backend web_backend
balance leastconn
option httpchk GET /health
cookie SERVERID insert indirect nocache
server web01 10.0.1.10:8080 check inter 3s rise 2 fall 3 cookie web01
server web02 10.0.1.11:8080 check inter 3s rise 2 fall 3 cookie web02
backend api_backend
balance roundrobin
server api01 10.0.2.10:3000 check inter 2s
server api02 10.0.2.11:3000 check inter 2s
HAProxy תומך בסיום SSL (שילוב אישור ומפתח לקובץ PEM יחיד), איזון TCP למסדי נתונים ו-WebSocket, וסטטיסטיקות מובנות על פורט 8404.
כיצד להגדיר זמינות גבוהה עם Keepalived?
כדי למנוע ממאזן העומסים עצמו להפוך לנקודת כשל בודדת, אנו מגדירים זוג Keepalived עם VIP צף. כאשר המאזן הראשי נופל, המאזן המשני מקבל את ה-IP תוך שניות, ומבטיח זמינות של 99.99%. התצורה כוללת מופע VRRP עם מרווח פרסום של שנייה אחת ומעקב אחר תהליך HAProxy.
מה כלול בהתקנה?
- ביקורת על הארכיטקטורה הנוכחית: שרתים, יישומים, רוחב פס.
- תכנון תוכנית האיזון: בחירת אלגוריתם, בדיקות בריאות, סיום SSL.
- הגדרת upstream ושרתי גיבוי.
- פיתוח סקריפטים לעדכונים דינמיים של backend (אם נדרש).
- בדיקות עומס עד 100,000 RPS.
- תיעוד תפעולי והוראות לצוות התמיכה.
- אחריות ל-3 חודשים על פעילות רציפה של מאזן העומסים.
תהליך ולוחות זמנים
| שלב | משך |
|---|---|
| ביקורת ותכנון | 1–2 ימים |
| Nginx + SSL | 1–2 ימים |
| HAProxy + ACLs + סטטיסטיקות | 2–3 ימים |
| Keepalived | +יום אחד |
| עדכונים דינמיים | +1–2 ימים |
| בדיקות ותיעוד | 1–2 ימים |
המחזור המלא אורך בין 3 ל-6 ימי עבודה, תלוי במורכבות.
טעויות נפוצות בתצורה
| טעות | השלכות | פתרון |
|---|---|---|
| אין בדיקות בריאות | תעבורה לשרת מת, שגיאות 5xx | הגדר בדיקות אקטיביות |
| timeouts קטנים מדי (<30 שניות) | timeouts בבקשות ארוכות | הגדל proxy_read_timeout ל-60–120 שניות |
| תצורת סשנים דביקים שגויה | סשנים קופצים בין שרתים | הפעל cookie insert עם פרמטר מתאים |
החיסכון בתשתית השרתים לאחר יישום איזון עומסים מגיע עד 40%, וזמן ההשבתה יורד ב-95%. קבל ייעוץ ממהנדס איזון עומסים—אנו ננתח את הארכיטקטורה שלך ונבחר את הפתרון האופטימלי. צור קשר להערכת הפרויקט שלך.
דוגמת סקריפט לעדכון דינמי של upstream עבור Nginx
import subprocess
import boto3
def update_nginx_upstream():
ec2 = boto3.client('ec2', region_name='eu-west-1')
response = ec2.describe_instances(Filters=[
{'Name': 'tag:Role', 'Values': ['app']},
{'Name': 'instance-state-name', 'Values': ['running']},
])
ips = [i['PrivateIpAddress'] for r in response['Reservations'] for i in r['Instances']]
config = "upstream myapp_backend {\n" + "\n".join(f" server {ip}:8080;" for ip in ips) + "\n keepalive 32;\n}\n"
with open('/etc/nginx/conf.d/upstream.conf', 'w') as f:
f.write(config)
subprocess.run(['nginx', '-t'], check=True)
subprocess.run(['nginx', '-s', 'reload'], check=True)אנו מבטיחים זמינות של 99.99% ומספקים תמיכה לאחר הפריסה. המהנדסים שלנו מחזיקים בהסמכות Nginx ו-HAProxy. בקש ייעוץ כבר עכשיו.







