20-Linux学习之旅之反向代理与负载均衡
Linux学习之旅之反向代理与负载均衡一、认识代理对比维度正向代理反向代理核心定义代理客户端访问外网服务器服务器不知道真实客户端是谁代理后端服务对外提供访问客户端不知道真实后端服务器是谁代理对象客户端替用户上网服务端替业务服务器接收请求视角区分站在服务器视角来访的是代理看不到真实用户站在客户端视角访问的是代理看不到真实业务服务典型位置内网客户端 ↔ 代理服务器 ↔ 公网目标网站公网用户 ↔ 反向代理服务器 ↔ 内网后端集群IP 隐藏效果隐藏客户端真实 IP目标服务器只看到代理 IP隐藏后端服务器真实 IP客户端只看到代理 IP访问逻辑举例公司员工客户端→公司代理服务器→百度百度只能看到代理服务器 IP不知道员工内网 IP用户浏览器→Nginx 反向代理→后端服务 A / 服务 B用户只知道 Nginx 域名不清楚后端多台业务机器安全作用对内网客户端做隔离外网无法直接访问内网用户对内网业务服务器做隔离外网不能直连后端只暴露代理入口域名 / 访问特征客户端需要手动配置代理地址才能生效客户端正常访问域名无需任何额外配置代理对用户透明二、部署反向代理1、环境准备2、安装Nginx#安装Nginx参考上文《19-Linux学习之旅之Nginx认知和部署》第二步骤https://blog.csdn.net/2401_88082755/article/details/163781778?sharetypeblogdetailsharerId163781778sharereferPCsharesource2401_88082755spm1011.2480.3001.81183、基础配置#创建网站目录[rootbackend1 ~]# mkdir -p /var/www/backend/api#创建网站文件[rootbackend1 ~]# echo Backend 1 (10.0.0.21) /var/w ww/backend/index.html[rootbackend1 ~]# echo {code:200,data:Backend 1} /var/www/backend/api/user#创建虚拟主机[rootbackend1 ~]# cat /etc/nginx/conf.d/backend.conf EOFserver{listen8080;server_name backend;root /var/www/backend;index index.html;access_log /var/log/nginx/backend_access.log main;error_log /var/log/nginx/backend_error.log warn;}EOF#检查配置文件和重新加载配置[rootbackend1 ~]# nginx -t systemctl reload nginxnginx: the configurationfile/etc/nginx/nginx.conf synt ax is ok nginx: configurationfile/etc/nginx/nginx.conftestis successful#主机backend2和3配置需要将10.0.0.21改成10.0.0.22/23Backend 1改成Backend2/3echoBackend 1 (10.0.0.21)/var/www/backend/index.htmlecho{code:200,data:Backend 1}/var/www/backend/api/user#在LB1测试后端服务200 OK表示正常[rootLB1 ~]# curl -I http://10.0.0.21:8080HTTP/1.1200OK Server: nginx/1.30.4 Date: Tue,11Aug202609:09:00 GMT Content-Type: text/html Content-Length:22Last-Modified: Tue,11Aug202609:06:20 GMT Connection: keep-alive ETag:6a7ae60c-16Accept-Ranges: bytes[rootLB1 ~]# curl -I http://10.0.0.22:8080HTTP/1.1200OK Server: nginx/1.30.4 Date: Tue,11Aug202609:09:04 GMT Content-Type: text/html Content-Length:22Last-Modified: Tue,11Aug202609:07:32 GMT Connection: keep-alive ETag:6a7ae654-16Accept-Ranges: bytes[rootLB1 ~]# curl -I http://10.0.0.23:8080HTTP/1.1200OK Server: nginx/1.30.4 Date: Tue,11Aug202609:09:07 GMT Content-Type: text/html Content-Length:22Last-Modified: Tue,11Aug202609:07:46 GMT Connection: keep-alive ETag:6a7ae662-16Accept-Ranges: bytes#准备LB静态资源[rootLB1 ~]# mkdir -p /var/www/nginx/images[rootLB1 ~]# echo LB Home Page /var/www/nginx/index.html[rootLB1 ~]# echo LB Test Page /var/www/nginx/test.html4、配置负载均衡#创建负载均衡[rootLB1 ~]# vim /etc/nginx/conf.d/proxy-lb.conf[rootLB1 ~]# cat /etc/nginx/conf.d/proxy-lb.conf#负载均衡upstream backend{server10.0.0.21:8080;server10.0.0.22:8080;server10.0.0.23:8080;}server{listen80;server_name lb.xyx.com;root /var/www/nginx;# 静态资源LB 直接返回location ~*\.(jpg|jpeg|png|gif|ico|svg|webp|css|js)${expires 30d;access_log off;}# API 请求转发到后端负载均衡location /api/{proxy_pass http://backend;# 传递真实客户端信息proxy_set_header Host$host;# 原始 Hostproxy_set_header X-Real-IP$remote_addr;# 客户端真实 IPproxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;# 代理链proxy_set_header X-Forwarded-Proto$scheme;# 原始协议(http/https)}# 其他请求LB 直接返回静态文件location /{try_files$uri$uri/ /index.html;}}#检查配置文件和重新加载配置文件[rootLB1 ~]# nginx -t systemctl reload nginxnginx: the configurationfile/etc/nginx/nginx.conf syntax is ok nginx: configurationfile/etc/nginx/nginx.conftestis successful5、验证负载均衡#单一测试rootubt2604ser:~# curl -s http://lb.xyx.com/api/user{code:200,data:Backend 1}#循环测试rootubt2604ser:~# for i in {1..6}; do curl -s http://lb.xyx.com/api/user; done{code:200,data:Backend 1}{code:200,data:Backend 2}{code:200,data:Backend 3}{code:200,data:Backend 1}{code:200,data:Backend 2}{code:200,data:Backend 3}#查看backend1连接日志[rootbackend1 ~]# tail -f /var/log/nginx/access.log10.0.0.11 - -[12/Aug/2026:08:26:50 0800]GET /api/user HTTP/1.120032-curl/8.18.010.0.0.410.0.0.11 - -[12/Aug/2026:08:26:50 0800]GET /api/user HTTP/1.120032-curl/8.18.010.0.0.46、负载均衡#添加权重weight分流参数3:1:1[rootLB1 ~]# vim /etc/nginx/conf.d/proxy-lb.conf[rootLB1 ~]# cat /etc/nginx/conf.d/proxy-lb.confupstream backend{server10.0.0.21:8080weight3;server10.0.0.22:8080weight1;server10.0.0.23:8080weight1;}#检验和加载[rootLB1 ~]# nginx -tnginx: the configurationfile/etc/nginx/nginx.conf syntax is ok nginx: configurationfile/etc/nginx/nginx.conftestis successful[rootLB1 ~]# systemctl reload nginx.service#验证rootubt2604ser:~# for i in {1..6}; do curl -s http://lb.xyx.com/api/user; done{code:200,data:Backend 1}{code:200,data:Backend 2}{code:200,data:Backend 1}{code:200,data:Backend 3}{code:200,data:Backend 1}{code:200,data:Backend 1}#查看三台backend日志发现backend1的连接更多[rootbackend1 ~]# tail -f /var/log/nginx/backend_access.log10.0.0.11 - -[12/Aug/2026:08:32:58 0800]GET /api/user HTTP/1.120032-curl/8.18.010.0.0.410.0.0.11 - -[12/Aug/2026:08:32:58 0800]GET /api/user HTTP/1.120032-curl/8.18.010.0.0.410.0.0.11 - -[12/Aug/2026:08:32:58 0800]GET /api/user HTTP/1.120032-curl/8.18.010.0.0.4##ip_hash(会话保持)传统应用使用本地 Session同一用户必须访问同一后端。[rootLB1 ~]# vim /etc/nginx/conf.d/proxy-lb.conf[rootLB1 ~]# cat /etc/nginx/conf.d/proxy-lb.confupstream backend{ip_hash;server10.0.0.21:8080;server10.0.0.22:8080;server10.0.0.23:8080;}#查看backend主机日志会发现都会在一台##least_conn(最少连接)传统应用使用本地 Session同一用户必须访问同一后端。[rootLB1 ~]# vim /etc/nginx/conf.d/proxy-lb.conf[rootLB1 ~]# cat /etc/nginx/conf.d/proxy-lb.confupstream backend{least_conn;server10.0.0.21:8080;server10.0.0.22:8080;server10.0.0.23:8080;}#三台backend主机日志上连接很平均7、被动健康检查[rootLB1 ~]# vim /etc/nginx/conf.d/proxy-lb.conf[rootLB1 ~]# cat /etc/nginx/conf.d/proxy-lb.confupstream backend{server10.0.0.21:8080max_fails3fail_timeout30s;server10.0.0.22:8080max_fails3fail_timeout30s;server10.0.0.23:8080max_fails3fail_timeout30s;}#max_fails3失败三次后标记为不可用#fail_timeout30s不可用后30秒在重试连接[rootLB1 ~]# nginx -t systemctl reload nginx.servicenginx: the configurationfile/etc/nginx/nginx.conf syntax is ok nginx: configurationfile/etc/nginx/nginx.conftestis successful[rootLB1 ~]##模拟故障[rootbackend2 ~]# systemctl stop nginx.servicerootubt2604ser:~# for i in {1..6}; do curl -s http://lb.xyx.com/api/user; done{code:200,data:Backend 1}{code:200,data:Backend 3}{code:200,data:Backend 3}{code:200,data:Backend 1}{code:200,data:Backend 3}{code:200,data:Backend 1}

