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

如何通过Nginx反向代理实现Node.js本地WebSocket的HTTPS访问

问题解答

不需要为WebSocket单独配置证书,复用Nginx已有的HTTPS证书即可解决问题。核心是让Nginx处理WSS(加密WebSocket)的SSL握手,再转发到本地的Node.js WS服务,具体调整如下:

1. 修改Nginx配置

把WebSocket代理逻辑整合到已有的443 HTTPS server块中,无需单独开8020端口(减少额外端口管理)。调整后的配置示例:

http {
    ...

    upstream websocket {
        server 127.0.0.1:8080;
    }
    
    server {
        listen 80 default_server;
        listen [::]:80 default_server;

        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;

        ssl_certificate     /location/cert.pem;
        ssl_certificate_key /location/cert-key.pem;

        root /var/www/html/app;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name _;

        # 处理静态页面及常规HTTP请求
        location / {        
            try_files $uri $uri/ =404;
        }

        # WebSocket代理配置
        location /ws {
            proxy_pass http://websocket;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Host $host;
            proxy_read_timeout 86400; # 保持长连接超时时间
            proxy_send_timeout 86400;
        }
    }
}

2. 调整客户端连接代码

将明文WS地址替换为加密的WSS地址,对应上面Nginx配置的/ws路径:

const socket = new WebSocket('wss://domain.com/ws');

3. Node.js服务配置保持不变

你的Node.js WS服务继续监听8080端口即可,无需修改:

const wss = new WebSocketServer({port: 8080})

原理说明

浏览器的混合内容策略禁止HTTPS页面发起明文HTTP(包括WS)请求,因此必须使用WSS(WebSocket Secure)。Nginx作为反向代理,负责处理WSS的SSL加密和解密,将解密后的普通WebSocket请求转发给本地的Node.js服务,因此Node.js端无需配置SSL证书。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:57:29