这是一个非常核心且重要的后端/运维知识领域。我会用尽可能清晰易懂的方式,结合生动的比喻,为你详细梳理这些概念。


核心概念一览

我们先从一个宏观的角度来理解它们之间的关系:

  • 代理(Proxy): 一个中间人的角色。你不直接联系目标,而是通过这个中间人。

  • 正向代理(Forward Proxy): 代理客户端。它站在客户端(用户)这边,替客户端去访问外部资源。核心关键词:为客户端服务、科学上网、缓存、隐藏客户端。

  • 反向代理(Reverse Proxy): 代理服务端。它站在服务器这边,替服务器接收来自外部客户的请求。核心关键词:为服务端服务、负载均衡、安全、隐藏后端服务器。

  • 负载均衡(Load Balancing): 一种技术/策略,通常由反向代理来实现。它的目标是把大量的请求合理地(均匀地、按权重等)“分配”给后台多个服务器,防止单个服务器过载。

  • Nginx: 一个非常流行的、高性能的软件,它同时实现了反向代理负载均衡Web服务器缓存等多种功能。它是这些概念的一个优秀实践者

下面我们来逐个击破。


1. 正向代理 (Forward Proxy) - “客户的代言人”

是什么?

正向代理是位于客户端(比如你的浏览器)和目标服务器(比如 Google)之间的一个服务器。客户端会明确地配置并连接到这个代理服务器,然后由代理服务器去获取你想要的信息,再返回给你。

生动的比喻:科学上网工具(VPN/代理)

你想访问 Google(目标服务器),但你的网络无法直接访问(因为有墙)。于是你在电脑上设置了一个科学上网工具(正向代理)。

  1. 你的浏览器请求发给科学上网工具:“帮我去拿 Google 首页。”

  2. 科学上网工具用自己的身份去访问 Google,拿到首页。

  3. 科学上网工具把首页内容返回给你的浏览器。

对你(客户端)来说,你感知到的是科学上网工具给了你Google的内容。对Google(服务器)来说,它只知道是科学上网工具来访问了它,并不知道你的存在。

核心作用与特点:
  1. 突破访问限制: 访问无法直接到达的资源(如上面的例子)。

  2. 隐藏客户端身份: 目标服务器看不到客户端的真实IP,保护隐私。

  3. 缓存加速: 如果公司内网很多人访问同一个网站,代理服务器可以把内容缓存下来,下次其他人访问时直接从缓存里取,加快速度并节省带宽。

  4. 访问控制: 公司网络可以通过代理监控和限制员工上网行为。

工作流程:

text

[ 客户端 ] --> (我知道我要通过它) --> [ 正向代理 ] --> [ 目标服务器 ]

2. 反向代理 (Reverse Proxy) - “公司的前台/总机”

是什么?

反向代理是位于一个或多个服务器前面的一个服务器。客户端(用户)直接访问反向代理,然后由反向代理将请求转发到内部网络上的某台服务器,并将得到的结果返回给客户端。

客户端并不知道后面有哪些服务器,也不关心请求具体被谁处理了。它以为反向代理就是最终的服务器。

生动的比喻:酒店前台

一个大型酒店有很多服务员(后端服务器),但你作为客人(客户端)不会直接联系某个服务员。

  1. 你走到酒店前台(反向代理)说:“我要开间房。”

  2. 前台根据当前哪个服务员空闲、哪个区域忙等策略(负载均衡),通过对讲机让服务员A去处理你的请求。

  3. 服务员A办好手续,把房卡给前台,前台再交给你。

对你(客户端)来说,你是在和前台打交道,你不知道背后是服务员A还是B为你服务的。对服务员(后端服务器)来说,他们被前台保护起来,不会直接面对客户的各种冲击。

核心作用与特点:
  1. 隐藏服务器身份: 保护后端服务器的安全,暴露给公网的只有反向代理,有效防止直接攻击。

  2. 负载均衡: 这是反向代理最核心的功能之一(下面详细讲)。

  3. SSL 加密/解密: 可以由反向代理统一处理耗性能的HTTPS加密解密,减轻后端服务器压力。

  4. 缓存静态内容: 将图片、CSS、JS等静态文件缓存起来,直接返回,无需请求后端。

  5. 压缩: 压缩响应内容,减少传输时间。

  6. 统一入口: 微服务架构中,反向代理可以作为API网关,统一接收所有请求。

工作流程:

text

[ 客户端 ] --> [ 反向代理 ] --> (它来决定给谁) --> [ 服务器A ]|+---------> [ 服务器B ]|+---------> [ 服务器C ]

3. 负载均衡 (Load Balancing) - “聪明的调度员”

是什么?

负载均衡是反向代理扮演的一个核心角色。它是一种技术,旨在将网络流量或计算任务分布式到多个服务器上,以确保没有任何单个服务器因过载而性能下降或宕机。它提高了整个系统的可用性、可靠性和吞吐量。

如何工作?(调度算法)

