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

企业级VIP+Nginx的网络访问方案

前言

日常开发中,我们经常会使用虚拟IP(Virtual IP, VIP,下面就简称VIP)+Nginx实现应用的公网访问入口。使用公网域名通过DNS解析到VIP上,再通过VIP将Nginx(或任何服务)暴露到公网,是构建高可用(High Availability, HA)架构的核心手段。下面我为你详细解释为什么这是OK的,以及它是如何工作的。

为什么这是OK的且是推荐的做法?

  1. 高可用性(High Availability):

    • 你通常不会只部署一台Nginx服务器。一个健壮的架构至少会有两台或更多的Nginx服务器(作为一个集群)部署在后台。

    • 这个VIP并不固定绑定在某一台物理机或虚拟机的网卡上。它是一个“浮动”的IP。

    • 所有这些Nginx服务器都配置有这个VIP,但在同一时刻,只有一台服务器会持有并响应这个VIP(通常是通过Keepalived等软件实现)。

    • 如果当前持有VIP的那台Nginx服务器宕机了(硬件故障、网络中断、Nginx进程崩溃等),监控软件(如Keepalived)会立即检测到故障,并自动将VIP漂移(Floating) 到集群中的另一台健康的Nginx服务器上。

    • 对用户的影响:用户始终访问同一个VIP地址,他们几乎感知不到后端服务器的切换(可能会有一个非常短暂的中断)。这就实现了服务的高可用。

  2. 负载均衡(Load Balancing)的入口:

    • 这个VIP常常作为负载均衡器的入口IP。用户访问这个IP,流量被分发到后端的多个Nginx服务器(或者更后端的应用服务器,如Tomcat, PHP-FPM等)。

    • 即使Nginx本身也在做负载均衡,这个VIP仍然是整个流量入口的最佳抽象。

  3. 简化配置与维护:

    • 对用户/客户端:他们只需要记住一个IP地址或域名(域名解析到这个VIP),无需关心后端有多少台服务器,或者哪台是主、哪台是备。

    • 对运维人员:当需要扩容、缩容或更换后端服务器时,只需要在服务器集群内部操作即可。只要VIP不变,前端用户和客户端的所有配置都无需任何修改。

  4. 隐藏后端架构:

    • 公网只看到VIP,后端服务器的真实IP被隐藏起来,这增加了一定的安全性。

它是如何工作的?

最常见的实现方式是使用 Keepalived 软件。它的工作原理基于VRRP(虚拟路由冗余协议)

  1. 角色分配:在一个由两台服务器组成的集群中,一台被选举为MASTER,另一台为BACKUP

  2. VIP持有MASTER服务器会持有VIP并对外发送ARP广播,告知网络设备“这个VIP的MAC地址是我”。于是,所有发往VIP的网络包都会送到MASTER服务器。

  3. 健康检查MASTERBACKUP之间会通过多播心跳来互相检查状态。

  4. 故障转移(Failover)

    • 如果BACKUP在一段时间内收不到MASTER的心跳,它会认为MASTER宕机了。

    • BACKUP会接管VIP,并开始发送ARP广播,将VIP的MAC地址更新为自己的MAC地址。

    • 网络流量随之被引导到新的MASTER(即原来的BACKUP)上。

  5. 脑裂(Split-Brain):好的配置会避免这种情况,即网络分区导致两个节点都认为自己是MASTER并都持有VIP。

总结与最佳实践

特性单台服务器绑定公网IP通过VIP暴露公网IP
可用性低(单点故障)(自动故障转移)
可扩展性(易于水平扩容)
维护性差(变更影响用户)(后端变更对用户透明)
典型场景个人测试、非关键业务生产环境、企业级应用

 暴露一个VIP到公网作为服务的统一入口,是构建可靠、可扩展Web服务的标准模式。

注意事项

  • 确保你的VIP和后端服务器的真实IP在正确的网络分区(安全组/防火墙规则)中,只开放必要的端口(如80, 443)。
  • 使用Keepalived等成熟工具来自动化管理VIP和健康检查。
  • 如果你的云平台(如AWS, Azure, GCP)提供了原生的负载均衡器(如ALB/NLB),通常直接使用它们会是更托管、更便捷的选择,它们底层也是类似的原理。自建VIP方案则提供了更高的灵活性和控制权。

