nginx反向代理和负载均衡

146 阅读1分钟

一、反向代理与负载均衡的基本概念

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支持

  • 配置SSL证书实现HTTPS加密:
server {
    listen 443 ssl http2;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
}

3. 限流与防攻击

  • 配置limit_req模块限制请求频率:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
location / {
    limit_req zone=one burst=20 nodelay;
}