اگر Nginx از قبل جلوی سایت است، برای توزیع بار ساده نیازی به HAProxy نیست.
۱. تعریف upstream
sudo nano /etc/nginx/conf.d/app-upstream.confupstream 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: فقط وقتی همهی سرورهای اصلی از دسترس خارج شوند، استفاده میشود.
۲. سایت
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 است.
۴. اعمال و آزمایش
sudo nginx -t && sudo systemctl reload nginx
for i in $(seq 6); do curl -s http://app.example.ir/hostname; done