当前位置:首页 > 学习笔记 > 正文内容

Nginx 反向代理与负载均衡实战完全指南

廖万里15小时前学习笔记1

Nginx 作为高性能的 HTTP 和反向代理服务器,已成为现代 Web 架构中不可或缺的核心组件。本文将深入讲解 Nginx 反向代理与负载均衡的核心原理、配置技巧和实战应用,助你构建高可用、高性能的 Web 服务架构。

一、核心概念

1.1 什么是反向代理

反向代理(Reverse Proxy)是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

与正向代理不同,正向代理代理的是客户端,而反向代理代理的是服务端。客户端不需要任何配置就可以访问反向代理服务器,反向代理服务器会根据配置将请求转发到后端的真实服务器。

1.2 什么是负载均衡

负载均衡(Load Balancing)是一种将工作任务分摊到多个操作单元上进行执行的技术。在 Web 服务中,负载均衡器将传入的网络流量有效地分发到多个后端服务器上,确保没有任何单个服务器承担过多的负载。

负载均衡的核心价值:

  • 提高可用性:单台服务器故障时,流量自动转发到其他健康服务器
  • 提升性能:请求分散到多台服务器并行处理,响应更快
  • 弹性扩展:可根据负载动态增减服务器数量
  • 安全防护:隐藏后端真实服务器 IP,提供安全隔离

1.3 Nginx 的优势

Nginx 之所以成为反向代理和负载均衡的首选,源于其卓越的性能特性:

  • 高并发处理:采用事件驱动、异步非阻塞架构,单机可支持数万并发连接
  • 低内存消耗:在保持高并发的同时,内存占用极低
  • 配置灵活:丰富的配置选项,支持多种负载均衡策略
  • 功能丰富:支持 SSL/TLS、WebSocket、gRPC、缓存等高级功能
  • 稳定可靠:经过大规模生产环境验证,稳定性极高

二、核心内容

2.1 反向代理基础配置

最简单的反向代理配置如下:

server {
    listen 80;
    server_name example.com;
    
    # 将所有请求转发到后端服务器
    location / {
        proxy_pass http://192.168.1.100:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

关键配置项说明:

  • proxy_pass:指定后端服务器的地址
  • proxy_set_header Host:将原始请求的 Host 头传递给后端
  • X-Real-IP:传递客户端真实 IP 地址
  • X-Forwarded-For:记录请求经过的所有客户端和代理 IP

2.2 负载均衡配置详解

2.2.1 定义上游服务器组

# 定义后端服务器组
upstream backend_servers {
    # 默认使用轮询策略
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}

server {
    listen 80;
    server_name api.example.com;
    
    location / {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

2.2.2 负载均衡策略

1. 轮询(Round Robin) - 默认策略

upstream backend {
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}

2. 加权轮询(Weighted Round Robin)

upstream backend {
    # weight 越大,分配的请求越多
    server 192.168.1.101:8080 weight=5;
    server 192.168.1.102:8080 weight=3;
    server 192.168.1.103:8080 weight=2;
}

3. IP 哈希(IP Hash) - 确保同一客户端始终访问同一服务器

upstream backend {
    ip_hash;
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}

4. 最少连接(Least Connections)

upstream backend {
    least_conn;
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}

5. 一致性哈希(Consistent Hashing)

upstream backend {
    hash $request_uri consistent;
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}

2.3 健康检查配置

upstream backend {
    server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.102:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.103:8080 backup;
}

参数说明:

  • max_fails:在 fail_timeout 时间内最大失败次数
  • fail_timeout:失败时间窗口
  • backup:备用服务器

2.4 高级配置技巧

2.4.1 连接优化

upstream backend {
    server 192.168.1.101:8080;
    keepalive 32;
    keepalive_timeout 60s;
    keepalive_requests 1000;
}

server {
    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

2.4.2 超时控制

location / {
    proxy_pass http://backend;
    proxy_connect_timeout 10s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
}

三、实战案例

案例一:微服务网关配置

upstream user_service {
    least_conn;
    server 192.168.1.101:8001;
    server 192.168.1.102:8001;
    keepalive 16;
}

upstream order_service {
    least_conn;
    server 192.168.1.101:8002;
    server 192.168.1.102:8002;
    keepalive 16;
}

server {
    listen 80;
    server_name api.example.com;
    
    location /api/users {
        proxy_pass http://user_service;
        proxy_set_header Host $host;
    }
    
    location /api/orders {
        proxy_pass http://order_service;
        proxy_set_header Host $host;
    }
}

案例二:HTTPS 配置与 SSL 卸载

server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;
    
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    
    location / {
        proxy_pass http://backend;
    }
}

案例三:WebSocket 代理配置

upstream websocket_backend {
    ip_hash;
    server 192.168.1.101:9000;
    server 192.168.1.102:9000;
}

server {
    listen 80;
    server_name ws.example.com;
    
    location / {
        proxy_pass http://websocket_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 3600s;
    }
}

案例四:限流与访问控制

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

server {
    listen 80;
    
    location /api/ {
        limit_req zone=api_limit burst=20 nodelay;
        proxy_pass http://backend;
    }
}

总结

Nginx 作为反向代理和负载均衡的核心组件,在现代 Web 架构中扮演着至关重要的角色。通过本文的学习,我们掌握了以下核心知识点:

  1. 反向代理原理:理解了正向代理与反向代理的区别
  2. 负载均衡策略:掌握了轮询、加权轮询、IP 哈希、最少连接等多种算法
  3. 健康检查机制:学会通过配置保障服务高可用
  4. 高级配置技巧:包括长连接优化、超时控制、SSL 卸载等
  5. 实战应用场景:微服务网关、WebSocket 代理、HTTPS 配置等

在实际生产环境中,建议根据业务特点选择合适的负载均衡策略,配置完善的健康检查和监控机制,合理设置超时时间和缓冲区大小,启用 SSL/TLS 加密传输,实施限流和访问控制保护后端服务。

本文链接:https://www.kkkliao.cn/?id=911 转载需授权!

分享到:

版权声明:本文由廖万里的博客发布,如需转载请注明出处。


发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。