文章

Envoy 与 Nginx 对比

Envoy 与 Nginx:区别、分工与选型

Envoy 和 Nginx 常被放在一起比,但本质不是”同类竞品”——Nginx 是通用 Web 服务器 + 反向代理,Envoy 是给服务网格 / 微服务治理量身造的 L7 代理。本文从配置模型、可观测性、L7 能力、扩展架构、服务网格角色、性能六个维度拆解差异,并结合 K8s / Cilium / LLM 服务化讲清它们各自的边界。


一、一句话定位

NginxEnvoy
诞生2004(Igor Sysoev),解决 C10K2016(Lyft),解决微服务东西向通信
原始问题”一台服务器前面怎么高性能挡流量""成百上千服务之间怎么动态发现、可观测、带 mTLS”
身份通用 Web 服务器 + 反代 + L4/L7 LB边车代理(sidecar)+ 网关,服务网格数据面
实现语言CC++

关键认知:Nginx 的主战场是南北向(入口 / 边缘),Envoy 的主战场是东西向(服务间)。 两者在 K8s Ingress 层是竞品,在服务网格层 Envoy 是事实标准、Nginx 已退场。


二、六个核心差异维度

2.1 配置模型(最本质差异)

NginxEnvoy
配置来源静态 .conf(include 多文件)动态 xDS API(gRPC 流式:LDS/RDS/CDS/EDS/SDS/ADS)
变更生效nginx -s reload(优雅重载,短暂双进程并存;upstream/map 变更需 reload)运行时热更新,无需 reload、不丢连接
控制面耦合无(纯静态文件驱动)强(依赖控制面如 Istio 下发 xDS)

动态配置是 Envoy 能做服务网格数据面的前提——控制面改一条路由规则,Envoy 秒级生效、正在飞的请求不受影响。Nginx 做不到无感变更,每次 reload 都有个短暂的双 master 过渡期,大规模 upstream 频繁变化时运维成本陡增。

2.2 可观测性:原生 vs 外挂

  • Envoy 开箱即用:内建 stats(每个集群 / 路由 / 监听器维度的指标)、access log 自定义格式、原生 tracing 集成(OpenTelemetry / Jaeger / Zipkin)、:9901/admin 接口(看配置、热重启、drain)。
  • Nginx 开源版:只有 access/error log;指标要 stub_status 或第三方 nginx-prometheus-exporter;分布式追踪需 OpenTracing 模块或上 Nginx Plus(收费)。

对 SRE 来说,Envoy 的 upstream_rq_time / downstream_rq_time / rq_retry / cx_active 这类指标天生就能进 Prometheus,不用额外折腾。

2.3 L7 治理能力

能力Nginx(开源)Envoy
协议HTTP/1.1、HTTP/2、HTTP/3(较新)、gRPC、WebSocketHTTP/1.1/2/3 双向、gRPC 原生、WebSocket、MongoDB/Redis/Dubbo 协议嗅探
负载均衡算法round-robin / least_conn / ip_hashround-robin、least-request、一致性哈希(Maglev)、zone-aware、subset、优先级 localityLB
熔断max_fails / fail_timeout(被动、粗粒度)异常检测被动熔断(连续 5xx 率、连接失败率)、主动健康 + 驱逐
重试proxy_next_upstream(有限)重试预算(retry budget)、可重试 4xx/5xx、per-try 超时、对冲(hedging)
限流limit_req(本地漏桶,无全局)本地 + 全局限流(RateLimit 服务集成)
流量切分split_clients(粗略)权重路由、金丝雀、故障注入、镜像(mirror)

一致性哈希、全局限流、故障注入、流量镜像这些”服务治理”能力,在 Nginx 开源版里要么没有、要么要 Nginx Plus。

2.4 扩展架构

  • Nginx:事件驱动,单 master + 多 worker,模块必须编译进二进制(C 写、静态链接)。动态模块后来有,但生态仍以编译期为准。缺点:加个自定义逻辑要重编 + reload。
  • Envoy:多线程 worker(每连接 pin 到一个 worker)、基于 libevent;可扩展 filter chain——L4 listener filters + L7 network/http filters,支持 C++ 编译进二进制或 WASM 扩展。现代设计,扩展点清晰,是 Istio 的自定义 filter 基础。

