惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
Recent Announcements
Recent Announcements
A
About on SuperTechFans
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Google DeepMind News
Google DeepMind News
S
Schneier on Security
S
Secure Thoughts
T
The Exploit Database - CXSecurity.com
Martin Fowler
Martin Fowler
P
Proofpoint News Feed
Security Latest
Security Latest
Jina AI
Jina AI
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Recorded Future
Recorded Future
T
Tor Project blog
有赞技术团队
有赞技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
News | PayPal Newsroom
博客园 - 三生石上(FineUI控件)
MyScale Blog
MyScale Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
Forbes - Security
Forbes - Security
D
DataBreaches.Net
人人都是产品经理
人人都是产品经理
NISL@THU
NISL@THU
C
Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Google DeepMind News
Google DeepMind News
Project Zero
Project Zero
IT之家
IT之家
T
Threatpost
Cyberwarzone
Cyberwarzone
O
OpenAI News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
J
Java Code Geeks
P
Proofpoint News Feed
The Last Watchdog
The Last Watchdog
月光博客
月光博客
Latest news
Latest news
MongoDB | Blog
MongoDB | Blog
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - Lemo_wd

flutter —— iOS 的构建与分发 flutter —— 理解 iOS 的依赖管理 wireguard 入门 k3s 基础 —— 将 traefik 替换为 ingress-nginx Pr 入门 为什么 TCP 是3次握手4次挥手? 给 ssh 私钥文件配置统一口令 Clickhouse 物化视图与投影 Clickhouse 主键索引 Clickhouse 核心概念 ClickHouse 案例学习 —— 使用 ClickHouse 探索 GitHub 统计信息 linux Tun/Tap 虚拟网卡 Clickhouse 的 kafka Engine 集成 Clickhouse 表引擎 —— MergeTree 局域网中的设备间的流量转发 d3.js 构建股权架构图并绘制双向节点树 final cut pro 入门 d3.js 构建股权架构图并绘制股权百分比 flutter 的滚动控制 —— 滚动类组件的内部与整体滚动
滚动部署零碎笔记1
Lemo_wd · 2025-09-04 · via 博客园 - Lemo_wd

1. 防火墙的拦截逻辑

问题:A 与 B 建立长连接后,防火墙会拦截 B 返回给 A 的流量吗?

长连接的本质:

长连接(例如 TCP 连接)一旦建立,通信双方可以在这个连接上持续交换数据。TCP 连接在防火墙看来是一个 “状态连接”(stateful connection):防火墙记录了连接的源 IP、目的 IP、端口以及连接状态(SYN、ESTABLISHED 等)。

① 状态感知型(Stateful)防火墙:

  • 允许返回流量:如果 A 发起到 B 的连接(比如 TCP SYN),防火墙会允许 B 的返回流量(SYN-ACK、数据包)通过。
  • 对 已建立的连接,防火墙默认允许返回流量。
  • 如果 B 主动发起新连接到 A,防火墙会按规则拦截,除非允许入站。

举例:企业防火墙、云安全组通常采用。

② 无状态型(Stateless)防火墙

  • 每个包单独检查,不维护连接状态。
  • 规则只看源 IP/端口和目的 IP/端口,无法“记住”连接状态。
  • 可以完全阻止 B 的流量进入 A,即使是响应已有连接也不例外(可能导致 TCP 拆包、重传)。

举例:Linux iptables 里 不使用 state/conntrack 的纯过滤规则。

# 拦截所有去 80 端口的请求
iptables -A OUTPUT -p tcp --dport 80 -j DROP

# 也可以使用 state 实现精确控制
# 放行新建到端口 80 的请求 或者 已建立的连接
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
# 只放行已建立连接的返回流量通过
iptables -A INPUT  -p tcp --sport 80 -m state --state ESTABLISHED     -j ACCEPT

2. Nginx 动态切换 upstream

问题:在 Nginx 动态切换 upstream 服务器的过程中,若某客户端请求已发送至原 upstream 但未得到即时回复,此时切换 upstream 后,该客户端是否仍可接收到来自原 upstream 的响应?

可以。Nginx 在重新加载配置(例如使用 nginx -s reload 命令)时,会启动新的 worker 进程来处理新请求,并且旧的 worker 进程会继续处理已经接收但尚未完成的请求。具体来说,Nginx 的 reload 操作不会中断现有的连接和请求处理,而是平滑地过渡到新的配置。

3. 就地升级 与 跨机器升级

① 就地升级 In-Place Upgrade:

通常是在一台机器上跑两个版本(旧版+新版),再通过端口或反向代理进行流量切换。

② 跨机器升级

两套机器(集群/实例)分别运行旧版本和新版本,然后切换流量。

  • Blue-Green Deployment(蓝绿发布)
    一套是 Blue(当前运行),一套是 Green(新版本),切流量时完成升级。需要临时开新机器,升级完成后直接关掉旧机器不浪费资源。

  • Canary Release(金丝雀发布)
    部分机器切到新版本,验证无误后逐步放量。

  • Rolling Upgrade / Rolling Deployment(滚动升级)
    集群里逐台机器切换版本,整体不中断。

应用场景的区别:

  • 金丝雀:适合 新功能/灰度发布。
  • 蓝绿:适合 大升级/高风险变更。
  • 滚动:适合 日常迭代。

4. Nginx 中 变更 upstream 与 变更路由 两种方案比较

① 变更 upstream:简单粗暴,适合单一服务的升级切换或蓝绿发布。

② 变更路由:策略灵活,适合大规模灰度发布和复杂流量治理。

Nginx 中灰度发布的方案实现:

基于 upstream 的权重也可以实现灰度发布,下面可以简单实现 10% 流量灰度到 v2:

upstream backend {
    server 10.0.0.1:8080 weight=9; # v1
    server 10.0.0.2:8080 weight=1; # v2
}

server {
    listen 80;

    location / {
        proxy_pass http://backend;
    }
}

基于请求头进行灰度发布

http {
    upstream v1 {
        server 10.0.0.1:8080;
    }
    upstream v2 {
        server 10.0.0.2:8080;
    }

    # 定义 map,根据请求头 X-Test 判断使用哪个 upstream
    map $http_x_test $backend {
        default v1;   # 默认走 v1
        v2      v2;   # 如果请求头是 v2,就走 v2
    }

    server {
        listen 80;

        location / {
            proxy_pass http://$backend;
        }
    }
}

5. Nginx 自带的故障转移 与 Keepalived 的故障转移 各自的适用场景

① Nginx 自带的故障转移

作用范围:Nginx upstream 内部的后端节点。

机制:如果某个后端失败(超时/连接失败/返回错误),Nginx 会自动切换到其他节点。

适用场景:单机内的后端服务故障转移(例如 Nginx 代理两台应用服务器)。

② Keepalived 的故障转移

作用范围:Nginx 实例之间 / 主机之间。

机制:Keepalived 监控服务(如 Nginx 进程存活、端口可用)。如果主节点挂了,VIP 会漂移到备节点。

适用场景:Nginx / HAProxy 本身高可用,以及 数据库主备切换。