相关新闻

双端队列(Deque)详解:原理、实现与核心应用场景

双端队列(Deque)详解:原理、实现与核心应用场景

1. 项目概述:为什么双端队列是“瑞士军刀”?如果你写过代码,肯定用过数组和链表。数组能快速访问任意位置,但增删中间元素慢;链表增删快,但访问特定位置得从头遍历。有没有一种数据结构,能同时兼…

2026/10/13 17:47:19 阅读更多 →
个人微信API智能机器人搭建:3天从0到1实战

个人微信API智能机器人搭建:3天从0到1实战

上个月老板把我叫进办公室,甩过来一句"咱们做个微信机器人吧,能自动回消息那种,简单吧?" 我当时心里想,不就是个机器人嘛,调几个接口的事。结果一上手才发现,坑多得能栽跟头栽到怀疑…

2026/10/8 12:40:39 阅读更多 →
2026年全球:半导体型高纯单壁碳纳米管科研解析与应用分享

2026年全球:半导体型高纯单壁碳纳米管科研解析与应用分享

在后摩尔时代的微电子学研究中,碳基材料凭借其超越传统硅基极限的载流子迁移率与微型化潜力,正逐步成为下一代集成电路的核心。单壁碳纳米管(SWCNT)作为其中的代表,根据其手性的不同,展现出金属性或半导体性…

