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

wbgh16ku  于 2023-05-28  发布在  Nginx
关注(0)|答案(1)|浏览(170)

我试图解决这个问题,我一直在经历,其中我一直无法连接到我的SurrealDB后端通过HTTPS/WSS。当尝试通过HTTP或WS连接时,一切正常,但添加任何类型的SSL似乎会破坏一切。我的当前堆栈看起来像这样:

*nginx-用于为我的web内容提供服务,并在SurrealDB示例的默认端口(: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_upgradeupgrade
  • 监听443和80,包括和排除listen指令上的ssl后缀。
  • server_namedev.db.[...].com更改为各种其他选项,但未成功,
  • 端口转发端口8000、443、80和8080。
  • 为上述端口以及端口3000(用于Next.js示例)添加防火墙规则(TCP/UDP +传入/传出)。
  • 将SurrealDB的地址和端口绑定(--bind)更改为其他内容。请注意,启动SurrealDB时可用的--addr标志是我还没有尝试过的,因为我似乎无法找到正确的方法来操作它。这可能是问题所在吗?
  • 尝试通过本地网络和外部WSS端口测试工具连接,均失败,
  • 重新排序了nginx配置,使用location /ws而不是server指令,只是为了看看这是否可行(不幸的是,它没有)。

这是我每次尝试从任何介质连接时都会遇到的错误:
Console log error "WebSocket connection to wss://dev.db.censored.com/' failed
有什么建议吗?是我错过了什么,还是我做错了?

  • (请注意,示例中的[...]是经过审查的域名,而不是文字字符。

相关问题