当前位置: 代码网 > 服务器>网络>websocket > Nginx将WebSocket ws视频流转换为wss视频流的配置方案

Nginx将WebSocket ws视频流转换为wss视频流的配置方案

2026年09月20日 websocket 我要评论
将 websocket (ws) 转换为安全 websocket (wss),核心在于在通信链路中加入 ssl/tls 加密层。通常有两种实现方案:反向代理方案(推荐):使用 nginx 或 cadd

将 websocket (ws) 转换为安全 websocket (wss),核心在于在通信链路中加入 ssl/tls 加密层

通常有两种实现方案:

  1. 反向代理方案(推荐):使用 nginx 或 caddy 作为边缘代理,处理 ssl 卸载。
  2. 应用层方案:直接在 node.js/python/go 后端代码中配置 ssl 证书。

以下是工业界最常用的 nginx 反向代理方案

方案一:使用 nginx 作为 wss 代理

这种方式无需修改后端视频流业务代码,性能最高,且方便管理证书。

1. 准备工作

  • 你已经有一个运行在 ws://localhost:8080 的视频流服务。
  • 你拥有域名(例如 video.example.com)。
  • 你拥有 ssl 证书(cert.crt 和 key.key)。

2. nginx 配置 (/etc/nginx/conf.d/video.conf)

在 nginx 中,你需要配置一个监听 443 端口的 server 块,并将 wss 请求转发给后端的 ws 服务。

server {
    listen 443 ssl;
    server_name video.example.com;
    # 配置 ssl 证书
    ssl_certificate     /etc/nginx/ssl/video.example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/video.example.com.key;
    # ssl 优化配置(可选)
    ssl_protocols tlsv1.2 tlsv1.3;
    ssl_ciphers high:!anull:!md5;
    location / {
        # 转发到后端 ws 服务
        proxy_pass http://127.0.0.1:8080;
        # websocket 关键头配置
        proxy_http_version 1.1;
        proxy_set_header upgrade $http_upgrade;
        proxy_set_header connection "upgrade";
        # 传递客户端真实 ip
        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_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }
}

3. 为什么这样配置有效?

  • ssl 卸载:客户端访问 wss://video.example.com,nginx 负责进行 tls 解密。
  • 协议转换:nginx 将解密后的数据通过内部 http 连接转发给后端 ws://127.0.0.1:8080
  • header 处理upgrade 和 connection 字段是 websocket 建立连接的核心,告诉 nginx 这是一个长连接。

方案二:如果你使用 node.js 直接部署 (https 模块)

如果你的后端是 node.js (例如 ws 库),你也可以直接在代码中加载证书:

const fs = require('fs');
const https = require('https');
const websocket = require('ws');
// 加载证书
const server = https.createserver({
  cert: fs.readfilesync('/path/to/cert.crt'),
  key: fs.readfilesync('/path/to/key.key')
});
const wss = new websocket.server({ server });
wss.on('connection', (ws) => {
  console.log('客户端已连接');
  // 这里处理视频流逻辑
});
server.listen(8443); // 此时访问 wss://your-ip:8443

常见避坑指南

  1. 混合内容错误 (mixed content)
    • 如果你的前端网页是通过 https 加载的,你绝对不能在代码中使用 ws://,否则浏览器会因安全策略拦截。必须使用 wss://
  2. 证书链问题
    • 使用 nginx 时,ssl_certificate 必须包含完整的证书链(包含中间证书),否则移动端或部分浏览器会报 self-signed certificate 错误。
  3. 连接超时
    • 如果是长时视频流,确保 nginx 的 proxy_read_timeout 设置足够大,否则 nginx 会自动断开 60 秒后没有数据包的连接。
  4. 防火墙
    • 确保服务器的防火墙(ufw 或 firewalld)开放了 443 端口。

建议:生产环境强烈推荐使用 方案一 (nginx),因为 nginx 处理高并发连接的能力远高于 node.js 或 python 自带的 http 服务,且更易于维护 ssl 证书的更新。

到此这篇关于nginx将websocket ws视频流转换为wss视频流的配置方案的文章就介绍到这了,更多相关nginx websocket ws视频流转为wss内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com