跳到主要内容

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,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 配置,以压缩特定类型的文件。