负载均衡器(即反向代理)通过不同的算法来决定将新请求发给哪台后端服务器(这些服务器集群也称为“服务器池”或“农场”):

  • 轮询 (Round Robin): 依次分发,第1个请求给服务器A,第2个给服务器B,第3个给服务器C,第4个又给回A...如此循环。最简单公平。

  • 加权轮询 (Weighted Round Robin): 给性能好的服务器更高的权重,它就能处理更多的请求。比如服务器A(权重3),服务器B(权重1),那么分发模式可能是 A->A->A->B->A->A->A->B。

  • 最少连接数 (Least Connections): 优先将新请求发给当前连接数最少的服务器,非常高效。

  • IP 哈希 (IP Hash): 根据客户端的IP地址计算一个哈希值,总是将同一个IP的请求发给同一台服务器。这能保证会话(Session)一致性,比如用户的购物车信息只存在一台服务器上。


4. Nginx - “瑞士军刀”

是什么?

Nginx (发音为 “engine-x”) 是一个开源、高性能、高可靠性的 HTTP 和反向代理服务器。它因其强大的功能、低内存消耗和高并发处理能力而闻名。

它扮演什么角色?

Nginx 完美地集成了我们上面讨论的所有概念:

  1. 作为 Web 服务器: 像 Apache 一样,可以直接托管网站文件(HTML, CSS, JS, 图片)。

  2. 作为反向代理: 这是它最常用的核心功能。接收客户端请求,转发给后端的Tomcat, Apache, Node.js, Python Django等应用服务器。

  3. 作为负载均衡器: 在反向代理的基础上,通过简单的配置即可实现上述的各种负载均衡算法。

  4. 其他功能: 还能做缓存、SSL终结、流量限制、访问控制等。

一个简单的 Nginx 负载均衡配置示例

假设你有三台后端应用服务器,IP分别是 192.168.1.10192.168.1.11192.168.1.12

你的 Nginx 配置文件 (nginx.conf) 中可能会这样写:

nginx

http {# 定义一个名为 "backend_servers" 的服务器组upstream backend_servers {# 使用默认的轮询算法server 192.168.1.10;    # 服务器Aserver 192.168.1.11;    # 服务器Bserver 192.168.1.12;    # 服务器C# 如果要使用加权轮询# server 192.168.1.10 weight=3;# server 192.168.1.11 weight=1;}server {listen 80; # Nginx 监听80端口location / {# 将所有对根路径的请求代理到上面定义的服务器组proxy_pass http://backend_servers;# 以下是一些常见的反向代理设置,确保正确传递客户端信息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;}}
}

这样,当用户访问你的域名时,Nginx(反向代理+负载均衡器)就会按照配置的算法,将请求轮流发给后端的三个服务器。


总结与对比

特性正向代理反向代理
代理对象代理客户端代理服务端
客户端知情吗?知情,需要主动配置代理地址不知情,以为反向代理就是真实服务器
部署位置靠近客户端(如在客户端局域网内)靠近服务端(如在数据中心入口)
主要目的为客户端服务:突破限制、缓存、隐藏身份为服务端服务:负载均衡、安全、缓存、加密
典型例子VPN、科学上网工具、企业上网代理Nginx、Apache Traffic Server、CDN

负载均衡是反向代理的核心功能之一,Nginx 则是实现反向代理和负载均衡的著名软件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96736.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96736.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96736.shtml

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

相关文章

WebSocket压缩传输优化:机器视觉高清流在DCS中的低延迟方案

引言在现代工业自动化领域,分布式控制系统(DCS)正面临着前所未有的数据挑战。随着机器视觉技术的广泛应用,高清视频流已成为监控产品质量、检测设备异常和保障生产安全的重要手段。然而,将720P、1080P甚至4K分辨率的高…

《Linux常见命令》

ls 功能:列出目录下的子目录与文件,对于文件,还会列出文件名及其他信息。 语法:ls [选项] [目录或文件] 1.常用选项及说明选项说明-a列出目录下的所有文件,包括以 . 开头的隐含文件-d将目录象文件一样显示,…

Python数据分析:函数定义时的位置参数。

