现代H5浏览器产业链越来越丰富,http+websocket+webrtc+sip组合已经是一种非常成熟的web原生音视频通讯解决方案
FreeSWITCH是一个开源的电话软交换平台,早在SIP年代就非常有名,自从支持WebSocket传输sip信令后与Web结合玩法多了许多
WebRTC提供了音视频通讯的核心技术,包括音视频的采集、编解码、网络传输、显示等功能,并且还支持跨平台,但就是没有信令协议部分
Chrome、Firefox等浏览器为了从保护用户隐私绝对安全角度考虑,纷纷提高了Web原生应用访问摄像头、麦克风的门槛:如不是用https、wss安全协议则会有各种警告及确认甚至直接拒绝
WS、WSS其实就是HTTP、HTTPS的WebSocket协议名称,其使用方式及默认端口都完全一致
综上所述,如果都用同一个域名地址承载web sip相关服务方便用户使用,就需要在nginx上做一些优雅的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; listen 443 ssl; root /var/www/sip; proxy_read_timeout 3600; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; location / { if ($scheme = 'http') { set $ws_port 5066; } if ($scheme = 'https') { set $ws_port 7443; } if ($http_upgrade = 'websocket') { proxy_pass $scheme://$server_addr:$ws_port; } } } |
其对应freeswitch相关端口配置片断如下
1 2 3 4 5 6 7 8 9 |
<!-- Internal SIP Profile --> <X-PRE-PROCESS cmd="set" data="internal_sip_port=5060"/> <!-- RTP port range --> <param name="rtp-start-port" value="16384"/> <param name="rtp-end-port" value="32768"/> <!-- for sip over websocket support --> <param name="ws-binding" value=":5066"/> <!-- for sip over secure websocket support --> <param name="wss-binding" value=":7443"/> |
注:
sip和rtp端口不经nginx直连,但需要防火墙做相应的白名单
ws5066端口和wss7443端口间接通过nginx的http端口和https端口反向代理提供服务
nginx默认的http80端口和https443端口又用来提供webrtc前端相关资源访问