如何通过 nginx 通过 HTTPS 连接到安全的 WebSocket SurrealDB 实例?

问题描述 投票:0回答:0

我正在尝试解决我一直无法通过 HTTPS/WSS 连接到我的 SurrealDB 后端的问题。当尝试通过 HTTP 或 WS 连接时,一切正常,但添加任何类型的 SSL 似乎都会破坏一切。我当前的堆栈如下所示:

  • nginx - 用于提供我的 Web 内容并在其默认端口 (:8000) 上为 SurrealDB 实例提供反向代理。
  • SurrealDB - 我正在为我的网站使用的数据库解决方案(也许是我一直以来最喜欢的数据库解决方案之一......当它工作时😋)
  • React with 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 地址并被代理。

端口 3000 的代理工作并且 Next.js 实例可以通过 HTTPS 访问,所以我不认为 nginx 本身搞砸了,但我可能是错的。

我已经尝试过各种解决方案,包括以下内容:

  • 为子域和主域颁发单独的 SSL 证书(使用 certbot),

  • 为两个域共享相同的 SSL 证书(使用 certbot),

  • 指向

    proxy-pass
    upstream
    以及直接
    127.0.0.1:8000
    方法,

  • 确保以下内容:

    • proxy_http_version
      设置为
      1.1
      .
    • proxy_set_header Upgrade
      设置为
      $http_upgrade
      upgrade
      .
  • 同时收听 443 和 80,包括和不包括

    ssl
    指令上的
    listen
    后缀。

  • server_name
    dev.db.[...].com
    更改为各种其他选项,但没有成功,

  • 端口转发端口8000、443、80、8080.

  • 为上述端口以及端口 3000(对于 Next.js 实例)添加防火墙规则(TCP/UDP + 传入/传出)。

  • 将 SurrealDB 的地址和端口绑定 (

    --bind
    ) 更改为其他内容。请注意,启动 SurrealDB 时可用的
    --addr
    标志是我尚未尝试过的东西,因为我似乎无法完全弄清楚操纵它的正确方法。这可能是问题所在吗?

  • 尝试通过本地网络和外部 WSS 端口测试工具连接,均失败,

  • 重新排序 nginx 配置以使用

    location /ws
    而不是
    server
    指令只是为了看看它是否可行(不幸的是它没有)。

这是我每次尝试从任何媒体连接时遇到的错误:

Console log error

有什么建议吗?我可能遗漏了什么,或者我做错了吗?

(请注意,所提供示例中的 [...] 是被审查的域名,而不是文字字符。)

nginx ssl websocket nginx-reverse-proxy surrealdb
© www.soinside.com 2019 - 2024. All rights reserved.