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.pswp.cn/web/92966.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三伍微电子GSR2406 IoT FEM 2.4G PA 射频前端模组芯片

三伍微电子GSR2406 IoT FEM 2.4G PA 射频前端模组芯片规格书Product Description The GSR2406 is a high-performance, fully integrated RF front-end module (FEM) designed for Zigbee technology, Thread, and Bluetooth (including low energy) applications. The GSR2406…

开发避坑指南(24):RocketMQ磁盘空间告急异常处理,CODE 14 “service not available“解决方案

异常信息 Caused by: org.apache.rocketmq.client.exception.MQBrokerException: CODE: 14 DESC: service not available now, maybe disk full, CL: 0.94 CQ: 0.94 INDEX: 0.94, maybe your broker machine memory too small.异常背景 一个项目里面用到了rocketmq&#x…

开源WAF新标杆:雷池SafeLine用语义分析重构网站安全边界

文章目录前言【视频教程】1.安装Docker2.本地部署SafeLine3.使用SafeLine4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Uptime Kuma公网地址前言 当个人或企业站点上线后面临的首要威胁往往来自网络攻击——据统计,超过60%的Web应用漏洞利用尝试在流量到达…

Mac M1探索AnythingLLM+SearXNG

SearXNG 能聚合来自多达 200 多个搜索服务,可私有化部署,并提供了灵活自定义选项。 AnythingLLMSearXNG,刚好能解决AnythingLLM因为网络限制导致web search不可用的问题。 1 安装docker 下载mac m1版本的docker并安装。 https://docs.dock…

模式设计:策略模式及其应用场景

简介 策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时动态选择算法或行为。核心思想是将算法封装成独立的类(策略),使它们可以相互替换,让算法的变化独立于使用它的客户端。 核心思想 解耦:将算法的定义与使用分离。每个算法封装起来,使它们可以互…

Squash Merge(压缩合并)和Rebase Merge(变基合并)介绍

文章目录**1. Squash Merge(压缩合并)****定义****操作步骤****特点****优点****缺点****2. Rebase Merge(变基合并)****定义****操作步骤****特点****优点****缺点****3. 对比总结****4. 选择建议****5. 示例场景****Squash Merg…

Linux编程 —— framebuffer

一、framebuffer概念framebuffer:帧缓冲,帧缓存技术Linux内核专门为图形化显示提供的一套应用程序接口。二、基本操作步骤1. 打开显示设备(/dev/fb0) 2. 获取显示设备相关参数(分辨率,像素格式)---》ioctl 3. 建立显存…

文件编辑html

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文件行内容编辑器</title><script src&…

具有熔断能力和活性探测的服务负载均衡解决方案

一、整体架构设计 1.核心组件 负载均衡器&#xff1a;负责选择可用的服务节点健康检查器&#xff1a;定期检测服务节点的可用性服务节点管理&#xff1a;维护所有可用节点的状态信息 2.负载均衡策略 轮询(Round Robin)随机(Random)加权轮询(Weighted Round Robin)最少连接(Leas…

技术演进中的开发沉思-62 DELPHI VCL系列:VCL下的设计模式

今天聊聊设计模式&#xff0c;当然这个章节目前仅限于DELPHI VCL,因为接下来梳理的Factory/Factory Method、Bootstrap 和 ForEach 这三种设计样例&#xff0c;看似独立&#xff0c;却在实际开发中相互配合&#xff0c;共同构建起高效、灵活的程序架构。在 DELPHI VCL 开发的技…

Docker 101:面向初学者的综合教程

掌握 Docker 已成为软件开发中的一项关键技能。本教程探讨了容器化的世界&#xff0c;包括其核心概念、优缺点&#xff0c;以及开始使用容器化的分步指南。 无论是 Docker 的新手&#xff0c;还是希望复习基础知识的更有经验的开发人员&#xff0c;本指南都能满足需求。 什么…

RTOS YAFFS

在 YAFFS (Yet Another Flash File System) 的语境中&#xff0c;“Check Point” 并不是一个标准的、核心的官方术语。它更可能是对 YAFFS 关键机制 Summary 或 Checkpointing 功能的非正式表述或理解偏差。其核心含义是指 YAFFS 在特定时刻保存文件系统关键元数据的状态&…

【SpringBoot系列-02】自动配置机制源码剖析

【SpringBoot系列-02】自动配置机制源码剖析 咱们天天用Spring Boot&#xff0c;一个SpringBootApplication注解扔进去&#xff0c;啥配置都不用写&#xff0c;项目就跑起来了。你有没有过这种疑惑&#xff1a;那些DispatcherServlet、DataSource是从哪冒出来的&#xff1f;今天…

51单片机-51单片机最小系统

本章概述思维导图&#xff1a;51单片机最小系统51单片机最小系统是51系列单片机&#xff08;如AT89C51、STC89C52等&#xff09;能够独立工作的最简电路配置&#xff0c;它为单片机提供了运行所需的基本条件。51单片机最小系统板是嵌入式系统开发的基础平台&#xff0c;集成了单…

git学习1

目录引入版本控制集中式和分布式版本控制git工作机制代码托管中心Git常用命令设置用户签名初始化本地库查看库状态add和提交版本穿梭git分支操作分支定义分支好处分支操作查看分支创建分支切换分支分支合并&#x1f495;✨&#x1fa77;合并冲突git团队协作团队内协作跨团队协作…

redis原理篇--Dict

Dict数据结构一、Redis字典的核心组件Redis字典由三部分构成&#xff1a;dictht&#xff08;哈希表&#xff09;&#xff1a;存储桶数组与元数据dictEntry&#xff08;哈希节点&#xff09;&#xff1a;存储键值对dict&#xff08;字典主体&#xff09;&#xff1a;包含双哈希表…

静态路由主备切换

在网络中&#xff0c;静态路由的主备切换是实现网络冗余的基础方案之一&#xff0c;通过配置不同优先级的静态路由&#xff0c;确保主用路径故障时&#xff0c;流量能自动切换到备用路径&#xff0c;提升网络可靠性。以下从知识讲解和实验配置两部分详细说明。一、静态路由主备…

PDF处理控件Aspose.PDF教程:在C#、Java、Python中快速缩小PDF

如果您的PDF太大&#xff0c;无法通过电子邮件发送&#xff0c;或者在线加载时间过长&#xff0c;您可以在几秒钟内缩小 PDF 大小。本教程介绍了借助Aspose.PDF使用 C#、Java 和 Python 编程快速缩小PDF的方法。 Aspose.PDF官方试用版下载 通过编程缩小 PDF 尺寸 如果您需要…

AWS EKS 常用命令大全:从基础管理到高级运维

前言 Amazon Elastic Kubernetes Service (EKS) 是 AWS 提供的托管 Kubernetes 服务,大大简化了 K8s 集群的部署和管理工作。作为 EKS 管理员或开发者,熟练掌握 kubectl 命令是日常工作的基础。本文将详细介绍 EKS 环境中常用的 kubectl 命令,涵盖集群管理、工作负载操作、…

GitHub Browser-Use 的部署失败记录:失败了,失败了。。。。

一、项目背景与核心作用 browser-use 是一个开源的浏览器自动化工具&#xff0c;通过集成 AI 智能体&#xff08;如 GPT、Claude、DeepSeek 等大型语言模型&#xff09;&#xff0c;实现用自然语言控制浏览器操作。其核心目标是 简化网页交互自动化&#xff0c;尤其适合复杂、…