Envoy 与 Nginx 的差异与选择
结论先行
Envoy 是面向服务网格和动态配置的 L7 代理,支持 xDS、可观测性和熔断;Nginx 是成熟的 Web 服务器/反向代理,静态资源、生态和运维经验最广。服务网格/边缘动态代理优先 Envoy,传统 Web 与反代优先 Nginx。
核心差异
| 维度 |
Envoy |
Nginx |
| 定位 |
L7 代理/服务网格 sidecar |
Web 服务器 + 反向代理 |
| 配置 |
xDS 动态下发,YAML/API |
配置文件 + reload |
| 服务发现 |
原生动态集群 |
需 upstream 更新/reload |
| 可观测性 |
丰富指标、追踪、访问日志 |
日志/状态模块 |
| 熔断/重试 |
原生支持 |
需模块/配置 |
| 静态文件 |
不是重点 |
强项 |
| 生态 |
Istio、Emissary、Contour 等 |
最广的 Web 生态 |
怎么选
- Kubernetes/服务网格、需要动态配置和细粒度流量治理:Envoy。
- 传统 Web 站点、静态资源、简单反代:Nginx。
- 需要 mTLS、熔断、重试、流量镜像:Envoy。
- 团队已有 Nginx 运维体系:继续 Nginx,除非需要网格能力。
注意
envoy --mode validate -c envoy.yaml
nginx -t && nginx -s reload
- Envoy 的配置模型复杂,通常由控制面(Istio/Contour 等)生成,不建议手写全量 xDS。
- Nginx 的 reload 是平滑的,但配置变更需要重新加载;动态 upstream 需额外方案。
- 两者都能做 L7 代理,但超时、重试、缓冲和 header 语义不同。
- Envoy 的 sidecar 会增加资源开销和排障链路;评估集群规模。
- 服务网格的 mTLS 和授权策略要统一设计,避免只开一半。
相关命令
envoy — Envoy 代理
nginx — Nginx
istioctl — Istio 控制面