只需要将VIP暴露到公网,三台Nginx服务器的真实IP地址绝对不应该直接暴露到公网。这是一种标准的安全和网络架构最佳实践。下面我详细解释为什么以及如何实现。

核心原则:网络分区与角色隔离

一个安全的网络架构应该遵循“最小权限原则”并进行分区。在这个三节点Nginx集群中,不同的IP扮演着不同的角色:

  1. VIP (Virtual IP) - 公共面孔

    1. 角色:对互联网服务的唯一入口。

    2. 网络位置:位于公网(或DMZ区)。这是全世界用户都可以访问的地址。

    3. 目的:接收所有来自公网的流量,并将其负载均衡到后端。

  2. Nginx真实IP (Real IPs) - 内部工作者

    • 角色:实际处理工作的服务器。

    • 网络位置:位于私有内网(一个受保护的、与公网隔离的网络段)。这些IP地址不应该被互联网上的任何设备直接路由或访问。

    • 目的:接收来自VIP(或内网负载均衡器)的流量,处理请求,并与更后端的应用服务器(如App Server、数据库等,通常也在内网)通信。

为什么不能将Nginx真实IP暴露到公网?

  1. 极大的安全风险

    • 攻击面扩大:暴露三个IP意味着为攻击者提供了四个攻击目标(1个VIP + 3个Real IPs)。一旦攻击者绕过VIP直接攻击某一台真实服务器,就可能造成服务中断或数据泄露。

    • 绕过安全防护:如果你的VIP前端有DDoS防护、WAF(Web应用防火墙)等安全设施,直接访问真实IP将完全绕过这些保护,使服务器直接暴露在威胁之下。

    • 服务发现:暴露真实IP会让攻击者更容易摸清你的内部网络结构。

  2. 架构混乱与维护困难

    • 你的DNS记录应该只指向VIP。如果真实IP也暴露,用户或自动化脚本可能会错误地直接连接到某个真实IP。当这台服务器发生故障转移时,直接连它的用户就会访问失败。

    • 防火墙规则会变得极其复杂且难以维护。

  3. 浪费公网IP资源

    • 公网IPv4地址是稀缺资源。为不需要直接对外通信的服务器分配公网IP是一种浪费。

正确的网络流量路径是怎样的?

让我们以用户访问 https://www.example.com 为例,描述一个清晰的流量路径:

  1. 用户 -> 公网

    • 用户浏览器查询www.example.com的DNS,得到一个公网IP(即你的VIP)

  2. 公网 -> VIP (在Nginx Master上)

    • 用户的HTTPS请求发送到VIP。

    • 当前持有VIP的Nginx Master服务器(由Keepalived指定)接收到这个请求。

  3. VIP -> 内网负载均衡 (可选但推荐)

    • 场景A(使用VIP自带的主备功能):Master Nginx直接处理这个请求。如果它需要代理到后端应用服务器,流量会走内网

    • 场景B(使用Nginx做负载均衡):Master Nginx本身也作为一个负载均衡器(反向代理),它将接收到的请求,通过内网按照负载均衡策略(如轮询)分发给三台Nginx服务器中的一台(包括它自己)。这样三台服务器都能参与处理业务,充分利用资源。

  4. Nginx集群 -> 后端应用

    • 无论哪台Nginx服务器处理请求,它最终都会通过内网将代理的请求发送到后端的应用服务器、PHP-FPM、Tomcat等。

  5. 响应路径

    • 响应沿着完全相反的路径,通过内网,最终由接收到原始请求的Nginx服务器通过VIP返回给公网上的用户。

如何实现?关键配置:

  • 防火墙(Security Groups / ACLs)

    • VIP所在的安全组:开放公网入方向80443端口。出方向根据需要配置。

    • Nginx真实服务器的安全组

      • 入方向:只允许来自内网IP段(例如,10.0.0.0/16)的流量(如用于Keepalived心跳的端口112,以及Nginx健康检查的端口80)。绝对拒绝任何来自公网(0.0.0.0/0)的直接入站请求

      • 出方向:允许访问内网的后端服务以及必要的公网地址(如下载系统更新包)。

  • Keepalived

    • 在三台Nginx服务器上安装配置Keepalived,用于管理VIP的漂移。

    • vrrp心跳通信必须在内网中进行(在配置中指定心跳网络的接口或IP)。

总结

IP 类型暴露给公网?原因网络位置
虚拟IP (VIP)作为服务的唯一、稳定入口,实现高可用和负载均衡公网/DMZ
Nginx 真实IP绝对否避免安全风险,减少攻击面,遵循最小权限原则私有内网

所以,一般企业级应用,都是通过一个公网VIP面向世界,多台具有内网IP的Nginx服务器在后方组成集群,通过内网进行通信和故障转移。


文章转载自:

http://21VNVW8g.wLfxn.cn
http://rJkQNvKB.wLfxn.cn
http://OqwcxCRS.wLfxn.cn
http://E2YxvAQG.wLfxn.cn
http://bvCtFp3p.wLfxn.cn
http://DDNPokTO.wLfxn.cn
http://cNROPmZZ.wLfxn.cn
http://Sq1vcJy0.wLfxn.cn
http://xD40Jx1b.wLfxn.cn
http://nfKhftyS.wLfxn.cn
http://Rbpm9KGe.wLfxn.cn
http://QywYP48E.wLfxn.cn
http://TqoMJ5gc.wLfxn.cn
http://OJLeNGTX.wLfxn.cn
http://RcUMO9cU.wLfxn.cn
http://M4e2OobM.wLfxn.cn
http://NSyJ0NSP.wLfxn.cn
http://IRLy3kKn.wLfxn.cn
http://k6V3ETP9.wLfxn.cn
http://GJaS84Im.wLfxn.cn
http://GFTMZRgz.wLfxn.cn
http://DN1GdbJq.wLfxn.cn
http://PZQUO1Ny.wLfxn.cn
http://8qoKe2Sp.wLfxn.cn
http://k6Y9h1OL.wLfxn.cn
http://ea3d2awX.wLfxn.cn
http://6vLuFOxG.wLfxn.cn
http://oELFuMmJ.wLfxn.cn
http://ue6ZMOOQ.wLfxn.cn
http://Hz6YVMPt.wLfxn.cn
http://www.dtcms.com/a/381742.html

相关文章:

  • MySQL保姆级安装教程
  • 指针(五)后半
  • 贪心算法在GNN邻域采样问题中的深度解析
  • MongoDB简介
  • ego(4)---检测B样条轨迹的障碍物进入点与退出点
  • mysql 与 MongoDB 的分片
  • 大语言模型基石:Transformer
  • 【Flink】窗口
  • 2.3单链表
  • [RK3566][Android13] Android->屏蔽锁屏界面的时钟和日期显示
  • jetson orin super nano(arm linux系统)上读取大恒图像工业相机(型号MER-050-560U3C)教程
  • 关于Gateway configration studio软件配置网关
  • xtuoj 随机数
  • [硬件电路-186]:二极管的伏安特性看男女关系2:二极管的正向导通电流与动态电阻成反比关系
  • 网络安全渗透测试第一步信息收集
  • 界面规范11-对话框
  • 基于QCharView类封装绘制各种图表的示例(支持自画图形)
  • IoC / DI 实操
  • 一、Python开发准备
  • 《IDEA 突然“三无”?三秒找回消失的绿色启动键、主菜单和项目树!》
  • 解释 ICT, Web2.0, Web3.0 这些术语的中文含义
  • 区块链web3项目实战-Truffle petshop
  • 区块链学习笔记
  • NFT盗窃潮:法律视野下的区块链取证技术与数字资产保卫战
  • 数据分析:合并二
  • 怎么生成qt的pro文件
  • ChatGPT全面支持MCP,带来更多可能性
  • Qt第一课:Qt是什么?相对于其他框架的优劣势是什么
  • OPENGLPG第九版学习 - 细分着色器
  • 【官网开发】Docusaurus 建站初探-TypeScript 版-1