单服务器多应用场景下的终极方案:Traefik复用80/443端口 + 自动HTTPS证书

预计阅读2分钟
单服务器多应用场景下的终极方案:Traefik复用80/443端口 + 自动HTTPS证书

为什么需要这个方案?

当我们在单台服务器部署多个Web应用时,总会面临两个难题:

  1. 每个应用都想使用80/443标准端口
  2. 每个应用都需要独立的HTTPS证书
  3. 应用需要支持动态启停互不影响

传统方案(如Nginx反向代理)需要手动维护配置,每次增减服务都要:

  1. 修改配置文件
  2. 重新加载配置
  3. 手动申请证书
  4. 处理证书续期

而使用Traefik可以做到:

  • 端口复用:所有应用共享80/443端口
  • 自动发现:容器启停自动生效
  • 自动证书:Let’s Encrypt全自动申请/续期
  • 零停机:配置变更无需重启服务

环境准备

  • 云服务器(1核1G以上配置)
  • 已安装Docker和docker-compose
  • 域名(示例使用starxtek.com
  • 开放服务器的80/443端口

搭建Traefik网关

1. 编写Traefik的docker-compose.yml

proxy/docker-compose.yml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

services:
  traefik:
    image: traefik:v3.3
    ports:
      - 80:80
      - 443:443
    networks:
      - proxy
    volumes:
      - /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt:ro
      - /var/run/docker.sock:/var/run/docker.sock
      - letsencrypt:/letsencrypt
      #- /var/log:/var/log
    command:
      - --api.dashboard=true
      - --log.level=DEBUG
      #- --log.filepath=/var/log/traefik.log
      - --accesslog=true
      #- --accesslog.filepath=/var/log/traefik-access.log
      - --providers.docker.network=proxy
      - --providers.docker.exposedByDefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entryPoints.web.http.redirections.entrypoint.scheme=https
      - --entrypoints.websecure.address=:443
      # remove next line when using Traefik v2
      - --entrypoints.websecure.asDefault=true 
      - --entrypoints.websecure.http.tls.certresolver=myresolver
      - --certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
      - --certificatesresolvers.myresolver.acme.email=mail@starxtek.com
      - --certificatesresolvers.myresolver.acme.tlschallenge=true
      - --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
    labels:
      - traefik.enable=true
      - traefik.http.routers.mydashboard.rule=Host(`traefik.starxtek.com`)
      - traefik.http.routers.mydashboard.service=api@internal
      - traefik.http.routers.mydashboard.middlewares=myauth
      - traefik.http.middlewares.myauth.basicauth.users=test:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/

networks:
  proxy:
    name: proxy

volumes:
  letsencrypt:
    name: letsencrypt

2. 启动Traefik:

cd traefik
docker compose up -d

3. 查看Dashboard

打开https://traefik.starxtek.com/dashboard/#/http/routers,使用test/test登录,应该可以看到下图 traefik-dashboard

部署测试应用

1. 编写whoami的docker-compose.yml

whoami/docker-compose.yml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18

services:
  whoami:
    image: traefik/whoami
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.routers.mywhoami.rule=Host(`whoami.starxtek.com`) || Host(`www.whoami.starxtek.com`)
      - traefik.http.services.mywhoami.loadbalancer.server.port=80
      
      # next lines are optional to redirect www to non-www
      - traefik.http.middlewares.mywwwredirect.redirectregex.regex=^https://www\.(.*)
      - traefik.http.middlewares.mywwwredirect.redirectregex.replacement=https://$${1}
      - traefik.http.routers.mywhoami.middlewares=mywwwredirect
networks:
  proxy:
    external: true

关键标签解释:

  • traefik.enable=true:启用该容器的代理
  • Host(whoami.starxtek.com):域名绑定规则
  • loadbalancer.server.port=80:traefik连接本应用的80端口

2. 启动whoami:

cd whoami
docker compose up -d

3. 查看Dashboard

刷新https://traefik.starxtek.com/dashboard/#/http/routers,应该可以看到whoami.starxtek.com已经上线 traefik-example.starxtek.com

4. 访问测试应用

https://whoami.starxtek.com

继续部署其它应用

参照whoami,重复部署测试应用的过程即可。

方案优势总结

  • 服务自治:每个应用独立维护自己的配置
  • 动态生效:增删服务无需重启Traefik
  • 证书无忧:全自动申请/续期HTTPS证书
  • 资源节约:单服务器运行数十个Web服务
  • 流量精准:支持基于Host/Path/Header的路由

常见问题排查

Q: 证书申请失败

  1. 检查域名解析是否生效
  2. 确保80端口可被外部访问
  3. 查看日志:docker logs traefik

Q: 访问返回404

  1. 确认容器已连接到proxy网络
  2. 检查labels拼写是否正确
  3. 验证docker.sock挂载权限

部署完成后,你的服务器就变成了一个支持弹性扩展的Web服务托管平台!任何新增服务只需配置正确的labels即可立即上线,真正实现"部署即上线"的云原生体验。

联系我们

立即与我们联系,获取更多关于我们产品和解决方案的信息