一、反向代理与负载均衡的基本概念
1. 反向代理(Reverse Proxy)
- 定义:客户端发送请求到反向代理服务器,代理服务器根据规则将请求转发到后端真实服务器,并将响应返回给客户端。
- 核心作用:
- 隐藏后端服务器地址,增强安全性;
- 缓存静态资源,减轻后端压力;
- 实现请求转发、协议转换(如HTTP转HTTPS)。
2. 负载均衡(Load Balancing)
- 定义:将客户端请求均匀分配到多个后端服务器,避免单台服务器过载。
- 核心作用:
- 提升系统可用性和吞吐量;
- 实现高并发场景下的流量分发;
- 支持服务器动态扩容与故障转移。
二、Nginx反向代理配置与原理
1. 基础反向代理配置示例
server {
listen 80;
server_name example.com;
location / {
# 反向代理到后端服务器(IP:端口)
proxy_pass http://192.168.1.100:8080;
# 优化请求头(传递客户端真实IP等信息)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
2. 反向代理核心参数解析
proxy_pass:指定后端服务器地址(可配置为IP、域名或负载均衡组名);
proxy_set_header:修改请求头,解决跨域、获取客户端真实IP等问题;
proxy_buffer_size:设置缓冲区大小,优化大文件传输性能;
proxy_connect_timeout:连接后端服务器的超时时间(默认60秒)。
三、Nginx负载均衡实现方式
1. 负载均衡配置示例
# 定义负载均衡组(upstream)
upstream backend_servers {
# 轮询方式(默认策略)
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
# 权重配置(weight越大,分配请求越多)
# server 192.168.1.104:8080 weight=2;
# 服务器状态标记
# down:标记服务器不可用
# backup:备用服务器,主服务器均故障时启用
}
# 反向代理关联负载均衡组
server {
location / {
proxy_pass http://backend_servers;
}
}
2. 负载均衡策略(调度算法)
| 策略 | 原理 | 适用场景 |
|---|
| 轮询(默认) | 按顺序依次分配请求,简单公平。 | 服务器配置相同的场景。 |
| 权重轮询 | 为服务器设置权重(weight),权重越高分配请求越多。 | 服务器性能差异明显的场景。 |
| IP哈希 | 根据客户端IP地址计算哈希值,相同IP固定转发到同一服务器(保证会话一致性)。 | 需要保持会话状态的场景(如登录)。 |
| 最少连接 | 将请求转发给当前连接数最少的服务器。 | 长连接场景(如WebSocket)。 |
四、高可用与健康检查机制
1. 服务器状态检测(健康检查)
upstream backend_servers {
server 192.168.1.101:8080 max_fails=2 fail_timeout=10s;
server 192.168.1.102:8080;
}
max_fails:允许失败次数,超过则标记服务器不可用;
fail_timeout:服务器不可用的持续时间,到期后重新检测。
2. 高可用架构(主从模式)
- Nginx 主从部署:
- 主服务器处理请求,从服务器实时同步配置;
- 主服务器故障时,通过Keepalived等工具切换到从服务器(需配置虚拟IP)。
五、问题
1. 问:反向代理与正向代理的区别?
- 答:
- 正向代理:客户端配置代理服务器,代理服务器代替客户端访问目标服务器(如科学上网);
- 反向代理:服务器端配置代理,客户端无需感知,代理根据规则转发请求到后端服务器(如Nginx);
- 核心差异:正向代理代理客户端,反向代理代理服务器。
2. 问:Nginx负载均衡如何实现会话保持?
- 答:
- IP哈希策略:通过
ip_hash指令实现,相同IP的请求固定转发到同一服务器;
- Cookie会话保持:通过
proxy_cookie_path结合后端Session机制,将Session ID写入Cookie;
- 注意:IP哈希可能因客户端IP变更(如NAT环境)导致会话丢失,需结合业务场景选择。
3. 问:Nginx作为反向代理时,如何优化高并发性能?
- 答:
- 连接数优化:
worker_connections:每个worker进程的最大连接数(建议设置为10240);
worker_processes:工作进程数(建议设置为CPU核心数)。
- 缓存优化:
- 配置
proxy_cache缓存静态资源,减少后端请求;
- 启用
gzip压缩(见前文Webpack Gzip部分)。
- 异步非阻塞模型:Nginx基于事件驱动的异步架构,天然适合高并发场景。
4. 问:Nginx与LVS、HAProxy的区别?
- 答:
- Nginx:七层负载均衡(基于HTTP/HTTPS协议),支持内容缓存、反向代理,适合Web场景;
- LVS:四层负载均衡(基于IP+端口),性能更高(可处理百万级并发),适合TCP服务;
- HAProxy:四层/七层负载均衡,支持更多健康检查策略,适合复杂场景(如混合TCP/HTTP服务)。
六、生产环境优化实践
1. 动静分离
- 静态资源(图片、CSS、JS)直接由Nginx处理,动态请求转发到后端服务器:
location /static/ {
root /data/web; # 静态资源根目录
expires 7d; # 缓存7天
}
2. HTTPS与HTTP/2支持
server {
listen 443 ssl http2;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
}
3. 限流与防攻击
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
location / {
limit_req zone=one burst=20 nodelay;
}