Coolify logoCoolify

无可用服务器 (503) 错误

如果您的已部署应用程序或服务显示**“无可用服务器”**错误,这表明 Traefik(反向代理)无法在提供的安全 URL (https) 下找到任何(健康的)容器来路由流量。

导致此错误的原因

当出现以下情况时,会发生“无可用服务器”错误:

  1. 健康检查失败 - Traefik 认为您的容器不健康
  2. 域名配置问题 - 域名设置不正确或缺少 www/non-www 变体
  3. 端口不匹配 - 暴露的端口与应用程序实际监听的端口不匹配
  4. 部署停机 - 容器更新期间的短暂停机
  5. 底层 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]ProxyLogs

或通过 SSH:

# 检查代理日志中的错误
docker logs coolify-proxy --tail 50

查找类似 client version 1.24 is too old 的错误消息,这表明 Docker API 版本不匹配

常见解决方案

修复失败的健康检查(最常见)

症状:

  • 容器在 Docker 中显示为 (unhealthy)
  • 健康检查路径返回错误
  • 容器中缺少依赖项(例如 curl/wget

步骤:

  1. 临时禁用健康检查:

    • 转到您的应用程序配置
    • 禁用健康检查
    • 重新启动您的应用程序

    如果这解决了问题,那么问题出在您的健康检查上。

  2. 修复健康检查问题:

这些是修复健康检查的一些常见解决方案。根据您的特定应用程序和健康检查命令进行调整。阅读有关 配置健康检查 的更多信息。

容器中缺少依赖项:

确保您的 Docker 镜像中安装了所有必要的工具,以便健康检查能够正常工作。应用程序 需要安装 curlwget

# 将 curl 添加到您的 Dockerfile
RUN apt-get update && apt-get install -y curl
# 或者对于 Alpine 镜像
RUN apk add --no-cache curl

错误的健康检查路径/主机名:

确保您的应用程序确实在提供健康检查端点且不返回错误。在大多数情况下,主机名将是 localhost127.0.0.1

端口不匹配:

  • 确保健康检查端口与您的应用程序监听端口匹配
  • 如果应用程序在端口 3000 上运行,健康检查应使用端口 3000
  1. 手动测试健康检查:

    如果上述方法未能解决问题,请在容器内手动测试健康检查命令并评估输出。

    您可以通过在 Coolify 中导航到容器的 Terminal 选项卡,或通过 SSH 进入您的服务器并运行以下命令来实现:

    # SSH 到您的服务器并测试使用 curl 的健康检查
    docker exec -it <container-name> curl -f http://localhost:3000/health

修复域名配置

域名设置不正确

症状:

  • 使用自动生成的域名(例如 sslip.io)有效,但自定义域名无效

步骤: 验证您的域名是否在 Coolify 和您的 DNS 提供商中按照 域名 文档正确设置。

重定向问题

症状:

  • 重定向设置为 Redirect to wwwRedirect to non-www
  • 根域名有效,但 www(或反之)无效

步骤:

  1. 添加 www 和非 www 域名:

    确保在 Domains 字段中同时添加了 www 和非 www 版本的域名,如下所示:https://example.com,https://www.example.com

  2. 配置域名重定向:

    • 如果您希望两者都有效,请将 Direction 设置为 Allow www & non-www
  3. 重启应用程序:

    • 域名更改后始终重启

HTTPS 问题

如果您的站点只能通过 HTTP 访问而不能通过 HTTPS 访问,请检查您的域名配置:

  • 用于 HTTPS 和 SSL:在域名字段中使用 https:// 前缀:https://example.com
  • 仅用于 HTTP:在域名字段中使用 http:// 前缀:http://example.com(不会生成 SSL 证书)

确保您的域名配置中的协议与您希望访问站点的方式匹配,然后重启您的应用程序。

修复端口配置

症状:

  • 应用程序/服务通过 http://IP:port 工作,但不通过域名工作(需要手动端口映射)
  • Traefik 无法到达应用程序

步骤:

  1. 检查暴露的端口:

    代理需要知道您的应用程序在哪个端口上监听。检查端口配置是否正确。

    显示无可用服务器的截图

    应用程序 中,这是在 Ports Exposes 字段中定义的。

    显示无可用服务器的截图

    服务堆栈 中,这是通过在 Domains 字段的 URL 末尾添加端口(例如 https://example.com:3000)或在 Dockerfile 中定义 EXPOSE 指令来定义的。

  2. 验证应用程序监听地址:

    显示无可用服务器的截图

    您的应用程序/服务可能仅绑定到 localhost127.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.31v3.6.1 中发布了修复程序。从 v2.11.31 和 v3.6.1 开始,Traefik 现在将自动协商 Docker API 版本,因此此问题不应再发生。

解决方案:

如果您已经在使用 Coolify,则需要按照以下步骤手动更新 Traefik:

  1. 导航到代理配置:

    • 转到您的 Coolify 仪表板(https://app.coolify.io/ 适用于云用户)→ Servers → [Your Server] → Proxy → Configuration
  2. 更改 Traefik 版本:

    • 将版本更改为:v3.6.1(如果留在 v2,则使用 v2.11.31
  3. 重启代理:

    • 单击 Restart Proxy
coolify proxy traefik version update

注意事项:

  • 您需要在连接到您的 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

预防提示

  1. 始终使用健康检查:

    • 在您的应用程序中实现 /health 端点
    • 确保所有依赖项(例如 curl/wget)在您的容器中可用
  2. 先在本地测试:

    • 在部署之前测试您的健康检查端点
    • 验证端口配置是否与您的应用程序匹配
  3. 监控容器状态:

    • 定期检查 docker ps 以查找不健康的容器
    • 设置健康检查失败的监控
  4. 使用预发环境:

    • 首先在预发环境中测试域名配置

何时寻求帮助

如果这些解决方案都不起作用,请加入我们的 Discord 社区 并提供:

  • 应用程序日志
  • Coolify 代理日志
  • 容器健康状态 (docker ps)
  • 域名配置截图
  • 健康检查配置
  • 您已经尝试过的步骤

这将帮助社区诊断更复杂的问题,这些问题特定于您的设置。

On this page