Traefik反向代理从零部署教程
当你在一台服务器上运行多个Web服务时,用反向代理统一管理入口是常用做法。
Traefik相比Nginx,最大的优势是能自动发现服务并动态更新路由,尤其适合容器化环境。
本文以Docker为例,带零基础用户完成Traefik反向代理的部署与配置。
环境准备与资源清单
在开始之前,你需要准备好以下内容:
- 一台安装了Docker和Docker Compose的Linux服务器(推荐Ubuntu 20.04或CentOS 7+)。
- 一个可以正常解析的域名(例如
example.com),并将A记录指向服务器IP。 - 确保服务器防火墙放行80和443端口(HTTP/HTTPS)。
如果你还没有Docker环境,可以参考官方文档快速安装。
本文使用的Traefik版本为v2.x,具体版本号请以官方最新稳定版为准。
用Docker Compose部署Traefik
创建项目目录:
mkdir ~/traefik && cd ~/traefik
在该目录下创建 docker-compose.yml 文件,内容如下:
version: '3'
services:
traefik:
image: traefik:v2.10
container_name: traefik
restart: unless-stopped
command:
# 启用API和Dashboard,但后续会限制访问
- "--api.dashboard=true"
# 使用Docker作为服务发现提供者
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
# HTTP入口点
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
# Let's Encrypt证书配置(使用staging环境测试,稳定后改为生产)
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
- "--certificatesresolvers.letsencrypt.acme.email=your-email@example.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
ports:
- "80:80"
- "443:443"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./letsencrypt:/letsencrypt"
labels:
# 暴露Dashboard的路由规则,后续可改为更安全的域名
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=auth"
# 使用中间件进行简单HTTP基本认证
- "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xxxxx" # 实际用htpasswd生成
注意替换 your-email@example.com 和 Dashboard 域名。
密码使用 htpasswd 生成后填入。
创建 letsencrypt 目录:
mkdir letsencrypt && touch letsencrypt/acme.json && chmod 600 letsencrypt/acme.json
然后启动Traefik:
docker-compose up -d
检查容器是否运行:
docker ps
看到 traefik 容器处于 Up 状态即成功。
配置反向代理规则:以Web服务为例
假设你有一个Web应用(如Nginx容器)名为 myapp,想让用户通过 https://app.example.com 访问。
你只需在其他容器的labels中声明路由即可。
在 docker-compose.yml 中添加:
myapp:
image: nginx:alpine
container_name: myapp
labels:
- "traefik.enable=true"
- "traefik.http.routers.myapp.rule=Host(`app.example.com`)"
- "traefik.http.routers.myapp.entrypoints=websecure"
- "traefik.http.routers.myapp.tls.certresolver=letsencrypt"
# 不需要映射端口到宿主机,Traefik会通过容器网络自动接入
重启整个栈:
docker-compose up -d
Traefik会自动检测新服务,申请SSL证书并路由访问。
常见坑与避坑建议
- 端口被占用:确保宿主机80/443未被其他程序占用(如Nginx、Apache)。
- 证书申请失败:先使用staging环境测试,确认域名解析正确后再切换到生产环境。注意Let's Encrypt有速率限制。
- Dashboard访问不安全:生产环境应禁止公开Dashboard,建议仅绑定内网IP或添加强密码认证。
- Docker socket权限:挂载
/var/run/docker.sock存在安全风险,非生产环境可接受,生产环境建议使用静态配置文件。
验证反向代理是否生效
访问 http://app.example.com 应自动跳转到 https 并显示Nginx默认页面。
查看Traefik日志:
docker logs traefik | tail -20
能看到路由匹配和证书获取的记录。
你也可以登录Dashboard(如 traefik.example.com)查看路由和Service状态。
如果你正在处理Traefik反向代理,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
后续可以进一步了解Traefik的中间件、负载均衡和蓝绿发布等高级功能。