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]