You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Traefik实现本地Docker服务与外部VM节点的负载均衡

问题解答

1. 你猜测的配置方式不可行

Traefik的负载均衡servers配置项仅支持完整的url字段,没有单独的port配置项,所以你写的混合配置无法被Traefik识别。同时你提到的「不能混用标签和文件配置」是误解:仅同一个路由/服务不能同时通过两种方式定义,全局维度两种配置Provider是可以同时启用互不影响的。

2. 跨VM负载均衡的正确实现方案

最稳定易维护的方案是通过文件动态配置Provider定义统一的负载均衡服务,步骤如下:

前置准备

  • 确认两台VM处于同一私有网络,内网可以互通
  • 将本地Docker中的Node服务端口映射到宿主机私有IP的指定端口(比如3000),不要监听公网IP避免安全风险,第二台VM上的Node实例也做相同的端口映射配置
  • 放开两台VM安全组的3000端口内网访问权限,仅允许对端私有IP放行

步骤1:开启Traefik文件配置Provider

修改你的Traefik静态配置(docker-compose.yml里的command或者traefik.yml配置文件),新增文件配置Provider声明:

providers:
  docker: {} # 保留原来的Docker Provider,不影响其他标签配置的服务
  file:
    directory: /etc/traefik/dynamic
    watch: true # 配置文件改动自动加载,无需重启Traefik

同时要把你宿主机上存放动态配置的目录挂载到Traefik容器的/etc/traefik/dynamic路径。

步骤2:编写负载均衡动态配置

在上述动态配置目录下新建nest-service.yml,内容如下:

http:
  routers:
    nestjs-server:
      rule: Host(`mydomain.com`) || Host(`www.mydomain.com`)
      entrypoints:
        - websecure
      tls:
        certresolver: letsencrypt
      service: nestjs-cluster
      middlewares:
        - redirect-to-https # 复用你原来定义的HTTPS跳转中间件
  services:
    nestjs-cluster:
      loadBalancer:
        servers:
          - url: "http://<第一台VM私有IP>:3000/"
          - url: "http://<第二台VM私有IP>:3000/"

步骤3:清理冗余配置

删除原来本地nestjs-server容器配置中的所有Traefik相关标签,现在该服务的路由和负载均衡已经统一由文件配置接管。
修改完成后重启Traefik即可生效,Traefik会自动把请求轮询分发到两台VM的Node实例上。如果后续需要扩容更多节点,直接在上述文件的servers列表里新增对应节点的内网url即可,无需修改其他配置。

内容的提问来源于stack exchange,提问作者Cameron Sima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:42:00