Nginx作为高性能的反向代理服务器,可以实现HTTP、HTTPS、TCP和UDP等多种协议的负载均衡,将客户端请求分发到多个后端服务器,提高系统吞吐量和可用性。
Nginx支持多种负载均衡算法: - 轮询(round-robin):默认算法,按顺序分配请求 - 加权轮询(weighted round-robin):考虑服务器权重 - 最少连接(least_conn):优先分配给当前连接数最少的服务器 - IP哈希(ip_hash):基于客户端IP的哈希值分配,保持会话 - 通用哈希(hash):基于任意关键字(如URL、参数)的哈希分配 - 随机(random):随机选择服务器,可带权重
http {
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
server backend3.example.com max_fails=3 fail_timeout=30s;
server backup1.example.com backup;
}
server {
location / {
proxy_pass http://backend;
}
}
}
Nginx Plus提供主动健康检查,开源版可通过第三方模块或被动检查实现:
upstream backend {
server backend1.example.com;
server backend2.example.com;
# 被动健康检查参数
max_fails=3; # 最大失败次数
fail_timeout=10s; # 失败后暂停时间
}
对于需要会话保持的应用:
upstream backend {
ip_hash; # 基于IP的会话保持
server backend1.example.com;
server backend2.example.com;
}
或使用sticky cookie:
upstream backend {
sticky cookie srv_id expires=1h domain=.example.com path=/;
server backend1.example.com;
server backend2.example.com;
}
结合服务发现工具实现动态配置:
upstream backend {
zone backend 64k;
server backend1.example.com resolve;
server backend2.example.com resolve;
}
使用Keepalived实现主备切换:
示例Keepalived配置(/etc/keepalived/keepalived.conf
):
vrrp_script chk_nginx {
script "pidof nginx"
interval 2
weight 2
}
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 101
virtual_ipaddress {
192.168.1.100
}
track_script {
chk_nginx
}
}
配置多个A记录实现DNS级别的负载均衡和高可用:
example.com. IN A 192.168.1.101
example.com. IN A 192.168.1.102
example.com. IN A 192.168.1.103
客户端 → CDN → 防火墙 → Nginx负载均衡集群 → 应用服务器集群 → 数据库集群
↘ 静态资源服务器
全局负载均衡(DNS/GSLB)
↓
区域负载均衡(Nginx)
↓
本地负载均衡(Nginx/Haproxy)
↓
应用服务器集群
使用Kubernetes部署Nginx Ingress Controller:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /service1
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- path: /service2
pathType: Prefix
backend:
service:
name: service2
port:
number: 80
配置Nginx日志格式并集中分析:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log main;
worker_processes auto;
use epoll;
(Linux)worker_connections 1024;
keepalive_timeout 65;
gzip on;
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server_tokens off;
通过以上方案的综合应用,可以构建出高性能、高可用的Nginx负载均衡系统,满足企业级应用的需求。