پرش به محتوا

توزیع بار با Nginx (upstream)

Nginx را جلوی چند سرور برنامه قرار دهید؛ روش‌های توزیع بار، کنار گذاشتن خودکار سرور خراب و نگه داشتن نشست کاربر روی یک سرور.

Debian 13سطح: متوسطبرای: Debian 13، Debian 12به‌روزرسانی: ۱۶ آبان ۱۴۰۵

اگر Nginx از قبل جلوی سایت است، برای توزیع بار ساده نیازی به HAProxy نیست.

۱. تعریف upstream

bash
sudo nano /etc/nginx/conf.d/app-upstream.conf
nginx
upstream app_backend {
    least_conn;
    server 192.168.10.11:8080 max_fails=3 fail_timeout=15s;
    server 192.168.10.12:8080 max_fails=3 fail_timeout=15s;
    server 192.168.10.13:8080 backup;
    keepalive 32;
}
  • least_conn: درخواست به سروری می‌رود که کمترین اتصال فعال را دارد.
  • max_fails و fail_timeout: پس از ۳ خطا، سرور به مدت ۱۵ ثانیه کنار گذاشته می‌شود.
  • backup: فقط وقتی همه‌ی سرورهای اصلی از دسترس خارج شوند، استفاده می‌شود.

۲. سایت

nginx
server {
    listen 80;
    server_name app.example.ir;

    location / {
        proxy_pass http://app_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_next_upstream error timeout http_502 http_503;
    }
}

proxy_next_upstream درخواستی را که با خطا مواجه شده، به سرور بعدی می‌فرستد.

۳. نشست چسبنده

اگر برنامه نشست کاربر را در حافظه‌ی همان سرور نگه می‌دارد، least_conn را با ip_hash جایگزین کنید تا هر کاربر همیشه به یک سرور برود. راه‌حل بهتر بلندمدت، نگه داشتن نشست‌ها در Redis است.

۴. اعمال و آزمایش

bash
sudo nginx -t && sudo systemctl reload nginx
for i in $(seq 6); do curl -s http://app.example.ir/hostname; done