Nginx学习笔记(六)—— Nginx反向代理

发布于:2025-08-14 ⋅ 阅读:(24) ⋅ 点赞:(0)

📚Nginx学习笔记(六)—— Nginx反向代理

📌 一、反向代理核心概念

本质原理

请求
转发请求
转发请求
响应
响应
聚合响应
客户端
Nginx反向代理
后端服务器1
后端服务器2

核心价值

  • 🛡️ 安全屏障:隐藏后端服务器真实IP
  • ⚖️ 负载分发:均衡后端服务器流量
  • 🚀 性能加速:集成缓存/压缩等优化
  • 🔧 统一入口:简化客户端访问逻辑

⚙️ 二、基础配置语法

核心指令

location /api/ {
    # 必需指令
    proxy_pass http://backend_server;  # 转发到上游服务器组
    
    # 请求头控制
    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_connect_timeout 3s;   # 连接后端超时
    proxy_read_timeout 30s;      # 读取响应超时
    proxy_send_timeout 30s;      # 发送请求超时
}

关键参数详解

指令 默认值 作用
proxy_buffering on 启用响应缓冲区(防后端阻塞)
proxy_buffer_size 4k/8k 响应头缓冲区大小
proxy_buffers 8 4k/8k 响应内容缓冲区数量及大小
proxy_redirect off 重定向URL修正开关

🧩 三、实战配置案例
🔄 案例1:基础反向代理(upstream + proxy_pass)
upstream backend {
    server 192.168.1.101:8080 weight=5; 
    server 192.168.1.102:8080 max_fails=3;
    keepalive 32;  # 启用连接池
}

server {
    location /service/ {
        proxy_pass http://backend;  # 关键转发指令
        
        # 连接优化
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

📌 效果

http://nginx-host/service/request → 转发到 http://192.168.1.101:8080/request

🛡️ 案例2:安全隔离实现
location /internal-api/ {
    # 物理隔离
    proxy_pass http://10.0.100.20;  # 内网服务器
    
    # 安全控制
    allow 192.168.1.0/24;   # 仅允许内网IP
    deny all;               
    proxy_hide_header Server;  # 隐藏服务器标识
    
    # 防渗透
    proxy_cookie_path / "/; HttpOnly; Secure";  # Cookie安全加固
}

安全增强

  • 🔒 IP白名单过滤
  • 🚫 隐藏服务指纹
  • 🍪 强制Cookie安全策略

📶 案例3:基于IP的流量控制
# 定义限流区域(10MB空间,每秒10请求)
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;

location /download/ {
    proxy_pass http://backend;
    
    # 限流配置
    limit_req zone=ip_limit burst=20;  # 允许突发20请求
    limit_req_status 429;              # 超限返回429状态码
    
    # 差异化限速
    if ($remote_addr ~ "192.168.1.100") {
        set $limit_rate 1m;  # 特殊IP限速1MB/s
    }
}

📊 流量控制逻辑

未超
超过
请求进入
IP是否在白名单?
放行+特殊限速
是否超过10req/s?
正常转发
返回429错误

🚧 案例4:并发连接数限制
# 连接数计数区(1MB可记录1.6万IP)
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;

server {
    location /api/ {
        proxy_pass http://backend;
        
        # 单IP最大5并发
        limit_conn conn_zone 5;  
        limit_conn_status 503;    # 超限返回503
        
        # 慢连接保护
        proxy_connect_timeout 2s; 
        client_body_timeout 10s;
    }
}

🛠️ 容错机制

# 故障转移配置
proxy_next_upstream error timeout http_500 http_502;  # 自动切换故障节点
proxy_next_upstream_tries 3;                          # 最大重试次数

⚠️ 四、高阶技巧与陷阱规避
🔧 技巧1:WebSocket代理
location /wsapp/ {
    proxy_pass http://backend;
    
    # WebSocket必需参数
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s;  # 长连接超时
}
🎭 技巧2:多路径重写规则
location ~ ^/service/(user|order)/(.*)$ {
    # 路径重写:/service/user/info → /api/user-service/info
    rewrite ^/service/(.*)/(.*)$ /api/$1-service/$2 break;
    
    proxy_pass http://backend;
}
❌ 常见陷阱:
  1. 502 Bad Gateway错误

    # 解决方案:增加超时阈值
    proxy_connect_timeout 5s;
    proxy_read_timeout 60s;
    
  2. Cookie/Session丢失

    # 添加原始主机头
    proxy_set_header Host $host;  
    proxy_cookie_domain backend.example.com $host;
    

📊 五、调试与监控方案
# 专用调试日志格式
log_format proxy_debug '$remote_addr - $upstream_addr '
                      '$status $upstream_response_time '
                      '"$request" $body_bytes_sent';

location /api/ {
    proxy_pass http://backend;
    
    # 注入调试头
    add_header X-Backend-IP $upstream_addr;
    add_header X-Response-Time $upstream_response_time;
    
    # 记录详细日志
    access_log /var/log/nginx/proxy.log proxy_debug;
}

监控指标

  • nginx.http.proxy.requests:代理请求计数
  • nginx.http.proxy.response_time:后端响应时间
  • nginx.http.proxy.failures:失败请求数

🔍 诊断命令

tail -f /var/log/nginx/proxy.log | grep ' 502 '
nginx -T | grep -A20 "location /api/"

📚 总结图谱

反向代理核心
基础配置
安全隔离
流量控制
并发限制
proxy_pass
proxy_set_header
IP白名单
Header隐藏
limit_req_zone
limit_rate
limit_conn_zone
proxy_timeout

网站公告

今日签到

点亮在社区的每一天
去签到