目录1 代码示例2 欢迎纠错3 免费爬虫4 论文写作/Python 学习智能体1 代码示例 直接上代码。 def pargs1(a, b):"""先看确定数量的位置参数。最简单的位置参数。a和b都叫而且只能叫“位置参数”。所谓确定数量,很明显,是两个就是两个&…

《没有架构图?用 netstat、ss、tcpdump 还原服务连接与数据流向》

📢 你是否遇到过这些问题? 接手一个老项目,只有服务器账号,没有架构图?服务突然异常,但不知道它依赖哪些外部系统?想画数据流向图,却找不到文档? 别担心!只要…

Redis列表(List):实现队列/栈的利器,底层原理与实战

Redis列表(List):实现队列/栈的利器,底层原理与实战 1. Redis列表概述 1.1 什么是Redis列表 Redis列表(List)是一个有序的字符串元素集合,支持在头部和尾部进行高效的插入和删除操作。它可以…

OpenCV 图像双三次插值

文章目录 一、简介 二、实现代码 三、实现效果 参考资料 一、简介 在数学中,双三次插值是三次样条插值(一种将三次插值应用于数据集的方法)的扩展,用于在二维规则网格上插值数据点。插值曲面(指核形状,而非图像)比通过双线性插值或最近邻插值获得的相应曲面更平滑。双三…

【Java实战㊲】Spring Security:为Spring Boot应用筑牢安全防线

目录 一、Spring Security 概述 1.1 Spring Security 核心功能 1.2 Spring Security 与 Shiro 对比 二、Spring Boot 整合 Spring Security 基础 2.1 整合依赖导入 2.2 默认安全配置 2.3 自定义用户认证 2.4 自定义登录与注销 三、Spring Security 授权控制 3.1 基于角色的授权…

linux命令—stat

命令简介 stat是Linux中用于查看文件或文件系统的详细状态信息的强大命令。它比ls -l更全面,其输出信息包括但不限于:文件大小、权限、所有者、最后访问/修改/状态变更时间、inode号、所在设备信息等。 用法 stat命令的语法格式如下 stat [选项] 文件…

解决串口数据乱序问题

环境:jetson nano ubuntu 20.04python 3.12终于是找到解决串口乱序的最佳解决办法了,先来看看什么是串口乱序:这就是一个典型的串口乱序,我的发送端发送 的协议为0x55 0x51 ...0x55 0x52 ...0x55 0x53 ...0x55 0x54 ...在这四条协…

Spring的注解

声明Bean的注解 Component Controller Service Repository 后三种为Component的别名,之所以不同是因为可读性的考虑 Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Component public interface Controller {AliasFor(//别名an…

UVM寄存器模型与通道机制

接续UVM基础入门文章。前言重点讲述UVM常用的接口连接方式。寄存器模型:UVM寄存器模型(Register Model)是一组高级抽象的类,用于对DUT(Design Under Test)中具有地址映射的寄存器和存储器进行建模&#xff…

12.NModbus4在C#上的部署与使用 C#例子 WPF例子

一、Modbus TCP/IP是什么Modbus TCP/IP是一种基于TCP/IP协议的工业自动化通信协议。它在Modbus协议的基础上,利用TCP/IP网络进行数据传输,使得工业设备之间的通信更加便捷和高效。常用的Modbus功能码包括0x03(读保持寄存器)、0x06…

硬件开发2-汇编1(ARMv7-A)- 基本概要

一、汇编基本概要1、ARM数据和指令类型2、ARM字节顺序即可大端存储也可小端存储,默认小端存储(不建议修改)、kernel(内核)中的,CPSR(当前程序状态寄存器)可修改大小端存储3、ARM处理…

Linux中进程和线程常用的API详解

进程与线程基础及 Linux 进程间通信(IPC)详解 一、程序与进程 1. 程序(静态文件) 程序是存储在磁盘上的可执行文件,是静态实体,不占用 CPU、内存等运行时资源,仅占用磁盘空间。不同操作系统的可…

VS Code 插件开发教程

VS Code 插件开发教程 概述 Visual Studio Code(简称 VS Code)是一款由 Microsoft 开发的开源轻量级编辑器,支持跨平台(Windows、macOS、Linux)。 其最大的优势之一是强大的插件系统,开发者可以通过编写扩…

Docker技术解析

1.Docker安装 1.如果Ubuntu自带的Docker版本太低,我们需要卸载旧版本并安装新的 sudo apt-get remove docker docker-engine docker.io containerd runc2. 备份原有软件源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak3.选择合适的镜像源 # 或者使用…

TCP套接字的使用

Java中使⽤TCP协议通信,使用ServerSocket来建立链接,使用Socket进行通信.ServerSocketServerSocket是创建TCP服务端Socket的api,主要方法:方法签名说明ServerSocket(int port)创建一个服务端流套接字Socket,并绑定指定端口Socket accpet()开始监听指定端口,有客户端链接后,返回…

linux执行systemctl enable xxxxx 报 Failed to execute operation: Bad message

linux执行systemctl enable redis.service 报 Failed to execute operation: Bad message 如果在执行 systemctl enable 命令时遇到 "Failed to execute operation: Bad message" 错误,可能是由于以下几个原因导致的。你可以按照以下步骤进行排查和解决&a…

终端之外:解锁Linux命令行的魔法与力量

Linux命令行的核心理念 在记忆具体的指令之前,先理解它的哲学: 一切皆文件 :硬件设施,进程,目录…在Linux中几乎所有资源都被抽象为文件,这意味着你可以通过同样的指令(如 ench ,cat&#xff…

CSS 动画实战:实现电商中“加入购物车”的抛物线效果

引言 在电商网站中,“加入购物车”动画 是提升用户体验的经典交互之一。一个小小的商品图标从页面飘向购物车,不仅直观地反馈了操作结果,还能增加趣味性与沉浸感。 实现这一效果的方式有很多,比如 JavaScript 计算路径 动画&…