Skip to content

API 网关架构

一套基于 Traefik 的微服务网关架构,解决了多应用部署的痛点。核心设计是:统一入口 + 自动化管理 + 网络隔离

宿主机只暴露 80/443 端口,所有流量通过 Traefik 根据域名规则分发到后端容器(bush、vine、jungle 等)。采用声明式配置,通过 Docker labels 定义路由规则,容器启停时 Traefik 自动感知并更新路由,无需手动维护。

证书管理完全自动化,集成 Let's Encrypt 实现证书申请和续期,HTTP 请求自动重定向到 HTTPS。Traefik 作为 SSL 终止点,后端容器只需 HTTP,简化了配置。

安全方面,数据库部署在独立的内部网络(jungle_internal),只有后端 API 可访问,前端应用和网关无法直连数据库,符合最小权限原则。同时通过中间件统一注入安全响应头(HSTS、XSS 防护等)。

这套架构带来的价值是:运维效率大幅提升(证书自动续期、服务自动发现),安全性增强(网络隔离、统一安全策略),可扩展性强(新增应用只需添加 labels),并且内置 Dashboard 和日志系统,便于监控和排查问题。

整体架构图

                            用户(HTTP/HTTPS)


                        ┌───────────▼───────────┐
                        │   Traefik 网关        │
                        │   宿主机: 80/443      │
                        └───────────────────────┘

        ┌───────────────────────────┴───────────────────────────┐
        │              traefik_network(公共网络层)                │
        │                                                       │
        │                                                       │
        │  ┌────────┐  ┌────────┐  ┌────────┐  ┌────────┐       │
        │  │  bush  │  │  vine  │  │  blog  │  │ earth  │       │
        │  │  :80   │  │  :80   │  │  :80   │  │ :3000  │       │
        │  │ Nginx  │  │ Nginx  │  │ Nginx  │  │  Node  │       │
        │  └────────┘  └────────┘  └────────┘  └────────┘       │
        │                                                       │
        │                          ┌────────┐                   │
        │                          │ jungle │                   │
        │                          │ :3000  │                   │
        │                          │ NestJS │                   │
        │                          └────┬───┘                   │
        │                               │                       │
        └───────────────────────────────┼───────────────────────┘



        ┌───────────────────────────────▼───────────────────────┐
        │            jungle_internal(私有网络层)                  │
        │                                                       │
        │                                                       │
        │    ┌──────────────┐  ┌──────────────┐                 │
        │    │  PostgreSQL  │  │    Redis     │                 │
        │    │    :5432     │  │    :6379     │                 │
        │    └──────────────┘  └──────────────┘                 │
        │                                                       │
        └───────────────────────────────────────────────────────┘

流量路径

  • 用户 → Traefik → bush/vine/blog (Nginx 静态资源)
  • 用户 → Traefik → earth (Nex-js SSR)
  • 用户 → Traefik → jungle (NestJS API)
  • jungle → PostgreSQL/Redis (通过 jungle_internal)

端口说明

80 端口(HTTP)

  • 自动重定向:将所有 HTTP 请求重定向到 HTTPS
  • 证书验证:Let's Encrypt HTTP-01 challenge 验证
  • 用户体验:支持用户直接输入域名(不带协议)

443 端口(HTTPS)

  • 安全通信:所有实际流量通过 HTTPS 加密传输
  • 证书接收:接收 SSL 证书

架构特点

  • 统一网关入口:所有应用流量通过 Traefik 集中管理,宿主机仅暴露 80/443 端口
  • 反向代理:用户请求经 Traefik 转发到后端容器,隐藏真实服务地址
  • SSL/TLS 终止:Traefik 处理 HTTPS 加密解密(TLS 是 SSL 的升级版),后端容器只需 HTTP,证书统一管理
  • 自动服务发现:监听 Docker 事件,容器启停时自动更新路由,无需重启网关,减少人工维护成本
  • 自动 HTTPS 管理:Let's Encrypt 证书自动申请和续期,HTTP 自动重定向到 HTTPS
  • 域名路由分发:基于域名规则实现多应用隔离(bush.1px.club、api.1px.club 等)
  • 安全中间件注入:统一配置安全响应头(HSTS、防点击劫持、XSS 防护等)
  • 网络安全隔离:数据库服务在独立内部网络,仅后端 API 可访问
  • 负载均衡支持:支持多实例部署,自动流量分发和健康检查
  • 声明式配置:通过 Docker labels 定义路由规则,配置即代码
  • 可观测性:内置 Dashboard 与访问日志,便于排查
  • 架构解耦:Traefik 统一承担「流量入口/路由/证书」等职责,静态站点(如 Nginx/容器内静态服务)只负责静态资源与 SPA fallback

路由配置示例

以 bush 为例,通过 Docker labels 声明路由规则:

yaml
labels:
  - 'traefik.enable=true' # 启用 Traefik 代理
  - 'traefik.http.routers.bush.rule=Host(`bush.1px.club`)' # 域名匹配规则
  - 'traefik.http.routers.bush.entrypoints=web,websecure' # 监听 HTTP/HTTPS
  - 'traefik.http.routers.bush.tls.certresolver=letsencrypt' # 自动申请证书
  - 'traefik.http.routers.bush.middlewares=security-headers@file' # 安全头中间件
  - 'traefik.http.services.bush.loadbalancer.server.port=80' # 容器内部端口

监控与日志

Traefik Dashboard

访问 http://localhost:8080 查看实时管理界面:

路由管理

  • 查看所有 HTTP/TCP/UDP 路由规则和匹配条件
  • 实时监控路由状态(活跃/错误)
  • 查看路由详细配置(入口点、中间件、TLS 设置)

服务监控

  • 显示所有后端服务列表(bush、vine、jungle 等)
  • 实时服务健康状态和响应时间
  • 负载均衡配置和实例状态

中间件查看

  • 查看所有中间件配置(security-headers、compress 等)
  • 查看中间件应用情况和参数详情

系统信息

  • 入口点监听状态(80/443 端口)
  • TLS 证书状态和有效期
  • 提供商信息(Docker、File)
  • 整体统计数据(路由、服务、中间件数量)

注意:生产环境中 Dashboard 仅绑定到 127.0.0.1:8080,只能本机访问,确保安全性

如需要开发环境访问生产环境中 Dashboard ,建议使用 SSH Tunnel(查看 Treafik 项目 README 获取更详细的操作方式)

日志收集

bash
# Traefik 访问日志
tail -f traefik/logs/access.log

# 应用日志
docker-compose logs -f [service-name]

Released under the MIT License.