将 websocket (ws) 转换为安全 websocket (wss),核心在于在通信链路中加入 ssl/tls 加密层。
通常有两种实现方案:
- 反向代理方案(推荐):使用 nginx 或 caddy 作为边缘代理,处理 ssl 卸载。
- 应用层方案:直接在 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常见避坑指南
- 混合内容错误 (mixed content):
- 如果你的前端网页是通过
https加载的,你绝对不能在代码中使用ws://,否则浏览器会因安全策略拦截。必须使用wss://。
- 如果你的前端网页是通过
- 证书链问题:
- 使用 nginx 时,
ssl_certificate必须包含完整的证书链(包含中间证书),否则移动端或部分浏览器会报self-signed certificate错误。
- 使用 nginx 时,
- 连接超时:
- 如果是长时视频流,确保 nginx 的
proxy_read_timeout设置足够大,否则 nginx 会自动断开 60 秒后没有数据包的连接。
- 如果是长时视频流,确保 nginx 的
- 防火墙:
- 确保服务器的防火墙(
ufw或firewalld)开放了 443 端口。
- 确保服务器的防火墙(
建议:生产环境强烈推荐使用 方案一 (nginx),因为 nginx 处理高并发连接的能力远高于 node.js 或 python 自带的 http 服务,且更易于维护 ssl 证书的更新。
到此这篇关于nginx将websocket ws视频流转换为wss视频流的配置方案的文章就介绍到这了,更多相关nginx websocket ws视频流转为wss内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论