# lb.conf — nginx làm Load Balancer cho Traffic Lab (Bài 3). # # Đọc kèm Bài 3 mục 3.2 (L4 vs L7) và 3.3 (thuật toán phân phối). # Đây là cấu hình L7: nginx đọc HTTP nên định tuyến được theo path, thêm header, # và ghi log biết request đã đi tới upstream nào. upstream app_pool { # ---- Thuật toán phân phối ---- # Mặc định của nginx là round robin (không cần khai báo gì). # Bỏ dấu # ở dòng dưới để đổi sang least connections rồi ĐO LẠI: # với request có thời gian xử lý lệch nhau nhiều, least_conn thường cho p99 tốt hơn # dù biểu đồ "số request mỗi node" trông kém cân bằng hơn (Bài 3, cạm bẫy mục 3.3). # least_conn; # ip_hash; # sticky theo IP — xem cái giá của nó ở mục 3.5 server app1:3000 max_fails=2 fail_timeout=5s; server app2:3000 max_fails=2 fail_timeout=5s; server app3:3000 max_fails=2 fail_timeout=5s; # Kết nối bền tới upstream: nếu thiếu, nginx mở TCP mới cho MỖI request tới app, # và phần lớn độ trễ bạn đo được sẽ là chi phí bắt tay TCP nội bộ. keepalive 64; } server { listen 8080; server_name _; # Log có thêm upstream để tự đếm phân phối: # docker compose logs lb | grep -o 'to=[^ ]*' | sort | uniq -c access_log /var/log/nginx/access.log lbfmt; location / { proxy_pass http://app_pool; proxy_http_version 1.1; proxy_set_header Connection ""; # Chuyển tiếp thông tin client. Bài 4 mục 4.2 nói rõ vì sao KHÔNG được tin # X-Forwarded-For do client tự gửi: ở đây ta GHI ĐÈ nó bằng IP thật của kết nối. proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; # ---- Loại node chết (mục 3.4) ---- # nginx bản mã nguồn mở KHÔNG có health check chủ động (đó là tính năng của # nginx Plus). Cơ chế ở đây là THỤ ĐỘNG: nếu một upstream lỗi `max_fails` lần # trong `fail_timeout` thì nginx tạm loại nó ra. Nghĩa là vài request đầu tiên # sau khi node chết VẪN thất bại — đó chính là số 502 bạn sẽ đếm được. proxy_next_upstream error timeout http_502 http_503 http_504; proxy_next_upstream_tries 3; proxy_connect_timeout 2s; proxy_send_timeout 10s; proxy_read_timeout 10s; } # Trạng thái của chính nginx (số kết nối) — dùng khi cần biết LB có phải bottleneck. location /nginx-status { stub_status; } }