2.5 在服务网格里的角色

  • Envoy:Istio / Linkerd2 / Consul Connect / 各大云 ASM 的数据面事实标准。负责 sidecar 注入、mTLS 自动、流量切分、故障注入、L7 策略执行。
  • Nginx:NGINX Service Mesh 2021 推出、2023 年 F5 宣布停止维护。之后 Nginx 基本只作为 nginx-ingress(K8s 入口控制器)存在,不再做东西向数据面。

2.6 性能

NginxEnvoy
内存/CPU 开销极低、成熟稳定稍高(per-route 配置、统计开销、filter 链)
单连接吞吐极致略低但差距在缩小
运维复杂度(大规模动态)高(reload 频繁)低(xDS 动态)

结论不绝对:小流量简单反代 Nginx 更轻;大规模微服务动态拓扑下,Envoy 的”动态 + 可观测”省下的运维人天远超那点性能开销。


三、与你知识库的连接:Envoy × Cilium 分工

这是最值得记的一点(结合你 cilium/ 系列):

  • Cilium:用 eBPF 在 L3/L4 做服务发现、KPR、NetworkPolicy——不解析 L7 应用协议。Hubble 的 L7 可见性要靠挂 Envoy sidecar / proxy 才拿得到。
  • Envoy:在 L7 做路由、熔断、重试、mTLS、协议转换。
  • 典型组合:Cilium 管 L3/L4 南北向 + Envoy 管 L7 七层策略。Cilium 的 L7 NetworkPolicy(HTTP/gRPC/Kafka FQDN)本质就是靠内嵌 Envoy 执行的——你在 Cilium 网络策略与零信任 里看到的 L7 策略,底层执行引擎就是 Envoy。

四、反向代理配置对比(SSE / 流式场景)

呼应 HTTP 与 WebSocket 连接模型与超时 那篇:流式(SSE)反代最易踩的坑是缓冲 + 读取超时。两边正确写法:

Nginx(关闭缓冲 + 放宽读取超时)

location /v1/stream {
    proxy_pass http://upstream;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_buffering off;        # 关键:关闭缓冲,SSE 逐字节透传
    proxy_cache off;
    chunked_transfer_encoding on;
    proxy_read_timeout 3600s;   # 覆盖"等响应头 + 流内空闲"
}

Envoy(route 级 timeout + idle)

route_config:
  virtual_hosts:
  - name: stream
    routes:
    - match: { prefix: "/v1/stream" }
      route:
        cluster: upstream
        timeout: 3600s          # 整体超时
        idle_timeout: 3600s     # 流内空闲不断连

两边的核心都是:关缓冲 + 给”等首字节/流内空闲”一个合理上限,否则就会复现那篇帖子的”首包卡死”。


五、选型决策

  • 边缘静态资源 / 简单反代 / 极致 L4 吞吐Nginx(或 nginx-ingress)
  • 服务网格 / 微服务东西向 / mTLS / L7 流量治理 / 强可观测 / 动态配置Envoy
  • 现代 K8s 入口控制器:Envoy 系(Gloo / Contour / Emissary)vs nginx-ingress,本质是在”L7 治理能力”和”极致简单”之间取舍。
  • 两者并用:Cilium(eBPF L3/L4) + Envoy(L7 sidecar) 是当前很多生产集群的”黄金组合”。

关联知识

参考资源

学习时间

阶段时间备注
内容创建2026-07-21应知识库整理需求,从 Nginx/Envoy 对比切入:定位、六维度差异、与 Cilium 分工、SSE 反代配置、选型

状态标记

📖 已掌握 — 两者定位差异、配置模型(xDS vs reload)、可观测性、L7 能力、服务网格角色、与 Cilium 分工 📝 待补充 — Envoy filter chain 自定义开发、Nginx Unit/NGINX Ingress Controller 源码级、两者压测数据对比