无可用服务器 (503) 错误
如果您的已部署应用程序或服务显示**“无可用服务器”**错误,这表明 Traefik(反向代理)无法在提供的安全 URL (https) 下找到任何(健康的)容器来路由流量。
导致此错误的原因
当出现以下情况时,会发生“无可用服务器”错误:
- 健康检查失败 - Traefik 认为您的容器不健康
- 域名配置问题 - 域名设置不正确或缺少 www/non-www 变体
- 端口不匹配 - 暴露的端口与应用程序实际监听的端口不匹配
- 部署停机 - 容器更新期间的短暂停机
- 底层 Traefik 问题 - Traefik 本身的问题(例如 Docker API 版本不匹配)
快速诊断步骤
1. 检查容器健康状态
首先,验证您的容器是否运行正常:
# SSH 到您的服务器并检查容器状态
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"查找显示 (unhealthy) 状态的容器——这表明存在健康检查问题。
2. 检查域名配置
验证您是否在应用程序/服务配置中正确输入了域名,并且您的 DNS 记录指向正确的 IP 地址。请参阅 域名 文档以获取完整的格式规则。
3. 检查 Traefik 代理日志
检查 Traefik 日志以查找底层问题:
通过 Coolify UI:
- 转到
Servers→[Your Server]→Proxy→Logs
或通过 SSH:
# 检查代理日志中的错误
docker logs coolify-proxy --tail 50查找类似 client version 1.24 is too old 的错误消息,这表明 Docker API 版本不匹配。
常见解决方案
修复失败的健康检查(最常见)
症状:
- 容器在 Docker 中显示为
(unhealthy) - 健康检查路径返回错误
- 容器中缺少依赖项(例如
curl/wget)
步骤:
-
临时禁用健康检查:
- 转到您的应用程序配置
- 禁用健康检查
- 重新启动您的应用程序
如果这解决了问题,那么问题出在您的健康检查上。
-
修复健康检查问题:
这些是修复健康检查的一些常见解决方案。根据您的特定应用程序和健康检查命令进行调整。阅读有关 配置健康检查 的更多信息。
容器中缺少依赖项:
确保您的 Docker 镜像中安装了所有必要的工具,以便健康检查能够正常工作。应用程序 需要安装 curl 或 wget。
# 将 curl 添加到您的 Dockerfile
RUN apt-get update && apt-get install -y curl
# 或者对于 Alpine 镜像
RUN apk add --no-cache curl错误的健康检查路径/主机名:
确保您的应用程序确实在提供健康检查端点且不返回错误。在大多数情况下,主机名将是 localhost 或 127.0.0.1。
端口不匹配:
- 确保健康检查端口与您的应用程序监听端口匹配
- 如果应用程序在端口
3000上运行,健康检查应使用端口3000
-
手动测试健康检查:
如果上述方法未能解决问题,请在容器内手动测试健康检查命令并评估输出。
您可以通过在 Coolify 中导航到容器的
Terminal选项卡,或通过 SSH 进入您的服务器并运行以下命令来实现:# SSH 到您的服务器并测试使用 curl 的健康检查 docker exec -it <container-name> curl -f http://localhost:3000/health
修复域名配置
域名设置不正确
症状:
- 使用自动生成的域名(例如
sslip.io)有效,但自定义域名无效
步骤: 验证您的域名是否在 Coolify 和您的 DNS 提供商中按照 域名 文档正确设置。
重定向问题
症状:
- 重定向设置为
Redirect to www或Redirect to non-www - 根域名有效,但 www(或反之)无效
步骤:
-
添加 www 和非 www 域名:
确保在
Domains字段中同时添加了 www 和非 www 版本的域名,如下所示:https://example.com,https://www.example.com -
配置域名重定向:
- 如果您希望两者都有效,请将
Direction设置为Allow www & non-www
- 如果您希望两者都有效,请将
-
重启应用程序:
- 域名更改后始终重启
HTTPS 问题
如果您的站点只能通过 HTTP 访问而不能通过 HTTPS 访问,请检查您的域名配置:
- 用于 HTTPS 和 SSL:在域名字段中使用
https://前缀:https://example.com - 仅用于 HTTP:在域名字段中使用
http://前缀:http://example.com(不会生成 SSL 证书)
确保您的域名配置中的协议与您希望访问站点的方式匹配,然后重启您的应用程序。
修复端口配置
症状:
- 应用程序/服务通过
http://IP:port工作,但不通过域名工作(需要手动端口映射) - Traefik 无法到达应用程序
步骤:
-
检查暴露的端口:
代理需要知道您的应用程序在哪个端口上监听。检查端口配置是否正确。
在 应用程序 中,这是在
Ports Exposes字段中定义的。
在 服务堆栈 中,这是通过在
Domains字段的 URL 末尾添加端口(例如https://example.com:3000)或在Dockerfile中定义EXPOSE指令来定义的。 -
验证应用程序监听地址:
您的应用程序/服务可能仅绑定到
localhost或127.0.0.1,这使得它无法从容器外部访问。确保您的应用程序监听所有接口 (0.0.0.0)。
处理部署停机
症状:
- 部署期间短暂的“无可用服务器”
- 仅在容器更新期间发生
解决方案:配置滚动更新
确保 Rolling Updates 配置正确。请参阅 滚动更新文档
更新 Traefik 以修复 Docker API 版本问题
症状:
- 出现“无可用服务器”错误
- Coolify 代理日志显示以下错误消息:
Error response from daemon: client version 1.24 is too old. Minimum supported API version is 1.44, please upgrade your client to a newer version - 应用程序容器运行正常,但访问域名显示“无可用服务器”
根本原因: 问题发生是因为 Traefik 硬编码了 Docker API 版本。
Traefik 团队在 v2.11.31 和 v3.6.1 中发布了修复程序。从 v2.11.31 和 v3.6.1 开始,Traefik 现在将自动协商 Docker API 版本,因此此问题不应再发生。
解决方案:
如果您已经在使用 Coolify,则需要按照以下步骤手动更新 Traefik:
-
导航到代理配置:
- 转到您的 Coolify 仪表板(https://app.coolify.io/ 适用于云用户)→ Servers → [Your Server] → Proxy → Configuration
-
更改 Traefik 版本:
- 将版本更改为:
v3.6.1(如果留在 v2,则使用v2.11.31)
- 将版本更改为:
-
重启代理:
- 单击
Restart Proxy
- 单击
注意事项:
- 您需要在连接到您的 Coolify 实例的每台服务器上进行此操作
- 这适用于自托管和 Coolify Cloud 用户
- (云用户:Traefik 运行在您自己的服务器上,而不是 Coolify 的服务器上,因此您需要按照上述指南自行更新它)
- 如果您已更改 Docker 守护进程配置以设置最低支持的 API 版本,那么我们建议将其还原,因为它可能会在未来引起问题。
为什么 Coolify 不为现有服务器自动更新
一些用户有自定义配置(如 DNS 挑战),这些配置在更新到更新版本的 Traefik 时可能会中断。请在更新前检查 Traefik 更改日志。
- 如果您使用的是默认的 Coolify Traefik 配置,您可以安全地更新到 v3.6.1,没有任何问题。
- 如果您当前使用的是 Traefik v2 并且不想升级到 v3,您可以更新到修补后的 v2.11.31。
高级调试
检查 Traefik 配置
# 查看 Traefik 动态配置
cat /data/coolify/proxy/dynamic/*.yml
# 检查 Traefik 日志
docker logs coolify-proxy -f
# 检查容器标签以验证 Traefik 路由配置
docker inspect <your-container-name> --format='{{json .Config.Labels}}' | jq检查应用程序日志
# 检查您的应用程序日志中的错误
docker logs <your-container-name> -f从容器内部测试健康检查
# 手动执行健康检查命令
docker exec -it <container-name> /bin/sh
curl -f http://localhost:3000/health预防提示
-
始终使用健康检查:
- 在您的应用程序中实现
/health端点 - 确保所有依赖项(例如
curl/wget)在您的容器中可用
- 在您的应用程序中实现
-
先在本地测试:
- 在部署之前测试您的健康检查端点
- 验证端口配置是否与您的应用程序匹配
-
监控容器状态:
- 定期检查
docker ps以查找不健康的容器 - 设置健康检查失败的监控
- 定期检查
-
使用预发环境:
- 首先在预发环境中测试域名配置
何时寻求帮助
如果这些解决方案都不起作用,请加入我们的 Discord 社区 并提供:
- 应用程序日志
- Coolify 代理日志
- 容器健康状态 (
docker ps) - 域名配置截图
- 健康检查配置
- 您已经尝试过的步骤
这将帮助社区诊断更复杂的问题,这些问题特定于您的设置。
