Nginx 负载均衡配置
负载均衡简介
负载均衡是分布式系统中常用的一种技术,通过将客户端请求分配到多台服务器上,提高系统的并发处理能力和可靠性。Nginx 作为高性能的反向代理服务器,内置了多种负载均衡策略,能够高效地管理和分配流量。笔者在实际项目中使用 Nginx 进行负载均衡,发现其配置简便且性能卓越,极大地提升了系统的稳定性和响应速度。
Nginx 负载均衡基本配置
定义上游服务器
在 Nginx 配置中,首先需要定义上游服务器组,这些服务器将处理来自客户端的请求。上游服务器可以使用域名或 IP 地址,并且可以指定端口号。
http {
upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
server backend3.example.com:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}
在上述配置中,backend
是上游服务器组的名称,包含了三台后端服务器。proxy_pass
指令将客户端请求转发到这个服务器组。
负载均衡算法
Nginx 支持多种负载均衡算法,常见的包括轮询(Round Robin)、最少连接(Least Connections)和 IP 哈希(IP Hash)。
轮询(Round Robin)
轮询是 Nginx 的默认负载均衡算法,它按顺序将请求依次分配给上游服务器。
upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
server backend3.example.com:8080;
}
无需额外配置,Nginx 会自动使用轮询算法。
最少连接(Least Connections)
最少连接算法将请求分配给当前连接数最少的服务器,适用于处理时间不均衡的请求。
upstream backend {
least_conn;
server backend1.example.com:8080;
server backend2.example.com:8080;
server backend3.example.com:8080;
}
通过在upstream
块中添加least_conn
指令,启用最少连接算法。
IP 哈希(IP Hash)
IP 哈希算法根据客户端的 IP 地址将请求分配给固定的服务器,有助于实现会话保持。
upstream backend {
ip_hash;
server backend1.example.com:8080;
server backend2.example.com:8080;
server backend3.example.com:8080;
}
添加ip_hash
指令后,相同 IP 的请求将始终分配给同一台服务器。
健康检查
为了确保请求只被分配到健康的后端服务器,Nginx 可以配置健康检查功能。通过定期检查服务器的健康状态,自动将故障服务器从负载均衡池中移除。
http {
upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
server backend3.example.com:8080;
keepalive 32;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
}
}
在此配置中,proxy_next_upstream
指令指定了在遇到错误时,Nginx 应将请求转发到下一个可用的服务器。对于更高级的健康检查,可以使用第三方模块如ngx_http_healthcheck_module
。
会话保持
有些应用需要确保同一用户的请求总是由同一台服务器处理,这称为会话保持。Nginx 通过 IP 哈希或 Cookie 实现会话保持。
使用 IP 哈希实现会话保持
如前所述,配置ip_hash
即可实现基于 IP 的会话保持。
upstream backend {
ip_hash;
server backend1.example.com:8080;
server backend2.example.com:8080;
server backend3.example.com:8080;
}
使用 Cookie 实现会话保持
通过设置 Cookie,Nginx 可以将请求绑定到特定的服务器。
upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
server backend3.example.com:8080;
sticky cookie srv_id expires=1h path=/;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
在此配置中,sticky
指令使用名为srv_id
的 Cookie 来保持会话。
SSL 负载均衡
在处理 HTTPS 请求时,Nginx 可以作为 SSL 终端,将 SSL 连接终止在 Nginx 层,然后将解密后的请求转发到后端服务器。
http {
upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
server backend3.example.com:8080;
}
server {
listen 443 ssl;
server_name secure.example.com;
ssl_certificate /etc/ssl/certs/example.crt;
ssl_certificate_key /etc/ssl/private/example.key;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
确保 SSL 证书和私钥路径正确,并且配置了必要的 SSL 参数以保证安全性。
性能优化
启用缓存
通过在 Nginx 中配置缓存,可以减少后端服务器的负载,提高响应速度。
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
server backend3.example.com:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_cache my_cache;
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
配置proxy_cache_path
指定缓存目录和相关参数,proxy_cache
指令启用缓存功能。
启用 Gzip 压缩
启用 Gzip 压缩可以减少传输的数据量,提高加载速度。
http {
gzip on;
gzip_types text/plain application/json application/javascript text/css;
gzip_min_length 256;
}
在http
块中添加 Gzip 配置,以压缩特定类型的文件。