如何让Apache与Traefik Docker代理共存并实现请求转发?
解决Traefik与Apache端口冲突并实现通配符域名转发的配置方案
步骤1:调整Traefik容器端口映射
修改你的Traefik docker-compose.yml,将默认的80/443端口映射改为20080/20443,避免与Apache冲突:
services: traefik: image: traefik:v2.10 ports: - "20080:80" # 外部HTTP端口 -> Traefik内部80端口 - "20443:443" # 外部HTTPS端口 -> Traefik内部443端口 - "8080:8080" # Traefik管理端口(可选) # 其他原有配置保持不变
重启Traefik容器:
docker-compose up -d traefik
步骤2:启用Apache代理相关模块
运行以下命令启用Apache反向代理所需的模块:
sudo a2enmod proxy proxy_http ssl rewrite headers proxy_connect sudo systemctl restart apache2
步骤3:配置Apache通配符反向代理虚拟主机
创建新的Apache配置文件 /etc/apache2/sites-available/docker-proxy.conf,同时处理HTTP和HTTPS的通配符请求:
HTTP转发配置(80端口)
<VirtualHost *:80> ServerName docker-domain1.loc ServerAlias *.docker-domain1.loc ProxyPreserveHost On ProxyRequests Off # 转发所有请求到Traefik的HTTP端口 ProxyPass / http://localhost:20080/ ProxyPassReverse / http://localhost:20080/ # 传递协议头部给Traefik RequestHeader set X-Forwarded-Proto "http" </VirtualHost>
HTTPS转发配置(443端口)
先生成本地自签通配符证书(本地开发无需信任机构颁发):
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/ssl/private/docker-domain1.loc.key \ -out /etc/ssl/certs/docker-domain1.loc.crt \ -subj "/CN=*.docker-domain1.loc"
然后在配置文件中添加HTTPS部分:
<VirtualHost *:443> ServerName docker-domain1.loc ServerAlias *.docker-domain1.loc # 启用SSL并指定证书路径 SSLEngine on SSLCertificateFile /etc/ssl/certs/docker-domain1.loc.crt SSLCertificateKeyFile /etc/ssl/private/docker-domain1.loc.key ProxyPreserveHost On ProxyRequests Off # 转发到Traefik的HTTPS端口 ProxyPass / https://localhost:20443/ ProxyPassReverse / https://localhost:20443/ # 禁用Traefik自签证书的验证(本地开发环境) SSLProxyEngine on SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off # 传递协议头部给Traefik RequestHeader set X-Forwarded-Proto "https" </VirtualHost>
步骤4:启用配置并重启Apache
sudo a2ensite docker-proxy.conf sudo systemctl restart apache2
步骤5:配置本地hosts文件
编辑 /etc/hosts,将所有Docker相关域名指向本地回环地址:
127.0.0.1 docker-domain1.loc 127.0.0.1 docker-app1.docker-domain1.loc 127.0.0.1 docker-app2.docker-domain1.loc # 按需添加更多子域名
注:/etc/hosts不支持原生通配符解析,需逐个添加子域名;若需更灵活的本地DNS,可安装dnsmasq实现通配符解析。
步骤6:验证配置
- 启动Apache和Traefik容器,确保两者无端口冲突
- 访问
http://docker-app1.docker-domain1.loc和https://docker-app1.docker-domain1.loc,确认请求正常转发到Traefik管理的Docker服务 - 访问原有Apache项目
http://apache-app1.apache-domain1.loc,确认服务正常运行
关键注意事项
- 避免在Apache配置中使用带
https://的ServerAlias,仅需填写纯域名 - 本地开发环境禁用SSL证书验证是安全的,生产环境需使用可信证书并启用验证
- Traefik内部仍使用80/443端口,无需修改Traefik的入口点配置
内容的提问来源于stack exchange,提问作者AJ.
相关产品推荐
相关产品推荐

