You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jwilder/nginx-proxy搭配Cloudflare SSL开启DNS代理后遇521错误求助

解决jwilder/nginx-proxy搭配Cloudflare Full SSL时的521错误问题

问题分析

你遇到的Cloudflare 521错误(Web Server Down),本质是Cloudflare无法与你的源站建立HTTPS连接。从你的配置和生成的Nginx配置来看,主要有两个核心问题:

  1. nginx-proxy未监听HTTPS端口(443):Cloudflare在Full SSL模式下,会向源站发起HTTPS请求,但你的nginx-proxy只开放了80端口,没有处理443的请求,导致连接失败。
  2. 后端服务的VIRTUAL_PROTO配置错误:你设置了VIRTUAL_PROTO=https,但你的后端容器(saraswati-global、api-healed-id)只暴露了HTTP端口(3000、4001),nginx-proxy会尝试用HTTPS去连接后端,自然会失败。

解决方案步骤

1. 调整docker-compose.yaml配置

修改后的配置如下,关键修改点已标注:

version: "2"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy:alpine
    ports:
      - 80:80
      - 443:443  # 新增:开启HTTPS端口监听
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs  # 存放Cloudflare Origin证书和密钥
      - ./vhost.d:/etc/nginx/vhost.d  # 可选:用于自定义域名的Nginx配置
      - ./html:/usr/share/nginx/html
    network_mode: bridge
    environment:
      - HTTPS_METHOD=noredirect  # 保持HTTP和HTTPS都可访问,也可设为redirect强制HTTPS
  saraswati-global:
    image: asia.gcr.io/ordent-production/ordent/saraswati-global
    ports:
      - 3000:3000
    environment:
      - VIRTUAL_HOST=beta.saraswati.global
      - VIRTUAL_PORT=3000
      - VIRTUAL_PROTO=http  # 修改:后端是HTTP服务,改为http
    network_mode: bridge
  api-healed-id:
    image: asia.gcr.io/ordent-production/ordent/api.healed.id
    ports:
      - 4001:4001
    environment:
      - VIRTUAL_HOST=dev.healed.id
      - VIRTUAL_PORT=4001
      - VIRTUAL_PROTO=http  # 修改:同理改为http
    network_mode: bridge

2. 配置Cloudflare Origin证书

  • 登录Cloudflare控制台,进入你的域名 → SSL/TLS → Origin Server
  • 点击「Create Certificate」,选择默认证书类型,生成后下载证书文件(.pem格式)和私钥文件
  • 将证书重命名为beta.saraswati.global.crt,私钥重命名为beta.saraswati.global.key(如果是通配符证书,就用*.yourdomain.com.crt和*.yourdomain.com.key),放到docker-compose同级的certs目录下

3. 重启服务并验证

执行命令重启所有容器:

docker-compose down && docker-compose up -d

之后可以直接用curl测试源站的HTTPS连接:

curl -v https://beta.saraswati.global --resolve beta.saraswati.global:443:你的服务器IP

如果能正常返回内容,再开启Cloudflare的DNS代理,应该就不会出现521错误了。


额外说明

  • 如果你希望强制所有请求走HTTPS,可以把HTTPS_METHOD设为redirect,这样nginx-proxy会自动把HTTP请求重定向到HTTPS
  • 确保你的服务器防火墙开放了443端口,否则Cloudflare还是无法连接
  • 生成的Nginx配置会自动包含HTTPS监听块,jwilder/nginx-proxy会根据certs目录下的证书自动配置SSL

内容的提问来源于stack exchange,提问作者Dimas Satrio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:27:28