Implementing High Availability
1. Configuring Nginx Active-Passive
| Directive | Description | Example |
|---|---|---|
| upstream | Defines a group of servers | upstream backend { server 192.168.1.10:80; server 192.168.1.11:80; } |
| server | Defines a server in the upstream group | server 192.168.1.10:80 weight=1; |
| keepalive | Enables persistent connections to upstream servers | keepalive 32; |
Example: Active-Passive Configuration
upstream backend {
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.11:80 max_fails=3 fail_timeout=30s backup;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
2. Implementing Active-Active Setup
| Directive | Description | Example |
|---|---|---|
| upstream | Defines a group of servers | upstream backend { server 192.168.1.10:80; server 192.168.1.11:80; } |
| least_conn | Load balancing based on least connections | upstream backend { least_conn; server 192.168.1.10:80; server 192.168.1.11:80; } |
| ip_hash | Uses client IP to determine server | upstream backend { ip_hash; server 192.168.1.10:80; server 192.168.1.11:80; } |
Example: Active-Active Configuration
upstream backend {
least_conn;
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
3. Using Virtual IP
| Directive | Description | Example |
|---|---|---|
| virtual_server | Defines a virtual server in the upstream group | virtual_server 192.168.1.50:80; |
| ip_hash | Uses client IP to determine server | ip_hash; |
| keepalive | Enables persistent connections to upstream servers | keepalive 32; |
Example: Virtual IP Configuration
upstream backend {
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
}
server {
listen 192.168.1.50:80;
location / {
proxy_pass http://backend;
}
}
4. Configuring Health Check Scripts
| Directive | Description | Example |
|---|---|---|
| health_check | Enables health checks for upstream servers | health_check interval=30s fails=2 passes=1; |
| interval | Interval between health checks | health_check interval=30s; |
| fails | Number of failed checks before marking server as down | health_check fails=2; |
Example: Health Check Configuration
upstream backend {
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
health_check interval=30s fails=2 passes=1;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
5. Implementing Session Persistence
| Directive | Description | Example |
|---|---|---|
| ip_hash | Uses client IP to determine server | ip_hash; |
| sticky_cookie | Uses cookie to maintain session | sticky_cookie srv_id expires=1h; |
| keepalive | Enables persistent connections to upstream servers | keepalive 32; |
Example: Session Persistence Configuration
upstream backend {
ip_hash;
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
6. Using DNS Round Robin
| Directive | Description | Example |
|---|---|---|
| resolver | Defines DNS resolver for resolving hostnames | resolver 8.8.8.8; |
| resolver_timeout | Timeout for DNS resolution | resolver_timeout 5s; |
| upstream | Defines a group of servers | upstream backend { server example.com; } |
Example: DNS Round Robin Configuration
upstream backend {
resolver 8.8.8.8;
server example.com:80 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
7. Configuring Upstream Retry
| Directive | Description | Example |
|---|---|---|
| proxy_next_upstream | Defines conditions under which to retry upstream requests | proxy_next_upstream error timeout invalid_header http_500 http_502; |
| proxy_next_upstream_tries | Number of retries to attempt | proxy_next_upstream_tries 3; |
| proxy_next_upstream_timeout | Timeout for retries | proxy_next_upstream_timeout 10s; |
Example: Upstream Retry Configuration
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout invalid_header http_500 http_502;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
}
}
8. Implementing Circuit Breaker Pattern
| Directive | Description | Example |
|---|---|---|
| max_fails | Number of failed requests before marking server as down | server 192.168.1.10:80 max_fails=3 fail_timeout=30s; |
| fail_timeout | Time to wait before retrying a failed server | server 192.168.1.10:80 max_fails=3 fail_timeout=30s; |
| backup | Marks server as backup for failover | server 192.168.1.11:80 backup; |
Example: Circuit Breaker Configuration
upstream backend {
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.11:80 max_fails=3 fail_timeout=30s backup;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
9. Using Zone Sync for Cluster State
| Directive | Description | Example |
|---|---|---|
| zone | Defines a shared memory zone for storing state | zone 128k; |
| shared | Enables shared memory zones | shared zone=backend:128k; |
| keepalive | Enables persistent connections to upstream servers | keepalive 32; |
Example: Zone Sync Configuration
upstream backend {
zone 128k;
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
10. Monitoring Failover Events
| Directive | Description | Example |
|---|---|---|
| error_log | Enables logging of errors and events | error_log /var/log/nginx/error.log; |
| log_format | Defines custom log format | log_format failover '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_addr'; |
| access_log | Enables access logging with custom format | access_log /var/log/nginx/access.log failover; |
Example: Failover Monitoring Configuration
log_format failover '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_addr';
server {
listen 80;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log failover;
location / {
proxy_pass http://backend;
}
}
11. Implementing Graceful Degradation
| Directive | Description | Example |
|---|---|---|
| proxy_next_upstream | Defines conditions under which to retry upstream requests | proxy_next_upstream error timeout invalid_header http_500 http_502; |
| proxy_next_upstream_tries | Number of retries to attempt | proxy_next_upstream_tries 3; |
| proxy_next_upstream_timeout | Timeout for retries | proxy_next_upstream_timeout 10s; |
Example: Graceful Degradation Configuration
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout invalid_header http_500 http_502;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
}
}
12. Configuring Connection Draining
| Directive | Description | Example |
|---|---|---|
| keepalive | Enables persistent connections to upstream servers | keepalive 32; |
| proxy_http_version | Specifies HTTP version to use for proxying | proxy_http_version 1.1; |
| proxy_set_header | Sets custom headers for proxy requests | proxy_set_header Connection ""; proxy_set_header Host $host; |