6.5 KiB
6.5 KiB
WebRTC 生产环境问题解决方案
问题描述
在 npm run build 打包后,视频通话功能报错:
【CallService】_handleError, errorCode: 60006
errorMessage: 当前环境不支持 WebRTC
isMediaDevicesSupported: false
开发环境(npm run dev)正常,生产环境不正常。
问题原因
WebRTC 的 getUserMedia API 有安全限制:
- HTTPS 要求:生产环境必须使用 HTTPS 协议
- localhost 例外:只有
localhost和127.0.0.1可以在 HTTP 下使用 - 权限问题:浏览器需要用户授权访问摄像头和麦克风
开发环境通常使用 localhost,所以正常。但生产环境如果使用 HTTP 协议的 IP 地址或域名,就会被浏览器阻止。
解决方案
方案1:使用 HTTPS(推荐)
1.1 申请 SSL 证书
免费证书:
- Let's Encrypt(推荐)
- 阿里云免费证书
- 腾讯云免费证书
申请步骤(以 Let's Encrypt 为例):
# 安装 certbot
sudo apt-get update
sudo apt-get install certbot
# 申请证书
sudo certbot certonly --standalone -d your-domain.com
1.2 配置 Nginx HTTPS
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# SSL 配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /admin/ {
alias /path/to/admin/dist/;
try_files $uri $uri/ /admin/index.html;
}
location /adminapi/ {
proxy_pass http://127.0.0.1:8000;
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;
}
}
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}
1.3 更新前端配置
确保 API 请求也使用 HTTPS:
// admin/src/utils/request/index.ts
const baseURL = import.meta.env.VITE_APP_BASE_URL || 'https://your-domain.com'
方案2:开发环境使用 HTTPS
如果需要在开发环境测试 HTTPS:
2.1 生成自签名证书
# 进入 admin 目录
cd admin
# 创建证书目录
mkdir -p .cert
# 生成自签名证书
openssl req -x509 -newkey rsa:4096 -keyout .cert/key.pem -out .cert/cert.pem -days 365 -nodes
2.2 修改 vite.config.ts
import * as fs from 'node:fs'
export default defineConfig({
server: {
host: '0.0.0.0',
https: {
key: fs.readFileSync('.cert/key.pem'),
cert: fs.readFileSync('.cert/cert.pem')
},
hmr: true,
open: true
},
// ... 其他配置
})
方案3:使用 localhost 访问
如果只是测试,可以通过 localhost 访问:
- 在服务器上运行:
npm run preview - 使用 SSH 隧道转发:
ssh -L 4173:localhost:4173 user@your-server
- 本地浏览器访问:
http://localhost:4173/admin/
方案4:修改 hosts(临时方案)
将服务器 IP 映射到 localhost:
# Windows: C:\Windows\System32\drivers\etc\hosts
# Linux/Mac: /etc/hosts
127.0.0.1 your-domain.local
然后通过 http://your-domain.local 访问。
检测 WebRTC 支持
在线检测
访问腾讯云提供的检测页面: https://web.sdk.qcloud.com/trtc/webrtc/demo/detect/index.html
代码检测
在视频通话组件中添加检测:
// admin/src/components/video-call/index.vue
const checkWebRTCSupport = () => {
const checks = {
isHttps: window.location.protocol === 'https:' || window.location.hostname === 'localhost',
hasGetUserMedia: !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia),
hasRTCPeerConnection: !!window.RTCPeerConnection
}
console.log('WebRTC Support:', checks)
if (!checks.isHttps) {
feedback.msgError('视频通话需要 HTTPS 环境,请使用 HTTPS 访问')
return false
}
if (!checks.hasGetUserMedia) {
feedback.msgError('浏览器不支持访问摄像头和麦克风')
return false
}
return true
}
const open = async (info: CallInfo) => {
// 先检查支持情况
if (!checkWebRTCSupport()) {
return
}
// ... 其他代码
}
浏览器权限设置
Chrome
- 点击地址栏左侧的锁图标
- 选择"网站设置"
- 允许"摄像头"和"麦克风"权限
Firefox
- 点击地址栏左侧的锁图标
- 点击"连接安全"
- 点击"更多信息"
- 选择"权限"标签
- 允许"使用摄像头"和"使用麦克风"
常见问题
Q1: 为什么开发环境正常,生产环境不行?
A: 开发环境使用 localhost,浏览器允许 HTTP 下使用 WebRTC。生产环境使用 IP 或域名,必须使用 HTTPS。
Q2: 使用了 HTTPS 还是不行?
A: 检查:
- 证书是否有效(浏览器地址栏有绿色锁图标)
- 是否有混合内容(HTTPS 页面加载 HTTP 资源)
- 浏览器是否授权了摄像头和麦克风权限
Q3: 如何在内网测试?
A:
- 使用自签名证书(需要浏览器信任)
- 使用 SSH 隧道转发到 localhost
- 修改 hosts 文件
Q4: 移动端如何测试?
A:
- 必须使用 HTTPS
- 确保移动设备信任证书
- 在移动浏览器中授权摄像头和麦克风
推荐配置
生产环境
协议: HTTPS
域名: your-domain.com
证书: Let's Encrypt 或商业证书
Web服务器: Nginx with SSL
测试环境
协议: HTTPS (自签名证书)
域名: test.your-domain.com
或使用: localhost + SSH隧道
验证步骤
-
检查协议:确保使用 HTTPS
console.log(window.location.protocol) // 应该是 "https:" -
检查 API 支持:
console.log('getUserMedia:', !!navigator.mediaDevices?.getUserMedia) console.log('RTCPeerConnection:', !!window.RTCPeerConnection) -
测试权限:
navigator.mediaDevices.getUserMedia({ video: true, audio: true }) .then(() => console.log('权限已授予')) .catch(err => console.error('权限被拒绝:', err))
总结
最佳解决方案:为生产环境配置 HTTPS
- 申请 SSL 证书(Let's Encrypt 免费)
- 配置 Nginx HTTPS
- 更新前端 API 地址为 HTTPS
- 测试视频通话功能
这样可以确保在任何环境下都能正常使用 WebRTC 功能。