2026/10/9 2:05:55 阅读更多 →

最新新闻

React脚手架原理与选型指南:从Vite到工程化落地

React脚手架原理与选型指南:从Vite到工程化落地

聊到React项目的起步阶段,脚手架这几个字几乎每次都会被摆上台面。它不是一个简单的配置文件,而是把一整套前端工程化底座直接端到你面前:开发服务器、热更新、构建打包、代码规范、环境变量管理,这些原本要折腾一周的事情&#x…

2026/10/13 21:58:43 阅读更多 →
Agent Skill实战指南:从零构建可复用的AI助手能力模块

Agent Skill实战指南:从零构建可复用的AI助手能力模块

1. 从"每次都要重新教"说起:Agent Skill到底在解决什么如果你用过任何一款AI助手,大概率经历过这样的场景:你花十分钟跟它解释"帮我整理会议纪要时,要按项目分组,每个项目下列出待办事项、负责人和截止…

2026/10/13 21:58:43 阅读更多 →
React脚手架深度解析:从CRA到Vite的工程化进阶与踩坑指南

React脚手架深度解析:从CRA到Vite的工程化进阶与踩坑指南

做前端的,几乎没人能绕开脚手架上手这道坎。最近带了个新人,第一天问他环境起来没有,他说“起好了,但不知道起好了啥”。这个回答其实特别真实,因为现在跑一条npx create-react-app my-app,几十秒后一个能跑…

2026/10/13 21:58:43 阅读更多 →
基于Spring Boot的交通事故档案管理系统设计与实现

基于Spring Boot的交通事故档案管理系统设计与实现

1. 项目定位与整体架构设计拆解1.1 为什么选Java Springboot做档案管理系统先聊点实在的。很多同学做毕业设计,第一反应是选个看起来“高级”的技术栈,比如Python的Django、Flask,或者Node.js的Express。但我个人见过太多案例,最…

2026/10/13 21:58:43 阅读更多 →
英语学习真的需要思考:从机械记忆到深度认知的进阶方法

英语学习真的需要思考:从机械记忆到深度认知的进阶方法

我们先说句实话:我见过太多人把英语学成了“体力活”。单词书翻烂了三本,语法题刷了上千道,朗读打卡坚持了一年,结果遇到老外还是张不开嘴,读文章还是逐字翻译。问题出在哪?不是不努力,而是努力…

2026/10/13 21:58:43 阅读更多 →
从AtCoder一题看浮点数精度陷阱与整数解法

从AtCoder一题看浮点数精度陷阱与整数解法

做题时间长了以后,我越来越确信一件事:真正让人当场翻车的,往往不是那些看半天都没思路的难题,而是所有步骤都“看起来没问题”的简单题。AtCoder Beginner Contest 169 的 C 题 Multiplication 3,就是一个摆在台面上的…

2026/10/13 21:57:43 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →