<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LVS on Liangweidong's blog</title><link>https://liangweidonggood.github.io/tags/lvs/</link><description>Recent content in LVS on Liangweidong's blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://liangweidonggood.github.io/tags/lvs/index.xml" rel="self" type="application/rss+xml"/><item><title>从 Nginx 到 LVS：流量调度在异地多活中的角色与实操</title><link>https://liangweidonggood.github.io/p/cong-nginx-dao-lvs/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0000</pubDate><guid>https://liangweidonggood.github.io/p/cong-nginx-dao-lvs/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/cong-nginx-dao-lvs/image/cover.jpg" alt="Featured image of post 从 Nginx 到 LVS：流量调度在异地多活中的角色与实操" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;Java Web 微服务系列 · 第 2 篇 · 流量调度
阅读时长：约 38 分钟
本文写于 2026 年 6 月
前置阅读：&lt;a class="link" href="https://liangweidonggood.github.io/p/yi-di-duo-huo/" &gt;《异地多活：Java Web 微服务的高可用终极形态》&lt;/a&gt;（系列第 1 篇）&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="引子流量调度是异地多活的前哨班"&gt;引子：流量调度是异地多活的&amp;quot;前哨班&amp;quot;
&lt;/h2&gt;&lt;p&gt;系列第 1 篇《异地多活：Java Web 微服务的高可用终极形态》我们讲清楚了&amp;quot;业务单元化 + 存储双向同步 + 流量层分片&amp;quot;是异地多活的三大支柱，并画了完整的架构图。但那张图里&lt;strong&gt;最顶上的&amp;quot;用户请求&amp;quot;到&amp;quot;机房入口&amp;quot;之间&lt;/strong&gt;，其实藏着一层很多人会忽略的细节——&lt;strong&gt;流量调度层&lt;/strong&gt;。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;本文约定&lt;/strong&gt;：本篇是系列第 2 篇，专攻&amp;quot;流量调度&amp;quot;这一层。读完你会知道：阿里、美团、字节这些大厂的异地多活架构，&lt;strong&gt;流量入口不是单一组件&lt;/strong&gt;，而是&amp;quot;&lt;strong&gt;公网 LB → LVS → Nginx → 应用网关&lt;/strong&gt;&amp;ldquo;四级串联的&amp;quot;前哨班&amp;rdquo;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;我们用一个真实场景开场：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;2021 年某电商双 11 零点，&lt;strong&gt;入口流量是平时的 30 倍&lt;/strong&gt;。第一道前哨——&lt;strong&gt;DNS 解析&lt;/strong&gt;——把用户路由到最近的 CDN 边缘节点，扛掉了 80% 的静态请求。剩下 20% 的动态请求进入机房后，第二道前哨——&lt;strong&gt;LVS&lt;/strong&gt;——在内核态做四层负载，把 50 万 QPS 均匀分给后方的 8 台 Nginx。第三道前哨——&lt;strong&gt;Nginx&lt;/strong&gt;——做七层路由（按 Host 头、URL 路径分流到不同微服务）。&lt;strong&gt;三层前哨环环相扣，任意一层挂掉，下一层都能自动承接&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这就是流量调度的全部奥秘——&lt;strong&gt;冗余 + 分流 + 自动故障切换&lt;/strong&gt;。本篇按&amp;quot;单机 → 双机 → 集群 → 跨城&amp;quot;的演进顺序，把这条前哨班完整搭一遍。&lt;strong&gt;实操部分会给你完整可复制粘贴的命令清单&lt;/strong&gt;，2 台虚拟机就能跑通整套 LVS + Keepalived + Nginx 链路。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一流量调度的本质4-层--7-层--高可用"&gt;一、流量调度的本质：4 层 / 7 层 / 高可用
&lt;/h2&gt;&lt;p&gt;异地多活架构里，&amp;ldquo;流量调度&amp;quot;听起来抽象，本质就是回答三个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;用户的请求先到谁？&lt;/strong&gt;（入口选择）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;到达入口后怎么分给后端？&lt;/strong&gt;（负载均衡）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后端某台机器挂了怎么办？&lt;/strong&gt;（高可用）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="11-三层位置流量调度在异地多活中的定位"&gt;1.1 三层位置：流量调度在异地多活中的定位
&lt;/h3&gt;&lt;p&gt;先把流量调度放到异地多活的整体架构里看：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 U[用户请求] --&gt; DNS[DNS&lt;br/&gt;GSLB全局负载]
 DNS --&gt; CDN[CDN边缘&lt;br/&gt;静态请求]
 CDN -.未命中.-&gt; LB[公网LB&lt;br/&gt;机房入口]
 LB --&gt; LVS[LVS四层&lt;br/&gt;内核态]
 LVS --&gt; NG[Nginx七层&lt;br/&gt;应用路由]
 NG --&gt; GW[Spring Cloud Gateway&lt;br/&gt;微服务路由]
 GW --&gt; APP[微服务集群&lt;br/&gt;异地多活单元化]

 style DNS fill:#457b9d,color:#fff
 style LB fill:#457b9d,color:#fff
 style LVS fill:#1d3557,color:#fff
 style NG fill:#1d3557,color:#fff
 style APP fill:#a8dadc&lt;/pre&gt;&lt;p&gt;这张图里，&lt;strong&gt;流量调度对应&amp;quot;公网 LB → LVS → Nginx&amp;quot;这三层&lt;/strong&gt;。本篇只讲这三层（DNS / CDN 属于另一条线，Spring Cloud Gateway 是微服务层的网关，留给系列第 3 篇）。&lt;/p&gt;
&lt;h3 id="12-4-层-vs-7-层性能与灵活性的权衡"&gt;1.2 4 层 vs 7 层：性能与灵活性的权衡
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;4 层（L4）&lt;/th&gt;
					&lt;th&gt;7 层（L7）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;工作层级&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;传输层（TCP/UDP）&lt;/td&gt;
					&lt;td&gt;应用层（HTTP/HTTPS）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;看的信息&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;源 IP、目标 IP、端口&lt;/td&gt;
					&lt;td&gt;全部 HTTP 头、URL、Cookie、Body&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;典型代表&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;LVS、Haproxy（四层模式）、AWS NLB&lt;/td&gt;
					&lt;td&gt;Nginx、Tengine、Envoy、Traefik&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;性能&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;几十万 QPS（内核态）&lt;/td&gt;
					&lt;td&gt;1-5 万 QPS（用户态）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;加密终结&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;不终结 TLS&lt;/td&gt;
					&lt;td&gt;可终结 TLS（看 https 证书）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;路由能力&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;仅 IP/端口级&lt;/td&gt;
					&lt;td&gt;Host / URL / Header / Cookie 级&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;典型用途&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;入口抗量、跨机房流量分发&lt;/td&gt;
					&lt;td&gt;域名路由、灰度、A/B 测试&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理：4 层为什么快？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;4 层负载工作在 Linux 内核协议栈的 &lt;code&gt;IPVS&lt;/code&gt;（IP Virtual Server）层，&lt;strong&gt;数据包在内核态就被转发了&lt;/strong&gt;，不再上送用户态。7 层负载必须把整个 TCP 流接完、解析 HTTP 头，才能决定转发给谁，&lt;strong&gt;至少多两次上下文切换 + 一次内存拷贝&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这就是 LVS 能扛 50 万 QPS 而 Nginx 只能扛 1-5 万 QPS 的根本原因。&lt;strong&gt;不是 LVS 算法多牛，是它根本不离开内核&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="13-流量调度的核心目标"&gt;1.3 流量调度的核心目标
&lt;/h3&gt;&lt;p&gt;不论用 Nginx 还是 LVS，流量调度的目标都只有 3 个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;均匀&lt;/strong&gt;：把请求均匀分给后端机器，避免热点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;健康&lt;/strong&gt;：自动剔除故障机器，恢复后自动加回&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;切换&lt;/strong&gt;：主节点故障时，备用节点秒级接管（Keepalived 负责）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这 3 个目标对应&lt;strong&gt;负载均衡算法&lt;/strong&gt;、&lt;strong&gt;健康检查&lt;/strong&gt;、&lt;strong&gt;故障转移&lt;/strong&gt;三个具体机制。后文逐个讲。&lt;/p&gt;
&lt;h3 id="14-4-层-vs-7-层一场持续-20-年的争论"&gt;1.4 4 层 vs 7 层：一场持续 20 年的争论
&lt;/h3&gt;&lt;p&gt;从 2002 年 Nginx 诞生起，&amp;ldquo;4 层够用还是必须 7 层&amp;quot;就是架构圈反复争论的话题。本质上是&lt;strong&gt;性能 vs 灵活性&lt;/strong&gt;的取舍：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4 层派&lt;/strong&gt;的论据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内核态转发，&lt;strong&gt;单包转发延迟 &amp;lt; 10 微秒&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;看不到应用层数据 = &lt;strong&gt;更安全&lt;/strong&gt;（攻击面小）&lt;/li&gt;
&lt;li&gt;协议无关，&lt;strong&gt;MySQL / Redis / MQTT / 游戏 TCP&lt;/strong&gt; 都能代理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;7 层派&lt;/strong&gt;的论据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;能看 HTTP 头，&lt;strong&gt;按 URL 路由 / 按 Cookie 灰度&lt;/strong&gt; 是刚需&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS 终结&lt;/strong&gt;在反代层，&lt;strong&gt;后端明文 HTTP 性能高 3 倍&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;业务错误码（如 5xx）能被反代识别，&lt;strong&gt;故障定位更准&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;实战结论&lt;/strong&gt;（业界 20 年沉淀的共识）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;入口第一跳&lt;/strong&gt;用 4 层（LVS）抗量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;入口第二跳&lt;/strong&gt;用 7 层（Nginx）做业务路由&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要&amp;quot;用 7 层做 4 层的事&amp;rdquo;&lt;/strong&gt;——比如用 Nginx 做 MySQL 代理，性能差 10 倍&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要&amp;quot;用 4 层做 7 层的事&amp;rdquo;&lt;/strong&gt;——比如想用 LVS 按 URL 路由，做不到&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理：4 层 + 7 层是&amp;quot;串联&amp;quot;不是&amp;quot;二选一&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;真正的生产架构是 &lt;strong&gt;4 层在前、7 层在后&lt;/strong&gt;，串联成两层。4 层负责&amp;quot;抗量 + 入口安全&amp;quot;，7 层负责&amp;quot;业务路由 + 灰度&amp;quot;。&lt;strong&gt;每一层做自己擅长的事&lt;/strong&gt;，不要试图用一层解决所有问题。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="15-为什么切换比均衡更重要"&gt;1.5 为什么&amp;quot;切换&amp;quot;比&amp;quot;均衡&amp;quot;更重要？
&lt;/h3&gt;&lt;p&gt;很多初学者以为负载均衡的核心是&amp;quot;&lt;strong&gt;算法选哪个&lt;/strong&gt;&amp;quot;（轮询、最少连接、一致性哈希……）。&lt;strong&gt;错&lt;/strong&gt;。真正决定系统可用性的是&lt;strong&gt;故障切换速度&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;算法选错&lt;/strong&gt;：后端 3 台机器变成 2 台在干活，QPS 降 33%，用户可能没感知&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;切换太慢&lt;/strong&gt;：后端 1 台机器挂了，10 秒内没人接管，&lt;strong&gt;所有打到这台机器的请求都失败&lt;/strong&gt;，用户感知强烈&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以本文会用&lt;strong&gt;大量篇幅讲 Keepalived 和 LVS 的故障切换&lt;/strong&gt;——这才是流量调度的&amp;quot;命门&amp;quot;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二单机-nginx1-万-qps-的边界"&gt;二、单机 Nginx：1 万 QPS 的边界
&lt;/h2&gt;&lt;h3 id="21-nginx-凭什么成为事实标准"&gt;2.1 Nginx 凭什么成为&amp;quot;事实标准&amp;quot;
&lt;/h3&gt;&lt;p&gt;Nginx 2002 年由俄罗斯工程师 Igor Sysoev 写出来，最初是为了解决 &lt;strong&gt;C10K 问题&lt;/strong&gt;——单机如何同时处理 1 万个并发连接。&lt;strong&gt;采用事件驱动的异步非阻塞模型&lt;/strong&gt;，用 1 个 worker 进程就能扛几千个连接。&lt;/p&gt;
&lt;p&gt;核心设计：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Master-Worker 模型&lt;/strong&gt;：1 个 master 进程负责管理，N 个 worker 进程负责处理请求（&lt;code&gt;worker_processes auto&lt;/code&gt; 默认等于 CPU 核数）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事件循环&lt;/strong&gt;：每个 worker 用 epoll（Linux）/ kqueue（BSD）系统调用，单线程处理所有连接&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存占用低&lt;/strong&gt;：每个连接约 2-4 KB，而 Apache 一个进程一个连接要 1-2 MB&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-反向代理的最简配置"&gt;2.2 反向代理的最简配置
&lt;/h3&gt;&lt;p&gt;Nginx 做反向代理的最核心 3 段配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /etc/nginx/nginx.conf
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;http&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 1. 定义后端集群
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;192.168.1.10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt; &lt;span class="s"&gt;weight=1&lt;/span&gt; &lt;span class="s"&gt;max_fails=3&lt;/span&gt; &lt;span class="s"&gt;fail_timeout=30s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;192.168.1.11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt; &lt;span class="s"&gt;weight=1&lt;/span&gt; &lt;span class="s"&gt;max_fails=3&lt;/span&gt; &lt;span class="s"&gt;fail_timeout=30s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;192.168.1.12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt; &lt;span class="s"&gt;weight=1&lt;/span&gt; &lt;span class="s"&gt;max_fails=3&lt;/span&gt; &lt;span class="s"&gt;fail_timeout=30s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 2. 终结 TLS（可选）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/cert/server.crt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/cert/server.key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 3. 路由到后端
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3 段配置的职责&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;upstream&lt;/code&gt;：声明后端服务器列表 + 负载均衡参数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;server { listen 443 ssl }&lt;/code&gt;：终结 HTTPS&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proxy_pass http://backend&lt;/code&gt;：把请求转给 upstream，&lt;strong&gt;这是反向代理的&amp;quot;反&amp;quot;字所在&lt;/strong&gt;——客户端只看到 Nginx，看不到后端&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="23-性能调优三件套worker--connection--keepalive"&gt;2.3 性能调优三件套：worker / connection / keepalive
&lt;/h3&gt;&lt;p&gt;Nginx 默认配置偏保守，生产环境必须调 3 个参数：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 主配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;worker_processes&lt;/span&gt; &lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# worker 数 = CPU 核数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;worker_rlimit_nofile&lt;/span&gt; &lt;span class="mi"&gt;65535&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 每个 worker 能打开的最大文件数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;events&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;worker_connections&lt;/span&gt; &lt;span class="mi"&gt;8192&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 每个 worker 能同时处理的连接数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;multi_accept&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 一次 accept 多个连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="s"&gt;epoll&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Linux 强制用 epoll
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;http&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;sendfile&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 零拷贝发送文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;tcp_nopush&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 合并多个 TCP 包
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;tcp_nodelay&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 禁用 Nagle 算法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 关键：keepalive 调优（与后端连接）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;192.168.1.10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;keepalive&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 与每台后端保持 32 个长连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;keepalive_timeout&lt;/span&gt; &lt;span class="s"&gt;60s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 长连接超时 60 秒
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;keepalive_requests&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 单个长连接最多处理 1000 个请求后关闭
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3 个核心参数的内在逻辑&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;参数&lt;/th&gt;
					&lt;th&gt;含义&lt;/th&gt;
					&lt;th&gt;调优依据&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;worker_processes&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;worker 进程数&lt;/td&gt;
					&lt;td&gt;等于 CPU 核数；过多导致上下文切换开销&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;worker_connections&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;每 worker 最大连接&lt;/td&gt;
					&lt;td&gt;受 &lt;code&gt;worker_rlimit_nofile&lt;/code&gt; 限制；理论最大并发 = workers × connections&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;keepalive&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;与后端保持的长连接数&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;关键！&lt;/strong&gt; 默认 0（每次新建 TCP 连接）会导致 TIME_WAIT 飙升&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点：keepalive 默认 0 的隐形坑&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nginx 默认与后端&lt;strong&gt;不保持长连接&lt;/strong&gt;（&lt;code&gt;upstream&lt;/code&gt; 里没有 &lt;code&gt;keepalive&lt;/code&gt; 指令时）。每个 HTTP 请求都要 3 次握手 + 4 次挥手，并发一大就出现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TIME_WAIT 状态连接数飙升&lt;/strong&gt;（端口耗尽）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后端 CPU 飙升&lt;/strong&gt;（accept 新连接 + 关闭旧连接的开销）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;生产配置必加 &lt;code&gt;keepalive 32&lt;/code&gt;&lt;/strong&gt;（与每台后端保持 32 个长连接池）。这是 Nginx 性能调优的&amp;quot;第一性原则&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="24-单机瓶颈1-万-qps-的天花板"&gt;2.4 单机瓶颈：1 万 QPS 的天花板
&lt;/h3&gt;&lt;p&gt;调优到极致后，单机 Nginx 的上限大约：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静态文件&lt;/strong&gt;：5-10 万 QPS（取决于磁盘 IO / CDN 协同）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态反代&lt;/strong&gt;：1-3 万 QPS（受后端应用限制）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS 终结&lt;/strong&gt;：5-8 千 QPS（CPU 密集，受证书算法影响）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;单机撑不住怎么办？&lt;/strong&gt; 两条路：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;路径&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
					&lt;th&gt;代价&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;垂直扩展&lt;/strong&gt;（换更牛机器）&lt;/td&gt;
					&lt;td&gt;业务量增长 50% 以内&lt;/td&gt;
					&lt;td&gt;边际成本急剧上升，10 万 QPS 后失效&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;水平扩展&lt;/strong&gt;（多加几台 Nginx）&lt;/td&gt;
					&lt;td&gt;长期增长&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;需要在前置加一层负载均衡&lt;/strong&gt;——这就引出了 Keepalived 和 LVS&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践：什么时候单机 Nginx 就够了？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;经验值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;日活 &amp;lt; 10 万&lt;/strong&gt;：单机 Nginx 足够&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日活 10-100 万&lt;/strong&gt;：Nginx + Keepalived 双机&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日活 &amp;gt; 100 万 或 强 SLA 4 个 9&lt;/strong&gt;：LVS + Keepalived + Nginx 三层塔&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但&lt;strong&gt;强可用性要求的系统&lt;/strong&gt;（金融、交易、支付），即使日活不高也要 LVS 三层塔——&lt;strong&gt;因为单机 Nginx 挂了就全挂，没有容错&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="25-epoll-详解nginx-高并发的内功心法"&gt;2.5 epoll 详解：Nginx 高并发的&amp;quot;内功心法&amp;quot;
&lt;/h3&gt;&lt;p&gt;Nginx 能扛高并发，核心在于它使用了 &lt;strong&gt;epoll&lt;/strong&gt;（Linux 2.6+ 内核提供的 I/O 多路复用接口）。要理解 epoll 是什么，先看传统模型的瓶颈：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;传统 BIO（Blocking I/O）模型&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 伪代码：每连接一线程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...);&lt;/span&gt; &lt;span class="c1"&gt;// 阻塞等待新连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handle_client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 每连接开 1 个线程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;1 万并发 = 1 万个线程。每个线程默认栈 8 MB，&lt;strong&gt;光内存就要 80 GB&lt;/strong&gt;。上下文切换开销也爆炸。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NIO（Non-blocking I/O）+ epoll 模型&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 伪代码：单线程事件循环
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;epoll_event&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_EVENTS&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;epfd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;epoll_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;epoll_wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;epfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAX_EVENTS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 阻塞等待事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;handle_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// 处理就绪的连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;epoll 的 3 个关键优势&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;优势&lt;/th&gt;
					&lt;th&gt;含义&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;事件驱动&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;只处理&amp;quot;就绪&amp;quot;的连接，未就绪的连接不消耗 CPU&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;O(1) 就绪查询&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;不管 1 万还是 100 万连接，就绪查询都是 O(1)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;内核-用户态共享内存&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;通过 &lt;code&gt;mmap&lt;/code&gt; 避免每次事件都从内核复制到用户态&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Nginx 的 worker 进程 = 1 个 epoll 循环。&lt;strong&gt;1 个 worker 处理 1 万连接只需几十 MB 内存&lt;/strong&gt;。这就是 Nginx &amp;ldquo;小马拉大车&amp;quot;的秘密。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点：worker 数不是越多越好&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;常见错误：&lt;code&gt;worker_processes 32&lt;/code&gt;（机器才 8 核）。&lt;strong&gt;32 个 worker 抢 8 个 CPU，频繁上下文切换，性能反而下降&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;正确配置：&lt;code&gt;worker_processes auto&lt;/code&gt;（让 Nginx 自动检测 CPU 核数）。&lt;strong&gt;worker 数 = CPU 核数&lt;/strong&gt;是经验最优值。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="三nginx--keepalived同城双活的经典双子星"&gt;三、Nginx + Keepalived：同城双活的&amp;quot;经典双子星&amp;rdquo;
&lt;/h2&gt;&lt;h3 id="31-为什么需要-keepalived"&gt;3.1 为什么需要 Keepalived
&lt;/h3&gt;&lt;p&gt;单机 Nginx 的&amp;quot;高可用&amp;quot;问题是：&lt;strong&gt;Nginx 机器本身挂了怎么办？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用户访问的 IP 是 Nginx 机器的 IP，Nginx 挂了，IP 跟着没了。&lt;strong&gt;必须有一个&amp;quot;备用 Nginx&amp;quot;能在主 Nginx 挂掉时接管 IP&lt;/strong&gt;——这就是 Keepalived 干的事。&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR
 U[用户] --&gt; V[Virtual IP&lt;br/&gt;192.168.1.100]
 V --&gt;|平时| M[Master Nginx&lt;br/&gt;192.168.1.10]
 V -.故障时.-&gt; B[Backup Nginx&lt;br/&gt;192.168.1.11]
 M --&gt; APP1[应用 1]
 M --&gt; APP2[应用 2]
 B --&gt; APP1
 B --&gt; APP2

 style M fill:#1d3557,color:#fff
 style B fill:#457b9d,color:#fff&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Virtual IP（VIP）&lt;/strong&gt; 是关键：用户访问的 &lt;code&gt;192.168.1.100&lt;/code&gt; 不是任何机器的物理 IP，而是一个&lt;strong&gt;虚拟 IP&lt;/strong&gt;，由 Keepalived 在主备机器之间漂移。&lt;/p&gt;
&lt;h3 id="32-vrrp-协议vip-漂移的原理"&gt;3.2 VRRP 协议：VIP 漂移的原理
&lt;/h3&gt;&lt;p&gt;Keepalived 的核心是 &lt;strong&gt;VRRP 协议&lt;/strong&gt;（Virtual Router Redundancy Protocol，虚拟路由冗余协议）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;多台机器组成一个&amp;quot;VRRP 路由器组&amp;quot;&lt;/strong&gt;，共享一个 VIP&lt;/li&gt;
&lt;li&gt;选出一台 &lt;strong&gt;Master&lt;/strong&gt;，其他是 &lt;strong&gt;Backup&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Master 周期性（默认 1 秒）发送 VRRP 通告（advertisement）&lt;/li&gt;
&lt;li&gt;Backup 收不到通告（连续 3 次 = 3 秒）就认为 Master 挂了，&lt;strong&gt;自己升级为 Master，接管 VIP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Master 恢复后默认会&amp;quot;抢占&amp;quot;回 VIP（&lt;strong&gt;可通过 &lt;code&gt;nopreempt&lt;/code&gt; 关闭&lt;/strong&gt;）&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理：为什么是 3 秒而不是立刻切换？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;默认 3 秒切换是权衡：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;太快&lt;/strong&gt;（&amp;lt; 1 秒）：网络抖动会被误判为故障，导致&amp;quot;双 Master&amp;quot;脑裂&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;太慢&lt;/strong&gt;（&amp;gt; 10 秒）：业务已经超时，用户感知到中断&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3 秒是&lt;strong&gt;保守且工程化的折中值&lt;/strong&gt;。生产环境可通过 &lt;code&gt;vrrp_script&lt;/code&gt; 自定义健康检查，把切换时间压到 1-2 秒。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="33-keepalived-配置实战主备模式"&gt;3.3 Keepalived 配置实战（主备模式）
&lt;/h3&gt;&lt;h4 id="331-准备-2-台机器"&gt;3.3.1 准备 2 台机器
&lt;/h4&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;角色&lt;/th&gt;
					&lt;th&gt;IP&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Master&lt;/td&gt;
					&lt;td&gt;192.168.1.10&lt;/td&gt;
					&lt;td&gt;主 Nginx，持有 VIP&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Backup&lt;/td&gt;
					&lt;td&gt;192.168.1.11&lt;/td&gt;
					&lt;td&gt;备 Nginx，平时空闲&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;VIP&lt;/td&gt;
					&lt;td&gt;192.168.1.100&lt;/td&gt;
					&lt;td&gt;对外服务的虚拟 IP&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;两台机器都装好 Nginx（监听 VIP）+ Keepalived。&lt;/p&gt;
&lt;h4 id="332-master-配置-etckeepalivedkeepalivedconf"&gt;3.3.2 Master 配置 &lt;code&gt;/etc/keepalived/keepalived.conf&lt;/code&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;!&lt;/span&gt; &lt;span class="s"&gt;Configuration&lt;/span&gt; &lt;span class="s"&gt;File&lt;/span&gt; &lt;span class="s"&gt;for&lt;/span&gt; &lt;span class="s"&gt;keepalived&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;global_defs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;router_id&lt;/span&gt; &lt;span class="s"&gt;NGINX_MASTER&lt;/span&gt; &lt;span class="c1"&gt;# 唯一标识，集群内不能重复
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;script_user&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;enable_script_security&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 健康检查：Nginx 进程是否存活
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;vrrp_script&lt;/span&gt; &lt;span class="s"&gt;check_nginx&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;script&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;/usr/local/bin/check_nginx.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;interval&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="c1"&gt;# 每 2 秒检查一次
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;weight&lt;/span&gt; &lt;span class="s"&gt;-20&lt;/span&gt; &lt;span class="c1"&gt;# 失败时优先级降 20
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;fall&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="c1"&gt;# 连续失败 3 次才认为故障
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;rise&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="c1"&gt;# 连续成功 2 次才算恢复
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;timeout&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="c1"&gt;# 单次检查超时 2 秒
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# VRRP 实例定义
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;vrrp_instance&lt;/span&gt; &lt;span class="s"&gt;VI_1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;state&lt;/span&gt; &lt;span class="s"&gt;MASTER&lt;/span&gt; &lt;span class="c1"&gt;# 初始状态 MASTER
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;interface&lt;/span&gt; &lt;span class="s"&gt;eth0&lt;/span&gt; &lt;span class="c1"&gt;# 绑定的网卡
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;virtual_router_id&lt;/span&gt; &lt;span class="mi"&gt;51&lt;/span&gt; &lt;span class="c1"&gt;# 虚拟路由 ID（主备必须一致）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;priority&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="c1"&gt;# 优先级（MASTER &amp;gt; BACKUP）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;advert_int&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# VRRP 通告间隔 1 秒
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;authentication&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;auth_type&lt;/span&gt; &lt;span class="s"&gt;PASS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;auth_pass&lt;/span&gt; &lt;span class="mi"&gt;1111&lt;/span&gt; &lt;span class="c1"&gt;# 简单密码，生产建议复杂
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;virtual_ipaddress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;192.168.1.100/24&lt;/span&gt; &lt;span class="s"&gt;dev&lt;/span&gt; &lt;span class="s"&gt;eth0&lt;/span&gt; &lt;span class="s"&gt;label&lt;/span&gt; &lt;span class="n"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# VIP 配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;track_script&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;check_nginx&lt;/span&gt; &lt;span class="c1"&gt;# 引用上面的健康检查
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;nopreempt&lt;/span&gt; &lt;span class="c1"&gt;# 故障恢复后不抢占（避免抖动）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;notify_master&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;/usr/local/bin/notify.sh&lt;/span&gt; &lt;span class="s"&gt;master&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;notify_backup&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;/usr/local/bin/notify.sh&lt;/span&gt; &lt;span class="s"&gt;backup&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;notify_fault&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;/usr/local/bin/notify.sh&lt;/span&gt; &lt;span class="s"&gt;fault&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="333-backup-配置只改-3-处"&gt;3.3.3 Backup 配置（只改 3 处）
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;vrrp_instance&lt;/span&gt; &lt;span class="s"&gt;VI_1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;state&lt;/span&gt; &lt;span class="s"&gt;BACKUP&lt;/span&gt; &lt;span class="c1"&gt;# ← 改成 BACKUP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;priority&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt; &lt;span class="c1"&gt;# ← 优先级低于 MASTER
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 其他完全一致
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="334-健康检查脚本-usrlocalbincheck_nginxsh"&gt;3.3.4 健康检查脚本 &lt;code&gt;/usr/local/bin/check_nginx.sh&lt;/code&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检查 Nginx 是否存活&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;ps -ef &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;nginx: master process&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -v grep &lt;span class="p"&gt;|&lt;/span&gt; wc -l&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt; -eq &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# 失败返回非 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x /usr/local/bin/check_nginx.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="335-启动与验证"&gt;3.3.5 启动与验证
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 两台机器分别启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl start keepalived
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; keepalived
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Master 上验证 VIP 是否绑定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip addr show eth0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 应该能看到 eth0:1 192.168.1.100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 模拟 Master 故障&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl stop keepalived
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 在 Backup 上看 VIP 是否漂移过来&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip addr show eth0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# eth0:1 192.168.1.100 漂过来了 ✓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="34-nginx-端的-5-个真实-keepalive-参数"&gt;3.4 Nginx 端的 5 个真实 keepalive 参数
&lt;/h3&gt;&lt;p&gt;Nginx 跟后端&lt;strong&gt;保持长连接&lt;/strong&gt;这 5 个参数必须配对出现，少一个就掉坑里：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;192.168.1.20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;keepalive&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# ① 启用长连接池，每 worker 与后端保持 32 个连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="s"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# ② HTTP/1.1（keepalive 必须的协议）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# ③ 清空 Connection 头（关键！避免后端 close）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ④ ⑤ 这两个参数在 upstream 块
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;参数&lt;/th&gt;
					&lt;th&gt;作用&lt;/th&gt;
					&lt;th&gt;不配的后果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;keepalive 32&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;启用连接池&lt;/td&gt;
					&lt;td&gt;每次新建 TCP 连接，性能差 5 倍&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;proxy_http_version 1.1&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;HTTP/1.1 协议&lt;/td&gt;
					&lt;td&gt;1.0 不支持 keepalive&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;proxy_set_header Connection &amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;清空 Connection 头&lt;/td&gt;
					&lt;td&gt;后端收到 &lt;code&gt;Connection: close&lt;/code&gt; 主动关连接&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;keepalive_timeout 60s&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;连接池超时&lt;/td&gt;
					&lt;td&gt;连接长时间不释放&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;keepalive_requests 1000&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;单连接最多请求数&lt;/td&gt;
					&lt;td&gt;防止单个长连接无限累积状态&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点：&lt;code&gt;Connection: close&lt;/code&gt; 是隐形杀手&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;proxy_set_header Connection &amp;quot;&amp;quot;&lt;/code&gt; 这一行看起来&amp;quot;无关紧要&amp;quot;，&lt;strong&gt;实际上是最容易踩的坑&lt;/strong&gt;。如果不写，Nginx 默认会把客户端的 &lt;code&gt;Connection: close&lt;/code&gt; 透传给后端，&lt;strong&gt;后端收到后主动关闭 TCP 连接&lt;/strong&gt;——keepalive 形同虚设。&lt;/p&gt;
&lt;p&gt;现象：监控看到 Nginx 到后端的连接数正常，但后端 &lt;code&gt;netstat -an&lt;/code&gt; 看到大量 TIME_WAIT 状态。&lt;strong&gt;100% 是这个参数没配&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="35-脑裂keepalived-最大的坑"&gt;3.5 脑裂：Keepalived 最大的坑
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;脑裂（split-brain）&lt;/strong&gt;：Master 和 Backup 同时认为自己是 Master，&lt;strong&gt;同时持有 VIP&lt;/strong&gt;。结果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户请求被随机分到两台机器&lt;/li&gt;
&lt;li&gt;两台机器状态不一致，数据被双向覆盖&lt;/li&gt;
&lt;li&gt;监控告警狂响，运维一脸懵&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;脑裂的 3 大成因&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;网络分区&lt;/strong&gt;：Master 和 Backup 之间的心跳线中断，但 Master 实际还活着&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防火墙拦截 VRRP 通告&lt;/strong&gt;：VRRP 用多播地址 &lt;code&gt;224.0.0.18&lt;/code&gt;，某些安全策略会拦&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优先级配置错误&lt;/strong&gt;：两台机器优先级都设成 100，谁都觉得自己是 Master&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;脑裂的 3 道防线&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 防线 1：使用单播 VRRP 通告（避开多播问题）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vrrp_instance VI_1 &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; unicast_src_ip 192.168.1.10 &lt;span class="c1"&gt;# 本机 IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; unicast_peer &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 192.168.1.11 &lt;span class="c1"&gt;# 对端 IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 防线 2：双心跳线（主备之间连 2 根网线 + 2 个交换机）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 防线 3：业务侧防脑裂检测（脚本检查双 VIP 冲突时报警）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;误区警示：脑裂 = 数据灾难&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;脑裂一旦发生，&lt;strong&gt;比单点故障更可怕&lt;/strong&gt;。单点故障至少业务中断是确定的，脑裂是&amp;quot;两台机器各自服务一部分用户，状态还不一致&amp;quot;——&lt;strong&gt;数据被双向覆盖，等发现时已经无法回滚&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;防御永远比治疗重要：单播 VRRP + 独立心跳线 + 业务侧冲突检测，&lt;strong&gt;三道防线缺一不可&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="四lvs跨城市流量调度的内核王牌"&gt;四、LVS：跨城市流量调度的内核王牌
&lt;/h2&gt;&lt;h3 id="41-为什么需要-lvsnginx-的天花板"&gt;4.1 为什么需要 LVS：Nginx 的天花板
&lt;/h3&gt;&lt;p&gt;Nginx + Keepalived 能扛 1-5 万 QPS（同城双活），但遇到大促、双 11 之类 50 万 QPS 场景就&lt;strong&gt;远远不够&lt;/strong&gt;。Nginx 是用户态进程，受限于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单进程事件循环（虽然多 worker 提升有限）&lt;/li&gt;
&lt;li&gt;HTTP 协议解析开销&lt;/li&gt;
&lt;li&gt;内存带宽&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;LVS 走的是另一条路&lt;/strong&gt;：直接在内核协议栈里转发数据包，&lt;strong&gt;根本不进入用户态&lt;/strong&gt;。理论上限是&lt;strong&gt;几十万到百万 QPS&lt;/strong&gt;，是 Nginx 的 10-50 倍。&lt;/p&gt;
&lt;h3 id="42-lvs-的-4-种工作模式"&gt;4.2 LVS 的 4 种工作模式
&lt;/h3&gt;&lt;p&gt;LVS 有 4 种转发模式（NAT / DR / TUN / FULLNAT），每种对应不同的网络拓扑：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 C[Client] --&gt; LB[LVS Server]
 LB --&gt;|NAT模式| RS[Real Server]
 LB --&gt;|DR模式| RS
 LB -.-&gt;|TUN模式| RS
 LB -.-&gt;|FULLNAT模式| RS

 style LB fill:#1d3557,color:#fff
 style RS fill:#457b9d,color:#fff&lt;/pre&gt;&lt;h4 id="421-nat-模式network-address-translation"&gt;4.2.1 NAT 模式（Network Address Translation）
&lt;/h4&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;sequenceDiagram
 participant C as Client
 participant L as LVS
 participant R as Real Server

 C-&gt;&gt;L: src=C_IP, dst=VIP:80
 L-&gt;&gt;R: src=L_IP, dst=R_IP:80 (DNAT)
 R-&gt;&gt;L: src=R_IP, dst=L_IP (响应)
 L-&gt;&gt;C: src=VIP:80, dst=C_IP (SNAT)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;进出都经过 LVS&lt;/strong&gt;（进出流量都改 IP）&lt;/li&gt;
&lt;li&gt;Real Server 可以跨网段（甚至跨 VLAN）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LVS 是性能瓶颈&lt;/strong&gt;（双向流量都过它）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适合小规模、Real Server 少&lt;/strong&gt;的场景&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="422-dr-模式direct-routing直接路由-最常用"&gt;4.2.2 DR 模式（Direct Routing，直接路由）⭐ 最常用
&lt;/h4&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;sequenceDiagram
 participant C as Client
 participant L as LVS
 participant R as Real Server

 C-&gt;&gt;L: src=C_IP, dst=VIP:80
 L-&gt;&gt;R: src=C_IP, dst=VIP:80 (改MAC，不改IP)
 R-&gt;&gt;C: src=VIP:80, dst=C_IP (直接回客户端)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;请求进 LVS，响应直接出 Real Server&lt;/strong&gt;（响应不经过 LVS）&lt;/li&gt;
&lt;li&gt;LVS 只负责&amp;quot;改 MAC 地址&amp;quot;（L2 转发）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能最高&lt;/strong&gt;（LVS 只承担一半流量）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real Server 必须和 LVS 在同一 VLAN&lt;/strong&gt;（L2 互通）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real Server 需要配置 VIP 在 lo 网卡上&lt;/strong&gt;（让它能处理目的 IP 是 VIP 的包）&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理：DR 模式为什么快？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DR 模式 LVS 做的只是&lt;strong&gt;改 MAC 地址&lt;/strong&gt;——把数据包的目的 MAC 从 LVS 自己的改成 Real Server 的。&lt;strong&gt;包头 IP 都不动&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;整个过程在内核的 &lt;code&gt;IPVS&lt;/code&gt; 模块完成，&lt;strong&gt;单次转发 &amp;lt; 10 微秒&lt;/strong&gt;。而 NAT 模式要改 IP + 改端口 + 算校验和，&lt;strong&gt;慢 10 倍&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="423-tun-模式ip-tunnelingip-隧道"&gt;4.2.3 TUN 模式（IP Tunneling，IP 隧道）
&lt;/h4&gt;&lt;p&gt;把数据包再封装一层 IP 头，通过隧道发给 Real Server。&lt;strong&gt;Real Server 可以跨地域&lt;/strong&gt;（公网可达即可），但需要在 Real Server 上做解封装。&lt;/p&gt;
&lt;h4 id="424-fullnat-模式阿里独创"&gt;4.2.4 FULLNAT 模式（阿里独创）
&lt;/h4&gt;&lt;p&gt;双向都做 SNAT + DNAT，&lt;strong&gt;Real Server 看不到客户端真实 IP&lt;/strong&gt;（双向都改 IP）。解决了 DR 模式必须同 VLAN 的限制，是阿里云 SLB 的核心实现。&lt;/p&gt;
&lt;h4 id="425-4-种模式对比"&gt;4.2.5 4 种模式对比
&lt;/h4&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;性能&lt;/th&gt;
					&lt;th&gt;Real Server 跨网段&lt;/th&gt;
					&lt;th&gt;Real Server 看到真实 IP&lt;/th&gt;
					&lt;th&gt;配置复杂度&lt;/th&gt;
					&lt;th&gt;典型场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;NAT&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;中（双向过 LVS）&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
					&lt;td&gt;小规模、内网环境&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;DR&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;⭐⭐⭐ 最高&lt;/td&gt;
					&lt;td&gt;❌（必须同 VLAN）&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;同城机房&lt;/strong&gt;（最常用）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;TUN&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;✅（隧道可达）&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;跨地域、异构网络&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;FULLNAT&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;中高&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;云厂商、跨 VPC&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="43-ipvslvs-的内核态实现"&gt;4.3 IPVS：LVS 的内核态实现
&lt;/h3&gt;&lt;p&gt;LVS 本身是一个框架，&lt;strong&gt;核心实现叫 IPVS&lt;/strong&gt;（IP Virtual Server），是 Linux 内核 2.6 后内置的模块：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看本机是否支持 IPVS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;modprobe ip_vs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsmod &lt;span class="p"&gt;|&lt;/span&gt; grep ip_vs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# IPVS 的工作流程（内核态）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 数据包从网卡进入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. netfilter 钩子（PREROUTING）拦截&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. IPVS 模块判断目的 IP 是否是 VIP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. 若是 VIP → 查 LVS 规则 → 选一个 Real Server → 改包头（MAC/IP）→ 发出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 5. Real Server 处理后直接回客户端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;IPVS vs iptables&lt;/strong&gt;：很多人误以为 LVS 是用户态工具，其实&lt;strong&gt;所有转发逻辑都在内核&lt;/strong&gt;。&lt;code&gt;ipvsadm&lt;/code&gt; 只是配置命令（&lt;code&gt;ipvsadm -A -t VIP:80 -s rr&lt;/code&gt; 添加规则），规则写入内核后，&lt;strong&gt;包转发完全在内核态完成&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="44-lvs-调度算法"&gt;4.4 LVS 调度算法
&lt;/h3&gt;&lt;p&gt;LVS 支持 10+ 种调度算法，常用的有 5 种：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;算法&lt;/th&gt;
					&lt;th&gt;含义&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;rr&lt;/strong&gt;（Round Robin）&lt;/td&gt;
					&lt;td&gt;轮询&lt;/td&gt;
					&lt;td&gt;后端性能一致（最常用）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;wrr&lt;/strong&gt;（Weighted RR）&lt;/td&gt;
					&lt;td&gt;加权轮询&lt;/td&gt;
					&lt;td&gt;后端性能不均&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;lc&lt;/strong&gt;（Least Connection）&lt;/td&gt;
					&lt;td&gt;最少连接&lt;/td&gt;
					&lt;td&gt;长连接服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;wlc&lt;/strong&gt;（Weighted LC）&lt;/td&gt;
					&lt;td&gt;加权最少连接&lt;/td&gt;
					&lt;td&gt;⭐ 推荐默认&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;sh&lt;/strong&gt;（Source Hashing）&lt;/td&gt;
					&lt;td&gt;源 IP 哈希&lt;/td&gt;
					&lt;td&gt;需要会话保持&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置示例：8 台 Real Server 轮询&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipvsadm -A -t 192.168.1.100:80 -s rr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -g
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.21:80 -g
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ... 一共 8 台&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;-g&lt;/code&gt; 表示 DR 模式（gatewaying），&lt;code&gt;-m&lt;/code&gt; 是 NAT，&lt;code&gt;-i&lt;/code&gt; 是 TUN。&lt;/p&gt;
&lt;h3 id="45-lvs-真实性能数据"&gt;4.5 LVS 真实性能数据
&lt;/h3&gt;&lt;p&gt;生产环境的 LVS 集群典型数据：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;业务&lt;/th&gt;
					&lt;th&gt;LVS 模式&lt;/th&gt;
					&lt;th&gt;Real Server 数&lt;/th&gt;
					&lt;th&gt;峰值 QPS&lt;/th&gt;
					&lt;th&gt;备注&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;阿里云 SLB&lt;/td&gt;
					&lt;td&gt;FULLNAT&lt;/td&gt;
					&lt;td&gt;数百&lt;/td&gt;
					&lt;td&gt;千万级&lt;/td&gt;
					&lt;td&gt;单集群扛住双 11&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;美团 MGW&lt;/td&gt;
					&lt;td&gt;DR&lt;/td&gt;
					&lt;td&gt;数十&lt;/td&gt;
					&lt;td&gt;百万级&lt;/td&gt;
					&lt;td&gt;入口流量调度&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;某电商大促&lt;/td&gt;
					&lt;td&gt;DR&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
					&lt;td&gt;50 万&lt;/td&gt;
					&lt;td&gt;单机房&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;某金融核心&lt;/td&gt;
					&lt;td&gt;NAT&lt;/td&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;5 万&lt;/td&gt;
					&lt;td&gt;强一致场景&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践：LVS 的&amp;quot;理论极限&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;单 LVS 节点性能上限取决于包转发能力（pps）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;普通服务器&lt;/strong&gt;（千兆网卡）：148 万 pps ≈ 50 万 QPS（小包）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DPDK 优化&lt;/strong&gt;：千万 pps&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内核优化&lt;/strong&gt;（&lt;code&gt;irqbalance&lt;/code&gt;、&lt;code&gt;RPS/RFS&lt;/code&gt;）：300 万 pps&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际生产中 LVS 不会是瓶颈——&lt;strong&gt;网络才是&lt;/strong&gt;。千兆网卡满载 = 148 万 pps ≈ 50 万 HTTP QPS（按平均 200 字节包算）。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="46-lvs-的历史与章文嵩的故事"&gt;4.6 LVS 的历史与章文嵩的故事
&lt;/h3&gt;&lt;p&gt;讲 LVS 不能不提它的作者——&lt;strong&gt;章文嵩&lt;/strong&gt;。1998 年他还是国防科技大学的一名博士生，&lt;strong&gt;因为实验室的 Web 服务器扛不住大量并发访问&lt;/strong&gt;，自己动手写了 IPVS 模块并贡献给 Linux 内核。这是&lt;strong&gt;中国人主导的、为数不多的内核级基础设施项目&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LVS 的几个关键时间节点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1998&lt;/strong&gt;：章文嵩在国防科大开发 LVS 1.0 版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2002&lt;/strong&gt;：LVS 2.0 发布，加入 NAT / DR / TUN 三种模式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2004&lt;/strong&gt;：IPVS 正式并入 Linux 2.6 内核主线&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2010s&lt;/strong&gt;：阿里基于 LVS 开发 FULLNAT 模式，解决云环境跨 VPC 问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2020s&lt;/strong&gt;：LVS 仍是云厂商负载均衡的事实标准内核&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理：为什么 LVS 20 年不过时？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;LVS 之所以能在 Service Mesh、Envoy、eBPF 等新技术层出不穷的今天仍占据入口调度，核心原因：&lt;strong&gt;它在内核&lt;/strong&gt;。任何用户态的方案（Nginx / HAProxy / Envoy）都要走系统调用 → 内核协议栈的路径，而 LVS 本身就在内核协议栈里，&lt;strong&gt;少一次上下文切换就少 5-10 微秒&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这是物理规律决定的，&lt;strong&gt;不是软件能优化的&lt;/strong&gt;。eBPF 虽然也在内核，但目前 L4 场景仍未全面取代 IPVS。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="47-lvs-vs-haproxy4-层反代的双雄之争"&gt;4.7 LVS vs HAProxy：4 层反代的&amp;quot;双雄之争&amp;quot;
&lt;/h3&gt;&lt;p&gt;HAProxy 也是 4 层反代的常见选择（同公司还有 Nginx Ingress 也在用），与 LVS 形成竞争：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;LVS&lt;/th&gt;
					&lt;th&gt;HAProxy&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;实现位置&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Linux 内核（IPVS）&lt;/td&gt;
					&lt;td&gt;用户态进程&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;性能&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;百万级 QPS&lt;/td&gt;
					&lt;td&gt;10-30 万 QPS&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;配置复杂度&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;中（ipvsadm 命令）&lt;/td&gt;
					&lt;td&gt;低（haproxy.cfg 文件）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;健康检查&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;TCP_CHECK / HTTP_GET&lt;/td&gt;
					&lt;td&gt;更丰富（支持脚本）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;日志&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;内核态，无业务日志&lt;/td&gt;
					&lt;td&gt;详细业务日志&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;典型场景&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;入口抗量、超大规模&lt;/td&gt;
					&lt;td&gt;中等规模、需业务可观测&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;实战选择&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;超大规模（&amp;gt; 50 万 QPS）&lt;/strong&gt;：LVS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中等规模 + 需详细日志&lt;/strong&gt;：HAProxy&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;云环境 / 容器环境&lt;/strong&gt;：HAProxy（K8s 默认 kube-proxy 用的就是 iptables/IPVS，HAProxy 在 Ingress 层常见）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="五lvs--keepalived--nginx异地多活流量层完整链路"&gt;五、LVS + Keepalived + Nginx：异地多活流量层完整链路
&lt;/h2&gt;&lt;h3 id="51-经典三层塔架构"&gt;5.1 经典三层塔架构
&lt;/h3&gt;&lt;p&gt;把 LVS、Keepalived、Nginx 串起来，就是异地多活流量层的&amp;quot;前哨班&amp;quot;完整链路：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 U[用户] --&gt; VIP[VIP 192.168.1.100&lt;br/&gt;公网入口]
 VIP --&gt; LVS1[LVS Master&lt;br/&gt;eth0: VIP]
 VIP -.故障切换.-&gt; LVS2[LVS Backup&lt;br/&gt;eth0: VIP]
 LVS1 --&gt;|DR模式&lt;br/&gt;只改MAC| N1[Nginx 1]
 LVS1 --&gt; N2[Nginx 2]
 LVS1 --&gt; N3[Nginx 3]
 LVS1 --&gt; N4[Nginx 4]
 LVS2 -.接管.-&gt; N1
 LVS2 -.接管.-&gt; N2
 LVS2 -.接管.-&gt; N3
 LVS2 -.接管.-&gt; N4
 N1 --&gt; APP[微服务集群]
 N2 --&gt; APP
 N3 --&gt; APP
 N4 --&gt; APP

 style LVS1 fill:#1d3557,color:#fff
 style LVS2 fill:#457b9d,color:#fff
 style N1 fill:#a8dadc
 style N2 fill:#a8dadc
 style N3 fill:#a8dadc
 style N4 fill:#a8dadc&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;为什么需要 3 层而不是直接 LVS → App？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LVS 看不到 HTTP 头&lt;/strong&gt;：无法按 Host / URL 路由（4 层限制）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LVS 无法终结 TLS&lt;/strong&gt;：HTTPS 终结在 Nginx 更省 CPU&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LVS 无法做应用层健康检查&lt;/strong&gt;：Nginx 的 &lt;code&gt;upstream_check&lt;/code&gt; 模块能做更精细的健康探测&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理：三层塔的职责边界&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LVS 层&lt;/strong&gt;：抗量 + 故障切换（不在乎协议内容）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nginx 层&lt;/strong&gt;：七层路由 + TLS 终结 + 应用层健康检查&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用层&lt;/strong&gt;：业务逻辑 + 微服务路由&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;每一层只做自己擅长的事&lt;/strong&gt;，这是分布式系统设计的&amp;quot;第一性原则&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="52-双-keepalived-实例设计"&gt;5.2 双 Keepalived 实例设计
&lt;/h3&gt;&lt;p&gt;实战中，&lt;strong&gt;LVS 层和 Nginx 层都要 Keepalived 保护&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 VIP1[公网 VIP&lt;br/&gt;LVS 入口] --&gt; LVSKA[Keepalived 1&lt;br/&gt;保 LVS]
 LVSKA --&gt; LVS_A[LVS Master]
 LVSKA -.-&gt; LVS_B[LVS Backup]
 LVS_A --&gt;|DR| N_A[Nginx 1]
 LVS_A --&gt;|DR| N_B[Nginx 2]
 LVS_B -.接管.-&gt; N_A
 LVS_B -.接管.-&gt; N_B
 VIP2[内网 VIP&lt;br/&gt;Nginx 入口] --&gt; NGKA[Keepalived 2&lt;br/&gt;保 Nginx]
 NGKA --&gt; N_A
 NGKA -.-&gt; N_B
 N_A --&gt; APP[应用]
 N_B --&gt; APP

 style LVSKA fill:#1d3557,color:#fff
 style NGKA fill:#457b9d,color:#fff&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;2 个 Keepalived 实例的分工&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keepalived 1（外层）&lt;/strong&gt;：保 LVS，VIP 是公网入口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keepalived 2（内层）&lt;/strong&gt;：保 Nginx，VIP 是内网入口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;双 VIP 的好处&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LVS 切换不影响 Nginx&lt;/strong&gt;：LVS 挂了，Nginx 还在，对应用零感知&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nginx 切换不影响 LVS&lt;/strong&gt;：Nginx 挂了，LVS 还在，VIP 还在&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;故障定位更细&lt;/strong&gt;：告警能精确到&amp;quot;LVS 层故障&amp;quot;或&amp;quot;Nginx 层故障&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="53-阿里--美团--字节的真实架构"&gt;5.3 阿里 / 美团 / 字节的真实架构
&lt;/h3&gt;&lt;h4 id="531-阿里云-slb"&gt;5.3.1 阿里云 SLB
&lt;/h4&gt;&lt;p&gt;阿里云 SLB（Server Load Balancer）的内核就是 LVS + Tengine 的组合：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LVS 集群&lt;/strong&gt;（FULLNAT 模式）：公网入口，扛 100 万级 QPS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tengine 集群&lt;/strong&gt;：七层路由 + 业务分流&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多 AZ 部署&lt;/strong&gt;：同城双活 + 异地灾备&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关键技术：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FULLNAT 模式&lt;/strong&gt;（阿里自研）：Real Server 跨 VPC 部署&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ECS 健康检查&lt;/strong&gt;：30 秒无响应自动剔除&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会话保持&lt;/strong&gt;：基于 Cookie 4 层哈希&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="532-美团-mgw"&gt;5.3.2 美团 MGW
&lt;/h4&gt;&lt;p&gt;美团自研的 MGW（Meituan Gateway）架构：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR
 U[用户] --&gt; DNS[GSLB DNS]
 DNS --&gt; LB[VIP 入口]
 LB --&gt; HA[HAProxy&lt;br/&gt;七层负载]
 HA --&gt; NG[Nginx/Tengine&lt;br/&gt;业务路由]
 NG --&gt; APP[业务集群]&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HAProxy 做 L4&lt;/strong&gt;：替代 LVS，部分场景性能更好&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tengine 做 L7&lt;/strong&gt;：替代纯 Nginx，加了很多自研模块&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多机房单元化&lt;/strong&gt;：MGW 内部带&amp;quot;机房标签&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="533-字节跳动-bfe"&gt;5.3.3 字节跳动 BFE
&lt;/h4&gt;&lt;p&gt;字节的 BFE（Baidu Front End，注：字节和百度都叫 BFE）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;七层网关为主&lt;/strong&gt;：直接用 Go 自研 BFE 做入口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service Mesh 协同&lt;/strong&gt;：跨机房调用通过 Mesh 自动处理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多语言 SDK&lt;/strong&gt;：Go / Java / Python 都接入&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践：自研还是用开源？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;lt; 50 万 QPS&lt;/strong&gt;：直接用 LVS + Keepalived + Nginx，&lt;strong&gt;业界成熟方案&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;50 万 - 500 万 QPS&lt;/strong&gt;：LVS + Tengine + 自研健康检查平台&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;gt; 500 万 QPS&lt;/strong&gt;：必须自研（参考阿里 SLB、美团 MGW、字节 BFE）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;不要过早自研&lt;/strong&gt;。开源方案 80% 场景够用，自研成本是 5-10 倍。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="54-异地多活的流量调度策略"&gt;5.4 异地多活的流量调度策略
&lt;/h3&gt;&lt;h4 id="541-dns-层用户就近接入"&gt;5.4.1 DNS 层：用户就近接入
&lt;/h4&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR
 BJ[北京用户] --&gt; BJVIP[北京 VIP]
 SH[上海用户] --&gt; SHVIP[上海 VIP]
 GZ[广州用户] --&gt; GZVIP[广州 VIP]
 BJVIP --&gt; BJDC[北京机房]
 SHVIP --&gt; SHDC[上海机房]
 GZVIP --&gt; GZDC[广州机房]&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;智能 DNS&lt;/strong&gt;：根据用户 IP 归属地返回最近的 VIP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;健康检查融合&lt;/strong&gt;：DNS 探测机房健康度，故障机房自动从 DNS 摘除&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS TTL 权衡&lt;/strong&gt;：TTL 太短切换快但 DNS 压力大，太长切换慢&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="542-应用层单元化路由"&gt;5.4.2 应用层：单元化路由
&lt;/h4&gt;&lt;p&gt;承接系列第 1 篇的单元化设计——&lt;strong&gt;LVS 不做单元化判断&lt;/strong&gt;，单元化路由在 Nginx 或 Spring Cloud Gateway 层做：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Nginx 根据用户 ID 哈希分流
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;hash&lt;/span&gt; &lt;span class="nv"&gt;$cookie_userid&lt;/span&gt; &lt;span class="s"&gt;consistent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 一致性哈希
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;192.168.1.20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;192.168.1.21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="543-故障切换dns--lvs-双层"&gt;5.4.3 故障切换：DNS + LVS 双层
&lt;/h4&gt;&lt;p&gt;机房级故障时：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DNS 切流&lt;/strong&gt;（分钟级）：把 VIP 摘除，流量自动去其他机房&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LVS VIP 切流&lt;/strong&gt;（秒级）：同机房内 Keepalived 切换&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nginx upstream 切流&lt;/strong&gt;（毫秒级）：健康检查失败自动剔除&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;3 层切换配合&lt;/strong&gt;：DNS 解决&amp;quot;机房级&amp;quot;、LVS 解决&amp;quot;机器级&amp;quot;、Nginx 解决&amp;quot;应用级&amp;quot;。&lt;/p&gt;
&lt;h3 id="55-为什么-k8s-内部不直接用-serviceingress-而要-lvs"&gt;5.5 为什么 K8s 内部不直接用 Service/Ingress 而要 LVS？
&lt;/h3&gt;&lt;p&gt;很多读者会问：&amp;quot;&lt;strong&gt;我已经在 K8s 上了，为什么入口还要 LVS？&lt;/strong&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;K8s 内部确实有 Service（kube-proxy 实现）和 Ingress（nginx-ingress / traefik），但&lt;strong&gt;它们只解决&amp;quot;集群内&amp;quot;问题&lt;/strong&gt;，解决不了&amp;quot;集群外&amp;quot;问题：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;层级&lt;/th&gt;
					&lt;th&gt;K8s 组件&lt;/th&gt;
					&lt;th&gt;解决的问题&lt;/th&gt;
					&lt;th&gt;解决不了的问题&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Pod → Pod&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;kube-proxy (iptables/IPVS)&lt;/td&gt;
					&lt;td&gt;集群内服务发现 + 负载均衡&lt;/td&gt;
					&lt;td&gt;公网入口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;集群入口&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Ingress (nginx-ingress)&lt;/td&gt;
					&lt;td&gt;七层路由 + TLS 终结&lt;/td&gt;
					&lt;td&gt;抗量级（单 ingress 几万 QPS）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;机房入口&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;LVS / 硬件 LB&lt;/td&gt;
					&lt;td&gt;抗量 + 故障切换&lt;/td&gt;
					&lt;td&gt;业务路由&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;跨机房&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;DNS 调度&lt;/td&gt;
					&lt;td&gt;用户就近接入&lt;/td&gt;
					&lt;td&gt;秒级切流&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;K8s 环境的典型架构&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 U[用户] --&gt; DNS[DNS]
 DNS --&gt; LVSC[云厂商 LB&lt;br/&gt;LVS 集群]
 LVSC --&gt; NING[nginx-ingress&lt;br/&gt;Nginx集群]
 NING --&gt; SVC[K8s Service&lt;br/&gt;iptables/IPVS]
 SVC --&gt; POD1[Pod 1]
 SVC --&gt; POD2[Pod 2]
 SVC --&gt; POD3[Pod 3]

 style LVSC fill:#1d3557,color:#fff
 style NING fill:#1d3557,color:#fff
 style SVC fill:#457b9d,color:#fff&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;LVS 在 K8s 环境&lt;/strong&gt;承担的角色：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;抗量&lt;/strong&gt;：nginx-ingress 单实例最多 1-3 万 QPS，几十个 pod 才能扛百万级&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;入口高可用&lt;/strong&gt;：nginx-ingress pod 漂移，VIP 还在 LVS 上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨节点均衡&lt;/strong&gt;：多个 ingress pod 分布在不同节点，LVS 统一对外&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践：K8s 入口的 3 种方案&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;LVS + nginx-ingress&lt;/strong&gt;（推荐）：抗量 + 高可用 + 业务路由齐全&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;云厂商 LB + nginx-ingress&lt;/strong&gt;：省运维，付出云费用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;纯 Ingress（不要 LVS）&lt;/strong&gt;：只适合中小规模，&lt;strong&gt;大促会爆&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="六4-种方案选型矩阵--真实案例"&gt;六、4 种方案选型矩阵 + 真实案例
&lt;/h2&gt;&lt;h3 id="61-选型矩阵"&gt;6.1 选型矩阵
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方案&lt;/th&gt;
					&lt;th&gt;抗量级&lt;/th&gt;
					&lt;th&gt;RTO&lt;/th&gt;
					&lt;th&gt;复杂度&lt;/th&gt;
					&lt;th&gt;成本&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;单机 Nginx&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;1-3 万 QPS&lt;/td&gt;
					&lt;td&gt;不可用&lt;/td&gt;
					&lt;td&gt;最低&lt;/td&gt;
					&lt;td&gt;1x&lt;/td&gt;
					&lt;td&gt;Demo、内部工具、低可用业务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Nginx + Keepalived 双机&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;1-5 万 QPS&lt;/td&gt;
					&lt;td&gt;&amp;lt; 10 秒&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
					&lt;td&gt;2x&lt;/td&gt;
					&lt;td&gt;中小业务、3 个 9 可用性&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;LVS-DR + Nginx + Keepalived&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;5-50 万 QPS&lt;/td&gt;
					&lt;td&gt;&amp;lt; 5 秒&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;3-4x&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;同城双活主流方案&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;LVS + Keepalived + Nginx 三层塔&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;10-100 万 QPS&lt;/td&gt;
					&lt;td&gt;&amp;lt; 3 秒&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;5-8x&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;异地多活、大促、4 个 9&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;自研 LB（SLB / MGW / BFE）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&amp;gt; 100 万 QPS&lt;/td&gt;
					&lt;td&gt;&amp;lt; 1 秒&lt;/td&gt;
					&lt;td&gt;极高&lt;/td&gt;
					&lt;td&gt;10x+&lt;/td&gt;
					&lt;td&gt;阿里、美团、字节级别&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="62-真实案例对照"&gt;6.2 真实案例对照
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;公司&lt;/th&gt;
					&lt;th&gt;流量调度方案&lt;/th&gt;
					&lt;th&gt;特点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;某 SaaS 初创&lt;/strong&gt;（日活 5 万）&lt;/td&gt;
					&lt;td&gt;单机 Nginx&lt;/td&gt;
					&lt;td&gt;1 台 4C8G 跑一年，挂了重启 5 分钟&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;某电商中型&lt;/strong&gt;（日活 100 万）&lt;/td&gt;
					&lt;td&gt;Nginx + Keepalived 双机&lt;/td&gt;
					&lt;td&gt;2 台 8C16G，3 个 9 可用性&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;美团外卖&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;MGW（自研 HAProxy + Tengine）&lt;/td&gt;
					&lt;td&gt;单元化 + 异地双活&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;阿里双 11&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;SLB（LVS + Tengine）&lt;/td&gt;
					&lt;td&gt;三地五中心，50 万 + QPS&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;字节 TikTok&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;BFE（自研 Go 网关）&lt;/td&gt;
					&lt;td&gt;海外多 Region&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="63-决策流程"&gt;6.3 决策流程
&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 A[开始选型] --&gt; B{日活 ?}
 B --&gt;|&lt; 10万| C[单机 Nginx]
 B --&gt;|10-100万| D{可用性要求 ?}
 B --&gt;|&gt; 100万| E{异地多活 ?}
 D --&gt;|3 个 9| F[Nginx + Keepalived]
 D --&gt;|4 个 9| G[LVS + Nginx]
 E --&gt;|否| G
 E --&gt;|是| H[LVS + Nginx + DNS 调度]

 style C fill:#a8dadc
 style F fill:#457b9d,color:#fff
 style G fill:#1d3557,color:#fff
 style H fill:#1d3557,color:#fff&lt;/pre&gt;&lt;h3 id="64-反例选错的代价"&gt;6.4 反例：选错的代价
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;反面案例 1：金融初创选了&amp;quot;单机 Nginx&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;某支付初创公司 2019 年上线，日活 5 万，CTO 觉得&amp;quot;用 LVS 成本太高&amp;quot;，选了单机 Nginx。2020 年春节红包活动，&lt;strong&gt;单机 Nginx 进程被大流量打挂，业务中断 2 小时&lt;/strong&gt;。事后估算损失 200 万，远超&amp;quot;上 LVS 节省的 30 万成本&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;教训&lt;/strong&gt;：&lt;strong&gt;成本不是按&amp;quot;现在用不用得上&amp;quot;算，是按&amp;quot;挂了损失多少&amp;quot;算&lt;/strong&gt;。即使是中小业务，强一致性场景也要至少 Nginx + Keepalived。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;反面案例 2：电商中型选了&amp;quot;LVS 但没配 Keepalived&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;某电商 2021 年自建机房，CTO 觉得&amp;quot;单 LVS 够用&amp;quot;。结果 LVS 机器硬件故障（电源烧了），&lt;strong&gt;入口整个挂掉，所有用户访问超时&lt;/strong&gt;。事后抢修换机器，1 小时恢复。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;教训&lt;/strong&gt;：&lt;strong&gt;LVS 本身是高可用组件里的&amp;quot;被保&amp;quot;对象&lt;/strong&gt;。没有 Keepalived 保护，LVS 挂了入口就挂。&lt;strong&gt;永远要有&amp;quot;保 LVS 的人&amp;quot;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;反面案例 3：直播平台选了&amp;quot;LVS + Nginx 但没做异地多活&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;某直播平台 2022 年大促，所有流量集中在北京机房。&lt;strong&gt;北京机房的光纤被市政施工挖断&lt;/strong&gt;，平台全挂 6 小时。事后损失数千万。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;教训&lt;/strong&gt;：&lt;strong&gt;LVS + Nginx 解决的是&amp;quot;机房内&amp;quot;容灾，&amp;ldquo;机房外&amp;quot;必须异地多活&lt;/strong&gt;。两个层次都要做，不能只看一个。&lt;/p&gt;
&lt;h3 id="65-选型决策清单"&gt;6.5 选型决策清单
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;业务特征&lt;/th&gt;
					&lt;th&gt;推荐方案&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;日活 &amp;lt; 10 万、可用性要求低&lt;/td&gt;
					&lt;td&gt;单机 Nginx&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;日活 10-100 万、3 个 9&lt;/td&gt;
					&lt;td&gt;Nginx + Keepalived&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;日活 10-100 万、强 SLA 4 个 9&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;LVS + Keepalived + Nginx 三层塔&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;日活 &amp;gt; 100 万、4 个 9&lt;/td&gt;
					&lt;td&gt;LVS 三层塔 + 异地多活&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;日活 &amp;gt; 1000 万 或 上市级 SLA&lt;/td&gt;
					&lt;td&gt;自研 LB（参考 SLB / MGW / BFE）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点：选型不是越贵越好&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;见过最离谱的案例：日活 2 万的内部 OA 系统，&lt;strong&gt;上了 LVS + Keepalived + 自研监控&lt;/strong&gt;全套。&lt;strong&gt;3 个人的运维团队维护 6 台服务器，效率极低&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;选型原则：&lt;strong&gt;用最少的组件满足需求&lt;/strong&gt;。日活 2 万单机 Nginx 就够，&lt;strong&gt;别为了&amp;quot;高可用&amp;quot;过度设计&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="七实操手册一步步搭建-lvs--keepalived--nginx"&gt;七、实操手册：一步步搭建 LVS + Keepalived + Nginx
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;本节是&lt;strong&gt;完整可复制粘贴的命令清单&lt;/strong&gt;。准备 &lt;strong&gt;3 台 Linux 机器（CentOS 7 或 Ubuntu 20.04+）&lt;/strong&gt;，按角色分配：&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;角色&lt;/th&gt;
					&lt;th&gt;IP&lt;/th&gt;
					&lt;th&gt;用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;LVS-Master&lt;/td&gt;
					&lt;td&gt;192.168.1.10&lt;/td&gt;
					&lt;td&gt;LVS 主节点（也做 Keepalived Master）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;LVS-Backup&lt;/td&gt;
					&lt;td&gt;192.168.1.11&lt;/td&gt;
					&lt;td&gt;LVS 备节点（也做 Keepalived Backup）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Nginx-Real&lt;/td&gt;
					&lt;td&gt;192.168.1.20&lt;/td&gt;
					&lt;td&gt;后端 Nginx 真实服务器（DR 模式）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;VIP&lt;/td&gt;
					&lt;td&gt;192.168.1.100&lt;/td&gt;
					&lt;td&gt;对外服务的虚拟 IP&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;小贴士&lt;/strong&gt;：至少 2 台机器也能跑（Real Server 用 Docker 启 Nginx 模拟）。生产环境请按上面 3 台分配。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="71-准备环境"&gt;7.1 准备环境
&lt;/h3&gt;&lt;h4 id="711-关闭防火墙和-selinux"&gt;7.1.1 关闭防火墙和 SELinux
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3 台机器都执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl stop firewalld
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl disable firewalld
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;setenforce &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s1"&gt;&amp;#39;s/SELINUX=enforcing/SELINUX=permissive/&amp;#39;&lt;/span&gt; /etc/selinux/config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="712-开启-ip-转发dr-模式必需"&gt;7.1.2 开启 IP 转发（DR 模式必需）
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# LVS Master 和 Backup 上执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;net.ipv4.ip_forward = 1&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -p
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 关闭 RP_FILTER（防 IP 伪造过滤）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;net.ipv4.conf.all.rp_filter = 0&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;net.ipv4.conf.eth0.rp_filter = 0&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="72-安装-ipvslvs-内核模块"&gt;7.2 安装 IPVS（LVS 内核模块）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# LVS Master 和 Backup 上执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yum install -y ipvsadm &lt;span class="c1"&gt;# CentOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或 apt install -y ipvsadm # Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 加载 IPVS 内核模块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;modprobe ip_vs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;modprobe ip_vs_rr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;modprobe ip_vs_wrr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;modprobe ip_vs_sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 开机自启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ip_vs&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/modules-load.d/ipvs.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ip_vs_rr&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/modules-load.d/ipvs.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ip_vs_wrr&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/modules-load.d/ipvs.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ip_vs_sh&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/modules-load.d/ipvs.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsmod &lt;span class="p"&gt;|&lt;/span&gt; grep ip_vs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="73-安装-nginxreal-server-上"&gt;7.3 安装 Nginx（Real Server 上）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 在 192.168.1.20 上执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yum install -y nginx &lt;span class="c1"&gt;# 或 apt install -y nginx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置 Nginx 监听 VIP（在 lo 网卡上）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/nginx/conf.d/vip.conf &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;server {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; listen 192.168.1.100:80; # 监听 VIP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; server_name _;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; location / {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; return 200 &amp;#34;Hello from Real Server 192.168.1.20\n&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; add_header Content-Type text/plain;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置 lo 网卡绑 VIP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/init.d/realserver.sh &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;VIP=192.168.1.100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;case &amp;#34;$1&amp;#34; in
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; start)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP up
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;1&amp;#34; &amp;gt; /proc/sys/net/ipv4/conf/lo/arp_ignore
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;2&amp;#34; &amp;gt; /proc/sys/net/ipv4/conf/lo/arp_announce
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;1&amp;#34; &amp;gt; /proc/sys/net/ipv4/conf/all/arp_ignore
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;2&amp;#34; &amp;gt; /proc/sys/net/ipv4/conf/all/arp_announce
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; stop)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ifconfig lo:0 down
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;0&amp;#34; &amp;gt; /proc/sys/net/ipv4/conf/lo/arp_ignore
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;0&amp;#34; &amp;gt; /proc/sys/net/ipv4/conf/lo/arp_announce
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;0&amp;#34; &amp;gt; /proc/sys/net/ipv4/conf/all/arp_ignore
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;0&amp;#34; &amp;gt; /proc/sys/net/ipv4/conf/all/arp_announce
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;esac
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x /etc/init.d/realserver.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/init.d/realserver.sh start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点：arp_ignore / arp_announce 必须配&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是 DR 模式&lt;strong&gt;最容易踩的坑&lt;/strong&gt;。不配的话：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;arp_ignore = 0&lt;/strong&gt;（默认）：Real Server 会对 ARP 请求&amp;quot;积极响应&amp;rdquo;，把 VIP 的 MAC 地址告诉别人&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结果&lt;/strong&gt;：外部请求都到 Real Server 了，&lt;strong&gt;LVS 收不到包&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;arp_ignore = 1&lt;/strong&gt;：只对&amp;quot;目标 IP 是本机接口的&amp;quot;ARP 请求响应。&lt;strong&gt;配合 arp_announce = 2&lt;/strong&gt;（只向同网段宣告自己接口的 IP）才能正常工作。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;启动 Nginx：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl start nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl http://192.168.1.100
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 应输出 &amp;#34;Hello from Real Server 192.168.1.20&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="74-安装-keepalived"&gt;7.4 安装 Keepalived
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# LVS Master 和 Backup 上执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yum install -y keepalived &lt;span class="c1"&gt;# 或 apt install -y keepalived&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="741-lvs-master-配置-etckeepalivedkeepalivedconf"&gt;7.4.1 LVS Master 配置 &lt;code&gt;/etc/keepalived/keepalived.conf&lt;/code&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;!&lt;/span&gt; &lt;span class="s"&gt;Configuration&lt;/span&gt; &lt;span class="s"&gt;File&lt;/span&gt; &lt;span class="s"&gt;for&lt;/span&gt; &lt;span class="s"&gt;keepalived&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;global_defs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;router_id&lt;/span&gt; &lt;span class="s"&gt;LVS_MASTER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;script_user&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;enable_script_security&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 监控 LVS 自身进程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;vrrp_script&lt;/span&gt; &lt;span class="s"&gt;check_lvs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;script&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;/usr/local/bin/check_lvs.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;interval&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;weight&lt;/span&gt; &lt;span class="s"&gt;-20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;fall&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;rise&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;timeout&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;vrrp_instance&lt;/span&gt; &lt;span class="s"&gt;VI_1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;state&lt;/span&gt; &lt;span class="s"&gt;MASTER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;interface&lt;/span&gt; &lt;span class="s"&gt;eth0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;virtual_router_id&lt;/span&gt; &lt;span class="mi"&gt;51&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;priority&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;advert_int&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;authentication&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;auth_type&lt;/span&gt; &lt;span class="s"&gt;PASS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;auth_pass&lt;/span&gt; &lt;span class="mi"&gt;1111&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;virtual_ipaddress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;192.168.1.100/24&lt;/span&gt; &lt;span class="s"&gt;dev&lt;/span&gt; &lt;span class="s"&gt;eth0&lt;/span&gt; &lt;span class="s"&gt;label&lt;/span&gt; &lt;span class="n"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;track_script&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;check_lvs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;nopreempt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;notify_master&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;/usr/local/bin/notify.sh&lt;/span&gt; &lt;span class="s"&gt;master&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;notify_backup&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;/usr/local/bin/notify.sh&lt;/span&gt; &lt;span class="s"&gt;backup&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# LVS 虚拟服务配置（DR 模式）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;virtual_server&lt;/span&gt; &lt;span class="n"&gt;192.168.1.100&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;delay_loop&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="c1"&gt;# 健康检查间隔
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;lb_algo&lt;/span&gt; &lt;span class="s"&gt;wlc&lt;/span&gt; &lt;span class="c1"&gt;# 加权最少连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;lb_kind&lt;/span&gt; &lt;span class="s"&gt;DR&lt;/span&gt; &lt;span class="c1"&gt;# DR 模式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;persistence_timeout&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="c1"&gt;# 会话保持 60 秒
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;protocol&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;real_server&lt;/span&gt; &lt;span class="n"&gt;192.168.1.20&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;weight&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;TCP_CHECK&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;connect_timeout&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;nb_get_retry&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;delay_before_retry&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;connect_port&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 如果有更多 Real Server，复制上面块
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="742-lvs-backup-配置只改-3-处"&gt;7.4.2 LVS Backup 配置（只改 3 处）
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;vrrp_instance&lt;/span&gt; &lt;span class="s"&gt;VI_1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;state&lt;/span&gt; &lt;span class="s"&gt;BACKUP&lt;/span&gt; &lt;span class="c1"&gt;# ← 改
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;priority&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt; &lt;span class="c1"&gt;# ← 改
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 其它和 Master 一致
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="743-健康检查脚本"&gt;7.4.3 健康检查脚本
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /usr/local/bin/check_lvs.sh（Master 和 Backup 各一份）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检查 IPVS 是否加载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsmod &lt;span class="p"&gt;|&lt;/span&gt; grep ip_vs &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; -ne &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x /usr/local/bin/check_lvs.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="744-启动-keepalived"&gt;7.4.4 启动 Keepalived
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 两台机器分别启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl start keepalived
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; keepalived
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Master 上验证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip addr show eth0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 应看到 eth0:1 192.168.1.100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="75-验证整套链路"&gt;7.5 验证整套链路
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 在 LVS Master 上查 IPVS 规则&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipvsadm -Ln
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 应看到：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# TCP 192.168.1.100:80 wlc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -&amp;gt; 192.168.1.20:80 Route 1 0 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 客户端访问 VIP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl http://192.168.1.100
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 应返回 &amp;#34;Hello from Real Server 192.168.1.20&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 看连接数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipvsadm -Lnc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="76-故障演练"&gt;7.6 故障演练
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 演练 1：停止 Real Server 的 Nginx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh 192.168.1.20 &lt;span class="s2"&gt;&amp;#34;systemctl stop nginx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 30 秒后 IPVS 应自动剔除&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipvsadm -Ln
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 192.168.1.20 应消失&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 演练 2：停止 Master 的 Keepalived&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl stop keepalived
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 5 秒内 Backup 应接管 VIP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh 192.168.1.11 &lt;span class="s2"&gt;&amp;#34;ip addr show eth0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 应看到 eth0:1 192.168.1.100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 演练 3：恢复 Master&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl start keepalived
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 因为配了 nopreempt，不会自动抢占（让 Backup 继续工作）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践：nopreempt 是好习惯&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;默认 Keepalived 会在 Master 恢复后&lt;strong&gt;自动抢占&lt;/strong&gt;回 VIP。这种行为在生产中容易导致&amp;quot;脑裂&amp;quot;（短暂的&amp;quot;双 Master&amp;quot;）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配 nopreempt 后&lt;/strong&gt;：Master 恢复后保持 Backup 状态，&lt;strong&gt;只有 Backup 挂了才接管&lt;/strong&gt;。切换更稳定，但要&lt;strong&gt;手动维护&lt;/strong&gt;（定期巡检 VIP 是否在期望的机器上）。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="77-配套-nginx-upstream"&gt;7.7 配套 Nginx upstream
&lt;/h3&gt;&lt;p&gt;如果 Real Server 跑的不是裸 Nginx，而是&lt;strong&gt;反向代理&lt;/strong&gt;（Nginx → 多个微服务），配置就稍微复杂：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /etc/nginx/conf.d/upstream.conf
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;192.168.1.30&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt; &lt;span class="s"&gt;weight=1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;192.168.1.31&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt; &lt;span class="s"&gt;weight=1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;keepalive&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# ⭐ 与后端保持长连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="n"&gt;192.168.1.100&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="s"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# ⭐ HTTP/1.1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# ⭐ 清空 Connection 头
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_connect_timeout&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_read_timeout&lt;/span&gt; &lt;span class="s"&gt;60s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3 个 ⭐ 参数&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;keepalive 32&lt;/code&gt;：与后端保持 32 个长连接池&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proxy_http_version 1.1&lt;/code&gt;：HTTP/1.1（keepalive 必须）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proxy_set_header Connection &amp;quot;&amp;quot;&lt;/code&gt;：清空 Connection 头（避免后端主动关闭）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="78-容器化场景docker--k8s-下的等价配置"&gt;7.8 容器化场景：Docker / K8s 下的等价配置
&lt;/h3&gt;&lt;p&gt;如果你的后端服务跑在 Docker / K8s 容器里，Nginx 的 upstream 配置需要相应调整：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Compose 场景&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# docker-compose.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3.8&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nginx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx:1.25&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;80:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./nginx.conf:/etc/nginx/nginx.conf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;app1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;app2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;appnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;myapp:1.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;appnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;myapp:1.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;appnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;appnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;bridge&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;对应的 Nginx upstream&lt;/strong&gt;（用容器名代替 IP）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;app1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 容器名直接当主机名
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;app2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;keepalive&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="s"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ... 其他配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;K8s 场景&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ConfigMap + Deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ConfigMap&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx-upstream&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;upstream.conf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; upstream backend {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; server myapp.default.svc.cluster.local:8080;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; keepalive 32;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; }&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;apps/v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx-proxy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx:1.25&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumeMounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;upstream&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mountPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/etc/nginx/conf.d&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;upstream&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;configMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx-upstream&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践：K8s 中 keepalive 的&amp;quot;坑&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;K8s 中 Pod IP &lt;strong&gt;随时可能变化&lt;/strong&gt;（重启、调度、扩缩容）。如果把 Pod IP 写死在 upstream 里，&lt;strong&gt;Pod 重启一次就全部失效&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;正确做法&lt;/strong&gt;：用 Service 的 DNS 名称（&lt;code&gt;myapp.default.svc.cluster.local&lt;/code&gt;），Nginx 启动时 DNS 解析一次。Service 后端 Pod 变化时，&lt;strong&gt;长连接池内残留的旧连接会失败，触发自动重连&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="79-性能压测wrk-与-ab-实战"&gt;7.9 性能压测：wrk 与 ab 实战
&lt;/h3&gt;&lt;p&gt;搭建完链路后，&lt;strong&gt;必须做压测&lt;/strong&gt;确认性能。推荐 2 个工具：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;wrk（推荐，Lua 脚本扩展）&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/wg/wrk.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; wrk &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4 线程压 30 秒&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wrk -t4 -c1000 -d30s http://192.168.1.100/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输出示例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Running 30s test @ http://192.168.1.100/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4 threads and 1000 connections&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Thread Stats Avg Stdev Max +/- Stdev&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Latency 12.34ms 15.67ms 250.00ms 89.32%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Req/Sec 8.50k 1.23k 9.87k 72.45%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 900000 requests in 30.00s, 240.00MB read&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Requests/sec: 30000.00&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Transfer/sec: 8.00MB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;ab（Apache Bench，简单场景）&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1 万请求，100 并发&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ab -n &lt;span class="m"&gt;10000&lt;/span&gt; -c &lt;span class="m"&gt;100&lt;/span&gt; http://192.168.1.100/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 关键看三个指标&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Requests per second: 30000 [#/sec] ← QPS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Time per request: 3.333 [ms] ← 平均延迟&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Percentage of requests served within a certain time (ms)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 50% 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 95% 8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 99% 15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 100% 30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;压测要看 P99 延迟，不要只看平均&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;平均延迟 5ms，但 P99 500ms → &lt;strong&gt;长尾问题严重&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;P99 &amp;lt; 50ms 才算健康&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="八踩坑与监控"&gt;八、踩坑与监控
&lt;/h2&gt;&lt;h3 id="81-10-个常见坑速查"&gt;8.1 10 个常见坑速查
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;#&lt;/th&gt;
					&lt;th&gt;坑&lt;/th&gt;
					&lt;th&gt;现象&lt;/th&gt;
					&lt;th&gt;解决&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;arp_ignore&lt;/code&gt; / &lt;code&gt;arp_announce&lt;/code&gt; 没配&lt;/td&gt;
					&lt;td&gt;LVS 收不到包，外部直接连 Real Server&lt;/td&gt;
					&lt;td&gt;Real Server 上配 &lt;code&gt;arp_ignore=1, arp_announce=2&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;Nginx &lt;code&gt;upstream&lt;/code&gt; 没配 &lt;code&gt;keepalive&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;TIME_WAIT 飙升，端口耗尽&lt;/td&gt;
					&lt;td&gt;加 &lt;code&gt;keepalive 32&lt;/code&gt; + &lt;code&gt;proxy_http_version 1.1&lt;/code&gt; + &lt;code&gt;Connection &amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;Keepalived 脑裂&lt;/td&gt;
					&lt;td&gt;双 Master 互相抢 VIP&lt;/td&gt;
					&lt;td&gt;单播 VRRP + 独立心跳线 + 业务侧冲突检测&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;LVS DR 模式跨 VLAN&lt;/td&gt;
					&lt;td&gt;Real Server 收不到 ARP&lt;/td&gt;
					&lt;td&gt;同 VLAN 部署，或换 FULLNAT&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;VIP 漂移后 ARP 表未更新&lt;/td&gt;
					&lt;td&gt;客户端缓存旧 MAC 地址&lt;/td&gt;
					&lt;td&gt;在 LVS 配 &lt;code&gt;notify_master&lt;/code&gt; 脚本，主动广播 gratuitous ARP&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;6&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;nopreempt&lt;/code&gt; 没配&lt;/td&gt;
					&lt;td&gt;Master 恢复后双 Master 抢 VIP&lt;/td&gt;
					&lt;td&gt;配 &lt;code&gt;nopreempt&lt;/code&gt;，避免频繁切换&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;7&lt;/td&gt;
					&lt;td&gt;LVS Master 单点&lt;/td&gt;
					&lt;td&gt;LVS 挂了整个入口挂&lt;/td&gt;
					&lt;td&gt;必须 Keepalived 双机 + 监控&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;8&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ip_forward&lt;/code&gt; 没开&lt;/td&gt;
					&lt;td&gt;DR 模式包转发失败&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;sysctl -w net.ipv4.ip_forward=1&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;9&lt;/td&gt;
					&lt;td&gt;Real Server &lt;code&gt;lo:0&lt;/code&gt; 没绑 VIP&lt;/td&gt;
					&lt;td&gt;拒绝服务（认为非本机 IP）&lt;/td&gt;
					&lt;td&gt;Real Server 上 &lt;code&gt;ifconfig lo:0 VIP netmask 255.255.255.255&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;10&lt;/td&gt;
					&lt;td&gt;LVS 健康检查误判&lt;/td&gt;
					&lt;td&gt;偶发抖动导致全摘&lt;/td&gt;
					&lt;td&gt;调大 &lt;code&gt;nb_get_retry&lt;/code&gt; 和 &lt;code&gt;delay_before_retry&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="82-监控告警"&gt;8.2 监控告警
&lt;/h3&gt;&lt;h4 id="821-必监控指标"&gt;8.2.1 必监控指标
&lt;/h4&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;指标&lt;/th&gt;
					&lt;th&gt;阈值&lt;/th&gt;
					&lt;th&gt;工具&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;VIP 是否在期望机器上&lt;/td&gt;
					&lt;td&gt;漂移即告警&lt;/td&gt;
					&lt;td&gt;Keepalived &lt;code&gt;notify_*&lt;/code&gt; 钩子 + Prometheus&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;IPVS 活跃连接数&lt;/td&gt;
					&lt;td&gt;&amp;gt; 80% 容量告警&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ipvsadm -Ln&lt;/code&gt; + node_exporter&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Real Server 健康状态&lt;/td&gt;
					&lt;td&gt;任何 down 立即告警&lt;/td&gt;
					&lt;td&gt;Keepalived &lt;code&gt;virtual_server&lt;/code&gt; 块内置检查&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;LVS Master / Backup 进程存活&lt;/td&gt;
					&lt;td&gt;进程消失告警&lt;/td&gt;
					&lt;td&gt;systemd + Prometheus&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Nginx upstream 失败率&lt;/td&gt;
					&lt;td&gt;&amp;gt; 1% 告警&lt;/td&gt;
					&lt;td&gt;Nginx &lt;code&gt;ngx_http_upstream_check_module&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;跨机房专线延迟&lt;/td&gt;
					&lt;td&gt;&amp;gt; 50ms 告警&lt;/td&gt;
					&lt;td&gt;自研 ping 探针&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="822-拨测公网心跳"&gt;8.2.2 拨测（公网心跳）
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /usr/local/bin/probe.sh（部署在公网多地域）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TARGET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://192.168.1.100/health&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; i in &lt;span class="o"&gt;{&lt;/span&gt;1..10&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -s -o /dev/null -w &lt;span class="s2"&gt;&amp;#34;%{http_code}&amp;#34;&lt;/span&gt; --max-time &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="nv"&gt;$TARGET&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;200&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ALARM: probe failed, code=&lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; mail -s &lt;span class="s2"&gt;&amp;#34;LVS probe failed&amp;#34;&lt;/span&gt; ops@example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="m"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;拨测要部署在公网&lt;/strong&gt;，机房内的监控&lt;strong&gt;不能替代&lt;/strong&gt;公网探测。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点：监控盲区&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最常见的监控盲区是&amp;quot;&lt;strong&gt;机房内一切正常，机房外访问不到&lt;/strong&gt;&amp;quot;。常见原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;机房出口防火墙拦截&lt;/li&gt;
&lt;li&gt;跨机房专线中断&lt;/li&gt;
&lt;li&gt;公网 BGP 路由异常&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;唯一可靠的判断是&amp;quot;公网能否正常访问&amp;quot;&lt;/strong&gt;。拨测是异地多活的&amp;quot;生命线&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="83-3-个真实故障案例公开复盘整理"&gt;8.3 3 个真实故障案例（公开复盘整理）
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;案例中数字来源于公开复盘报告，&lt;strong&gt;已脱敏处理&lt;/strong&gt;。重点看&amp;quot;现象 → 根因 → 修复&amp;quot;三段式分析。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;案例 1：Keepalived 切换抖动导致业务频繁超时&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;现象&lt;/strong&gt;：某电商 2022 年大促，业务监控发现&lt;strong&gt;每隔 30-60 秒就有 1-2 秒的请求超时&lt;/strong&gt;。QPS 越高峰越明显。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;根因&lt;/strong&gt;：Keepalived 主备之间的 VRRP 心跳被&lt;strong&gt;交换机 MAC 表老化&lt;/strong&gt;干扰，导致&lt;strong&gt;短暂的双 Master / 双 Backup 切换&lt;/strong&gt;。每次切换有 1-2 秒的 ARP 重学习窗口，期间流量黑洞。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修复&lt;/strong&gt;：(1) 调整交换机 MAC 表老化时间到 30 分钟；(2) Keepalived 配 &lt;code&gt;unicast_src_ip&lt;/code&gt; 单播模式，&lt;strong&gt;避免多播丢包&lt;/strong&gt;；(3) 监控加上&amp;quot;VIP 1 分钟内切换次数&amp;quot;告警。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;案例 2：LVS DR 模式跨 VLAN 部署，ARP 全部失败&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;现象&lt;/strong&gt;：某金融公司 2021 年新机房部署 LVS，&lt;strong&gt;所有请求都直连到 Real Server，LVS 收不到包&lt;/strong&gt;。Keepalived 健康检查一直告警。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;根因&lt;/strong&gt;：运维把 LVS 和 Real Server &lt;strong&gt;放在不同 VLAN&lt;/strong&gt;（中间隔了路由器），但 LVS DR 模式是 L2 转发，&lt;strong&gt;L2 广播域不通就无法做 ARP 替换&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修复&lt;/strong&gt;：(1) 把 LVS 和 Real Server 改到同一 VLAN；(2) 如果必须跨 VLAN，&lt;strong&gt;改用 FULLNAT 模式&lt;/strong&gt;（阿里云方案）；(3) 在网络拓扑图里&lt;strong&gt;显式标注 LVS 边界&lt;/strong&gt;，避免后续运维踩坑。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;案例 3：nginx keepalive 配置错，TPS 暴跌 70%&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;现象&lt;/strong&gt;：某 SaaS 公司 2023 年迁移到新机房，&lt;strong&gt;TPS 从 5000 降到 1500&lt;/strong&gt;，后端 CPU 反而飙到 90%。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;根因&lt;/strong&gt;：运维在 nginx.conf 里漏了 &lt;code&gt;proxy_set_header Connection &amp;quot;&amp;quot;&lt;/code&gt;（Nginx 模板是复制的，&lt;strong&gt;这一行没复制到&lt;/strong&gt;）。结果&lt;strong&gt;后端收到 &lt;code&gt;Connection: close&lt;/code&gt; 主动关闭 TCP 连接&lt;/strong&gt;，&lt;strong&gt;每秒多 5000 次 3 次握手 + 4 次挥手&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修复&lt;/strong&gt;：(1) 补全 3 个 keepalive 参数；(2) 加上 &lt;code&gt;wrk&lt;/code&gt; 压测 baseline 监控，&lt;strong&gt;配置变更后自动对比基线&lt;/strong&gt;；(3) 把 3 个 keepalive 参数写进 Ansible 模板，&lt;strong&gt;代码化防止遗漏&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;误区警示：3 个案例的共性&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这 3 个案例的共性：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配置层面的错误&lt;/strong&gt;，不是软件 bug&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监控告警&lt;/strong&gt;虽然响了，但&lt;strong&gt;没被及时处理&lt;/strong&gt;（大促期间没空看）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;变更没有&amp;quot;基线对比&amp;quot;&lt;/strong&gt;——配置改完没和历史数据对比，&lt;strong&gt;TPS 跌 70% 都没发现&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;防御方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;配置变更走 PR + 评审 + 灰度&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键指标（TPS / P99 / 错误率）配基线告警&lt;/strong&gt;（偏离基线 30% 立刻报警）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重要配置写进代码&lt;/strong&gt;（Ansible / Helm Chart），&lt;strong&gt;不要让人肉 cp 配置文件&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h3 id="84-5-条运维铁律"&gt;8.4 5 条运维铁律
&lt;/h3&gt;&lt;p&gt;最后给做流量调度的运维 5 条铁律：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;任何变更先在预发环境跑 1 周&lt;/strong&gt;：配置错误往往不是立即暴露，是&lt;strong&gt;运行 3-7 天后才出问题&lt;/strong&gt;（如内存泄漏、连接耗尽）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键配置做成&amp;quot;代码&amp;quot;&lt;/strong&gt;：用 Ansible / Helm Chart 管理，&lt;strong&gt;避免人肉 cp 配置文件&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监控 + 告警 + Runbook 三件套&lt;/strong&gt;：监控发现问题，告警通知人，Runbook 指导人怎么修。&lt;strong&gt;缺一不可&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;故障演练常态化&lt;/strong&gt;：每月 1 次小演练，季度 1 次大演练。&lt;strong&gt;没演练过的高可用 = 假高可用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复盘文化&lt;/strong&gt;：每次故障 24 小时内复盘，输出 Action Item 并跟踪。&lt;strong&gt;不复盘的故障 = 还会再发生&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;h3 id="91-流量调度的演进小结"&gt;9.1 流量调度的演进小结
&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR
 A[单机 Nginx] --&gt; B[Nginx + Keepalived]
 B --&gt; C[LVS-DR + Nginx]
 C --&gt; D[LVS + Keepalived + Nginx&lt;br/&gt;三层塔]
 D --&gt; E[自研 LB&lt;br/&gt;SLB/MGW/BFE]

 style A fill:#e0e0e0
 style B fill:#b8d8d8
 style C fill:#92d2d2
 style D fill:#457b9d,color:#fff
 style E fill:#1d3557,color:#fff&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;演进的内在动力&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;业务量增长&lt;/strong&gt; → 单机撑不住 → 多机&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可用性要求提高&lt;/strong&gt; → 单点故障不能接受 → Keepalived&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能天花板&lt;/strong&gt; → Nginx 不够 → LVS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;极致性能 + 异地多活&lt;/strong&gt; → 三层塔 + 自研&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="92-3-大核心要素"&gt;9.2 3 大核心要素
&lt;/h3&gt;&lt;p&gt;承接系列第 1 篇的&amp;quot;业务 / 数据 / 流量&amp;quot;三分法，&lt;strong&gt;流量调度层的 3 大核心&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;冗余&lt;/strong&gt;：每层都有主备，任意一层挂了下一层接住&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分层&lt;/strong&gt;：LVS 抗量 / Nginx 路由 / App 业务，各司其职&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化&lt;/strong&gt;：健康检查 + 自动剔除 + 自动接管，无需人工介入&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="93-系列预告"&gt;9.3 系列预告
&lt;/h3&gt;&lt;p&gt;这是 &lt;strong&gt;Java Web 微服务系列&lt;/strong&gt; 的第 2 篇。后续计划：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第 3 篇&lt;/strong&gt;：&lt;strong&gt;Spring Cloud Gateway：应用层网关的精细化治理&lt;/strong&gt; —— 微服务内部路由、灰度、限流、鉴权&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第 4 篇&lt;/strong&gt;：&lt;strong&gt;Nacos + Sentinel + Seata 三件套实战&lt;/strong&gt; —— 服务发现 + 流量治理 + 分布式事务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第 5 篇&lt;/strong&gt;：&lt;strong&gt;SkyWalking 全链路追踪&lt;/strong&gt; —— 异地多活下的链路可观测性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第 6 篇&lt;/strong&gt;：&lt;strong&gt;自研 LB 设计要点&lt;/strong&gt; —— 100 万 QPS 级别的流量调度系统&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;回到系列开篇的命题&lt;/strong&gt;：异地多活不是&amp;quot;装个软件就完事&amp;quot;，是&amp;quot;&lt;strong&gt;用钱换命&lt;/strong&gt;&amp;ldquo;的系统工程。流量调度作为&amp;quot;前哨班&amp;rdquo;，看似只是几个开源组件的拼接，&lt;strong&gt;实际踩过的坑足够写 100 篇博客&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本篇的实操清单是&amp;quot;最小可运行版本&amp;quot;，&lt;strong&gt;生产环境请结合 §8.2 的监控指标 + 业务场景做调整&lt;/strong&gt;。异地多活的&amp;quot;前哨班&amp;quot;搭好了，业务系统的可用性才能真正&amp;quot;扛得住&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="附录常见问题-faq"&gt;附录：常见问题 FAQ
&lt;/h2&gt;&lt;p&gt;本节是面向架构评审、面试、新人入职的速查清单——把读者最常问的问题集中解答。&lt;/p&gt;
&lt;h3 id="a1lvs-和-nginx-能不能装在同一台机器上"&gt;A1：LVS 和 Nginx 能不能装在同一台机器上？
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;技术上可以，生产上不推荐&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;LVS 是内核态转发，Nginx 是用户态进程。&lt;strong&gt;装同一台&lt;/strong&gt;会：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;资源争抢：LVS 转发吃 CPU，Nginx 处理 HTTP 也吃 CPU，&lt;strong&gt;互相挤兑&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;故障域重叠：机器挂了 LVS 和 Nginx &lt;strong&gt;一起挂&lt;/strong&gt;，&lt;strong&gt;双层塔降级成单层&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;监控混乱：出问题时分不清是 LVS 还是 Nginx 的锅&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;正确做法&lt;/strong&gt;：LVS 机器只跑 LVS + Keepalived，Nginx 机器只跑 Nginx + 应用。&lt;strong&gt;职责单一&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="a2keepalived-主备之间是用多播还是单播"&gt;A2：Keepalived 主备之间是用多播还是单播？
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;生产环境推荐单播&lt;/strong&gt;（&lt;code&gt;unicast_src_ip&lt;/code&gt; + &lt;code&gt;unicast_peer&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;多播（默认）的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;很多云厂商&lt;strong&gt;默认禁止多播&lt;/strong&gt;（224.0.0.0/4 段）&lt;/li&gt;
&lt;li&gt;跨网段多播经常被丢&lt;/li&gt;
&lt;li&gt;安全扫描工具会报&amp;quot;未加密的多播协议&amp;quot;漏洞&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;单播的优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;点对点&lt;/strong&gt;通信，&lt;strong&gt;经过路由器也能通&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更安全&lt;/strong&gt;（不会被同网段其他机器听到 VRRP 通告）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可观测&lt;/strong&gt;（TCP 单播能用 tcpdump 抓包分析）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="a3dr-模式下-real-server-为什么需要把-vip-绑到-lo-网卡"&gt;A3：DR 模式下 Real Server 为什么需要把 VIP 绑到 lo 网卡？
&lt;/h3&gt;&lt;p&gt;因为 DR 模式 LVS &lt;strong&gt;只改目的 MAC、不改目的 IP&lt;/strong&gt;。Real Server 收到包后发现&lt;strong&gt;目的 IP 是 VIP，不是自己的 IP&lt;/strong&gt;（如 192.168.1.20），&lt;strong&gt;默认会丢弃&lt;/strong&gt;（认为不是发给自己的）。&lt;/p&gt;
&lt;p&gt;把 VIP 绑到 lo 网卡后，Real Server 觉得&amp;quot;这个 IP 是我的&amp;quot;，会正常处理。&lt;strong&gt;lo 是 loopback 接口，不对外&lt;/strong&gt;，所以不会引起 ARP 冲突。&lt;/p&gt;
&lt;h3 id="a4keepalived-检测到-nginx-挂了vip-切到-backup但-backup-的-nginx-没起来怎么办"&gt;A4：Keepalived 检测到 Nginx 挂了，VIP 切到 Backup，但 Backup 的 Nginx 没起来怎么办？
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;典型场景：Keepalived 进程比 Nginx 进程先起&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Keepalived 默认&lt;strong&gt;只检测自身进程是否存活&lt;/strong&gt;，不会检查 Nginx。所以 Nginx 没起来，Keepalived 也会把 VIP 拉过来——&lt;strong&gt;用户访问 VIP，结果是连接被拒&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;正确做法&lt;/strong&gt;：用 &lt;code&gt;vrrp_script&lt;/code&gt; 自定义健康检查（参考 §3.3.2 脚本）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# check_nginx.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;ps -ef &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;nginx: master process&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -v grep &lt;span class="p"&gt;|&lt;/span&gt; wc -l&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt; -eq &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;脚本返回非 0 = 优先级降 20 = 自动让出 VIP&lt;/strong&gt;。这样&lt;strong&gt;只有 Nginx 也起来了&lt;/strong&gt;，Backup 才接管 VIP。&lt;/p&gt;
&lt;h3 id="a5异地多活的流量调度和同城双活的本质区别是什么"&gt;A5：异地多活的流量调度和同城双活的本质区别是什么？
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;同城双活&lt;/strong&gt;：机房之间 RTT &amp;lt; 5ms，&lt;strong&gt;LVS/Nginx 跨机房 RPC 几乎无感&lt;/strong&gt;。技术上同城双活就是&amp;quot;在一个城市里&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;异地多活&lt;/strong&gt;：机房之间 RTT 30-100ms，&lt;strong&gt;任何跨机房调用都是 60-200 倍延迟&lt;/strong&gt;。所以&lt;strong&gt;严格禁止跨机房 RPC&lt;/strong&gt;，必须靠&lt;strong&gt;单元化路由 + DNS 调度&lt;/strong&gt;让用户&amp;quot;绑死&amp;quot;在一个机房。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;对应到流量调度&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同城双活：LVS 可在机房之间漂移（Keepalived + 跨机房心跳）&lt;/li&gt;
&lt;li&gt;异地多活：&lt;strong&gt;每个机房一套独立的 LVS + Keepalived 集群&lt;/strong&gt;，机房之间通过 DNS 互导&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="a6硬件-lbf5--a10和软件-lvs-怎么选"&gt;A6：硬件 LB（F5 / A10）和软件 LVS 怎么选？
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;硬件 LB&lt;/th&gt;
					&lt;th&gt;软件 LVS&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;性能&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;千万级 QPS&lt;/td&gt;
					&lt;td&gt;百万级 QPS&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;成本&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;几十万到上百万&lt;/td&gt;
					&lt;td&gt;几千到几万&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;可定制&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;黑盒，只能配&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;完全开源，可深度定制&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;故障恢复&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;厂商技术支持&lt;/td&gt;
					&lt;td&gt;靠自己&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;典型用户&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;银行、证券、政企&lt;/td&gt;
					&lt;td&gt;互联网公司&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;实战选择&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;钱多 + 求稳&lt;/strong&gt;：硬件 LB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;钱紧 + 求灵活&lt;/strong&gt;：LVS（互联网公司主流）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;混合&lt;/strong&gt;：核心入口用硬件 LB，业务入口用 LVS&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="a7为什么很多公司直接用云厂商-lb-而不自己搭-lvs"&gt;A7：为什么很多公司直接用云厂商 LB 而不自己搭 LVS？
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;直接原因&lt;/strong&gt;：省事。云厂商 LB 帮你搞定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多 AZ 高可用&lt;/strong&gt;（自带 Keepalived）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;健康检查 + 自动剔除&lt;/strong&gt;（自带 LVS 健康检查）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨 Region 调度&lt;/strong&gt;（自带 DNS 调度）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DDoS 防护&lt;/strong&gt;（云厂商自带）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS 终结&lt;/strong&gt;（证书托管）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;深层原因&lt;/strong&gt;：&lt;strong&gt;大部分公司没有&amp;quot;自建 LB&amp;quot;的运维能力&lt;/strong&gt;。一个 5 人运维团队，维护业务都吃力，&lt;strong&gt;没人专门优化 LVS 内核参数&lt;/strong&gt;。&lt;strong&gt;用云厂商 LB 是 ROI 更高的选择&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自建 LVS 的场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;业务量足够大（&lt;strong&gt;单 LB 月费用 &amp;gt; 50 万&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;有专门的 SRE 团队&lt;/li&gt;
&lt;li&gt;公有云满足不了的特殊需求（如跨云、混合云）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="a8流量调度层和应用层网关spring-cloud-gateway是什么关系"&gt;A8：流量调度层和应用层网关（Spring Cloud Gateway）是什么关系？
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;层级不同&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;层级&lt;/th&gt;
					&lt;th&gt;职责&lt;/th&gt;
					&lt;th&gt;典型组件&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;流量调度层&lt;/strong&gt;（本篇）&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;机房入口&lt;/strong&gt; + 抗量 + 7 层路由&lt;/td&gt;
					&lt;td&gt;LVS、Nginx、HAProxy&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;应用层网关&lt;/strong&gt;（系列第 3 篇）&lt;/td&gt;
					&lt;td&gt;微服务&lt;strong&gt;内部&lt;/strong&gt;路由 + 灰度 + 限流 + 鉴权&lt;/td&gt;
					&lt;td&gt;Spring Cloud Gateway、Kong、APISIX&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;举例&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户访问 &lt;code&gt;https://api.example.com/order&lt;/code&gt; → &lt;strong&gt;LVS&lt;/strong&gt; → &lt;strong&gt;Nginx&lt;/strong&gt;（按 host 路由）→ &lt;strong&gt;Spring Cloud Gateway&lt;/strong&gt;（按 URL 路由到 order 微服务）→ order 服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nginx 只看 host / URL 前缀&lt;/strong&gt;，&lt;strong&gt;Spring Cloud Gateway 看完整微服务元数据&lt;/strong&gt;（服务名、版本、灰度标签）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;性能差异&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LVS 单实例 50 万 QPS&lt;/li&gt;
&lt;li&gt;Nginx 单实例 1-5 万 QPS&lt;/li&gt;
&lt;li&gt;Spring Cloud Gateway 单实例 1-5 千 QPS（Java 业务逻辑开销）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;所以&lt;/strong&gt;入口用 LVS/Nginx 抗量，&lt;strong&gt;业务内部用 Spring Cloud Gateway 精细治理&lt;/strong&gt;，&lt;strong&gt;两个层都不可少&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="a9怎样评估流量调度层是否需要升级"&gt;A9：怎样评估&amp;quot;流量调度层是否需要升级&amp;quot;？
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;3 个信号&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;容量告警&lt;/strong&gt;：&lt;code&gt;ipvsadm -Ln&lt;/code&gt; 看到活跃连接数持续 &amp;gt; 80% 单机容量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;延迟告警&lt;/strong&gt;：监控显示 P99 延迟持续上涨，&lt;strong&gt;已经超过业务容忍上限&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;故障切换告警&lt;/strong&gt;：Keepalived 1 周内切换 &amp;gt; 3 次，&lt;strong&gt;说明单点故障频繁&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;升级路径&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单机 Nginx 撑不住 → &lt;strong&gt;Nginx + Keepalived&lt;/strong&gt;（水平扩展）&lt;/li&gt;
&lt;li&gt;Nginx + Keepalived 撑不住 → &lt;strong&gt;LVS + Keepalived + Nginx&lt;/strong&gt;（引入 LVS 抗量）&lt;/li&gt;
&lt;li&gt;LVS 也撑不住 → &lt;strong&gt;多 LVS 集群 + 云厂商 LB&lt;/strong&gt;（水平扩展 LVS）&lt;/li&gt;
&lt;li&gt;自研成本低于云厂商 LB 费用 → &lt;strong&gt;自研 LB&lt;/strong&gt;（参考 SLB/MGW/BFE）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;不要&amp;quot;为了升级而升级&amp;quot;&lt;/strong&gt;。日活 50 万的电商上 LVS 是合理，&lt;strong&gt;日活 5 万的内部 OA 上 LVS 就是浪费&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="a10流量调度的未来趋势是什么"&gt;A10：流量调度的未来趋势是什么？
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;3 个明确方向&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;eBPF 替代 IPVS&lt;/strong&gt;：eBPF 可以在内核更早的钩子点（XDP）处理包转发，&lt;strong&gt;比 IPVS 性能高 5-10 倍&lt;/strong&gt;。Cilium 等项目已经在用 eBPF 替代 kube-proxy&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service Mesh 接管 7 层&lt;/strong&gt;：Envoy + Istio 在 K8s 内部已经能做精细流量治理，&lt;strong&gt;部分场景可以替代 nginx-ingress&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;云原生 LB&lt;/strong&gt;：云厂商 LB 越来越智能，&lt;strong&gt;自带灰度、A/B 测试、流量镜像&lt;/strong&gt;，未来自建 LB 的场景会越来越少&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;但这不意味着传统 LVS/Nginx 会被淘汰&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;物理机 / 虚拟机场景&lt;/strong&gt;仍是主流（很多公司没上 K8s）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LVS 内核态转发&lt;/strong&gt;的性能优势是物理规律，&lt;strong&gt;eBPF 只是更近一步&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简单可靠的技术会长期存在&lt;/strong&gt;（KISS 原则）&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;误区警示：追新 ≠ 用对&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;见过最离谱的：日活 10 万的电商，&lt;strong&gt;为了&amp;quot;用 Service Mesh&amp;quot;硬上 Istio&lt;/strong&gt;。结果团队 3 个人花了 3 个月学 Istio，&lt;strong&gt;业务没提升，运维复杂度暴涨&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;原则：&lt;strong&gt;用最熟悉、最稳定、最容易招聘运维的技术&lt;/strong&gt;。&lt;strong&gt;新技术的红利期过了再用&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="参考文章"&gt;参考文章
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://www.linuxvirtualserver.org/" target="_blank" rel="noopener"
 &gt;LVS 官方文档 - ipvsadm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.keepalived.org/documentation.html" target="_blank" rel="noopener"
 &gt;Keepalived 用户手册&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive" target="_blank" rel="noopener"
 &gt;Nginx upstream keepalive 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.aliyun.com/article/781103" target="_blank" rel="noopener"
 &gt;阿里云 SLB 技术解析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tech.meituan.com/2017/01/26/mgw.html" target="_blank" rel="noopener"
 &gt;美团 MGW 实践&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;系列第 1 篇：&lt;a class="link" href="https://liangweidonggood.github.io/p/yi-di-duo-huo/" &gt;异地多活：Java Web 微服务的高可用终极形态&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>