当前位置: 首页 > news >正文

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

📚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_bufferingon启用响应缓冲区(防后端阻塞)
proxy_buffer_size4k/8k响应头缓冲区大小
proxy_buffers8 4k/8k响应内容缓冲区数量及大小
proxy_redirectoff重定向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;   # 仅允许内网IPdeny 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/inforewrite ^/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
http://www.dtcms.com/a/329623.html

相关文章:

  • CSS保持元素宽高比,固定元素宽高比
  • Socket 套接字的学习--UDP
  • 设计秒杀系统从哪些方面考虑
  • 服务器安全检测和防御技术
  • 符合实时AUTOSAR OS的形式化设计和验证方法
  • WPF的c1FlexGrid的动态列隐藏和动态列名设置
  • AI企业培训系统构建指南
  • 在 Conda 环境下编译 C++ 程序时报错:version `GLIBCXX_3.4.30‘ not found
  • 数据结构:队列(Queue)与循环队列(Circular Queue)
  • setsockopt函数详解
  • 海洋通信系统技术文档(1)
  • HTTP 缓存机制全面解析
  • 体制内程序员证书扫盲(中国内地)
  • 可搜索的 HTML 版本 Emoji 图标大全,可以直接打开网页使用,每个图标可以点击复制,方便使用
  • 【unity实战】在unity实现一套可扩展的Model-View-Data (MVD) 系统架构设计
  • 常用 MaxKB 函数库(HTTP、MYSQL)
  • Qt中实现OpenGL应用的编程框架
  • [系统架构]系统架构基础知识(一)
  • 面向局部遮挡场景的目标检测系统设计与实现
  • 打造专属 React 脚手架:从 0 到 1 开发 CLI 工具
  • 万字详解C++11列表初始化与移动语义
  • Mysql——》提取JSON对象和数组
  • 微信小程序使用高德api实现导航至目的地
  • 【完整源码+数据集+部署教程】武器目标检测系统源码和数据集:改进yolo11-AggregatedAtt
  • Ansible 实操笔记:Playbook 与变量管理
  • 智驾系统架构解析
  • 深入解析Go设计模式:命令模式实战
  • 在verdi中查看波形中的glitch
  • 数字货币的去中心化:重构价值交换的底层逻辑​
  • 认识下windows下的设备管理器