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

如何通过Nginx实现HTTPS下SurrealDB的安全WebSocket连接?

无法通过HTTPS/WSS连接SurrealDB后端问题排查

技术栈

  • Nginx:提供Web内容并反向代理默认端口(:8000)的SurrealDB实例
  • SurrealDB:网站使用的数据库方案(目前是我最喜欢的数据库方案之一……前提是它能正常运行😋)
  • React + Next.js:网站主要前端方案
  • Cloudflare:DNS路由与代理服务

当前Nginx配置

worker_processes 1;

events {
    worker_connections 1024;
}


http {
    include mime.types;
    default_type application/octet-stream;

    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    upstream websocket {
        server 127.0.0.1:4321;
    }

    sendfile on;

    keepalive_timeout 65;

    # HTTP server
    server {
        listen 443 ssl;
        server_name [...].com;

        ssl_certificate C:\Certbot\live\[...].com\fullchain.pem;
        ssl_certificate_key C:\Certbot\live\[...].com\privkey.pem;

        location / {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }

    # Secure WebWocket (WSS) server
    server {
        listen 443;
        server_name dev.db.[...].com;


        ssl_certificate C:\Certbot\live\[...].com\fullchain.pem;
        ssl_certificate_key C:\Certbot\live\[...].com\privkey.pem;

        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;

            proxy_http_version 1.1;
            proxy_pass http://websocket;
            proxy_redirect off;
            proxy_pass_request_headers on;
        }
    }
}

Cloudflare配置

主域及所有子域的A记录均指向同一服务器IP,且已启用代理模式,流量全部转发至该服务器。

已尝试的解决方案

  • 为子域和主域分别通过Certbot颁发独立SSL证书
  • 为两个域共享同一SSL证书(通过Certbot)
  • 将proxy_pass指向upstream节点或直接使用127.0.0.1:8000
  • 确保proxy_http_version设置为1.1,proxy_set_header Upgrade设置为$http_upgrade或upgrade
  • 在listen指令中添加/删除ssl后缀,同时监听443和80端口
  • 修改server_name为其他值,未解决问题
  • 端口转发8000、443、80和8080端口
  • 为上述端口及3000端口(Next.js实例)添加TCP/UDP入站/出站防火墙规则
  • 修改SurrealDB的--bind参数调整地址和端口绑定,尚未尝试--addr标志(不清楚正确用法)
  • 通过本地网络和外部WSS端口测试工具连接,均失败
  • 调整Nginx配置,用location /ws替代独立的server指令,未成功

错误现象

无论从何种介质尝试连接,均出现错误:WebSocket连接到wss://dev.db.censored.com/失败

求助

有没有什么排查方向或配置修正建议?我是不是遗漏了什么关键配置?

(注:示例中的[...]为屏蔽的域名,非实际字符)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:27:29