Enviroment
| Role | IP Address |
|---|---|
| LB | 10.240.35.55 |
| web1 | 10.240.35.56 |
| web2 | 10.240.35.57 |
| web3 | 10.240.35.58 |
Basic Round-Robin
Load-Balancer
upstream backend_pool {
server 10.240.35.56:80;
server 10.240.35.57:80;
server 10.240.35.58:80;
}
server {
listen 80;
server_name www.demo.com;
location / {
proxy_pass http://backend_pool;
}
}
server {
listen 80;
server_name bbs.demo.com;
location / {
proxy_pass http://backend_pool;
}
}
server {
listen 80;
server_name api.demo.com;
location / {
proxy_pass http://backend_pool;
}
}
Backend Nodes
# web1
server {
listen 80;
server_name www.demo.com;
root /var/www/html;
index index.html;
}
# web2
server {
listen 80;
server_name bbs.demo.com;
root /var/bbs/html;
index index.html;
}
# web3
server {
listen 80;
server_name api.demo.com;
root /var/api/html;
index index.html;
}
Weighted Round-Robin
upstream backend_pool {
server 10.240.35.56:80 weight=3;
server 10.240.35.57:80 weight=2;
server 10.240.35.58:80 weight=1;
}
The node with weight=1 receives roughly one-sixth of the trafffic.
Backup Node
upstream backend_pool {
server 10.240.35.56:80;
server 10.240.35.57:80;
server 10.240.35.58:80 backup;
}
Traffic reaches the backup server only when the first two are down.
Health Checks
upstream backend_pool {
server 10.240.35.56:80 max_fails=5 fail_timeout=10s;
server 10.240.35.57:80 max_fails=5 fail_timeout=10s;
server 10.240.35.58:80 max_fails=5 fail_timeout=10s;
}
max_fails: consecutive failures before marking a node as unhealthy.fail_timeout: interval to retry the failed node.
IP Hash (Session Affinity)
upstream backend_pool {
ip_hash;
server 10.240.35.56:80;
server 10.240.35.57:80;
server 10.240.35.58:80;
}
A client IP is consistently routed to the same backend.
Reverse-Proxy Enhancements
Preserve Host Header
Without the directive below, all virtual hosts resolve to the first server block.
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host:$server_port;
}
Forward Real Client IP
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Failover on Errors
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_502 http_503 http_504 http_404;
}
proxy_next_upstream instructs Nginx to retry the request on thenext healthy node when the listed conditiosn occur.