前言
查閱了不少資料,網上對janus以及coturn的配置比比皆是, 不過, 我發現了一個問題, 那就是,
janus要直接對接coturn作爲turn服務器嗎?爲什麼?
janus的demo例子[譬如:video room]能不能在手機4g網絡上面與pc端聯通,看到雙方的視頻信息, 爲什麼?
網上的資料絕大部分都沒有說明或者解決上面的問題, 導致的一個結果是, 根據網上的配置,頂多只能在本機, 或者同一個局域網裏面使用,
並沒有穿透nat的能力, 也達不到實際生產使用的起碼標準.
ps:你可以看看之前配置的草稿,裏面應該是遇到了很多人都會遇到的問題:
https://www.52play.net/blog/post?id=114
不過, 無論如何,下面給出這段時間不停試錯參考過的資料:
janus官網:
https://github.com/meetecho/janus-gateway
其他:
janus前端demo網頁部署說明:
其他:
https://blog.csdn.net/s569646547/article/details/50780682
https://blog.csdn.net/danfengw/article/details/68485223
always allocation timeout when connect to turn ( webrtc ) #397
https://blog.csdn.net/qq_29123057/article/details/91454733
https://www.cnblogs.com/mobilecard/p/6542294.html
error 437: Mismatched allocation: wrong transaction ID #267
https://github.com/coturn/coturn/issues/459
https://blog.csdn.net/m0_37263637/article/details/102496005
https://blog.csdn.net/u012231640/article/details/83618274
配置
這篇文章不會講述如何編譯janus的,因爲這部分內容也是相當有難度.假定已經對照官方文檔編譯通過了,且下面這些依賴都一一編譯安裝了:
域名配置https
具體請參考:
http://www.52play.net/blog/post?id=99
配置coturn
首先,coturn會安裝一個
/usr/local/etc/turnserver.conf.default
的配置文件,那麼就複製一份.
cp /usr/local/etc/turnserver.conf.default /usr/local/etc/turnserver.conf
然後編輯:
vim /usr/local/etc/turnserver.conf
下面是修改內容:
#LocalIP,內網ip
listening-ip=172.26.26.78
listening-port=3478
tls-listening-port=5349
#LocalIP,內網ip
relay-ip=192.168.1.100
#NetIP
## 官方配置文檔有填寫例子,例如:external-ip=60.70.80.91/172.17.19.101
external-ip=服務器公開ip[publicIP]/內網IP
#relay-threads=50 註釋掉,
### 啓用長時間驗證機制.
lt-cred-mech
cert=/etc/ssl/cert/domain/cert.pem
pkey=/etc/ssl/cert/domain/privkey.pem
#配置一個用戶名密碼
user=user:password123
min-port=3480
max-port=3500
#--ps:下面有一個cli-password如果不設置什麼的話會報cli-password錯誤無法啓動之類的問題,那麼就用默認的密碼了.
cli-password=qwerty
#所用的域名
realm=domain.com
開放端口:
在阿里雲上面開放相關端口,對了, 如果啓用了防火牆firewall,那麼也要設置開放端口:
firewall-cmd --add-port=3478/tcp --permanent
firewall-cmd --add-port=3478/udp --permanent
firewall-cmd --add-port=5349/tcp --permanent
firewall-cmd --add-port=5349/udp --permanent
firewall-cmd --add-port=3480-3530/udp --permanent
firewall-cmd --reload
添加啓動以及關閉turnserver的腳本:
start.sh
#!/bin/sh
touch log.log
nohup /usr/local/bin/turnserver -c /etc/turnserver.conf >> log.log 2>&1 &
echo "如果沒有錯誤,那就是成功啓動了";
ps -ef|grep /usr/local/bin/turnserver
#tail -f log.log
stop.sh
#!/bin/sh
ps -ef|grep /usr/local/bin/turnserver |grep -v grep|awk '{printf $2}'|xargs kill -9
ps -ef|grep /usr/local/bin/turnserver
DATE=`date +%Y-%m-%d-%H-%M` #獲取當前系統時間
mkdir logs
mv log.log logs/${DATE}_log.log
文件夾結構:
如果要查看日誌,可以在當前文件夾下面執行:
tail -f log.log
配置janus
編輯配置文件:
vim /opt/janus/etc/janus/janus.jcfg
找到certificates配置項,在裏面打開以下內容的配置,並設置。
certificates:
cert_pem = "/etc/ssl/cert/domain/cert.pem"
cert_key = "/etc/ssl/cert/domain/key.pem"
nat配置說明:
stun服務器配置:
stun_server = "stun.domain.net"
stun_port = 3478
nice_debug = false
###要配置nat_1_1_mapping,且爲當前服務器的公共ip地址.
nat_1_1_mapping = "publicIP"
有很多參考資料有配置nat下面的turn_server,例如:
nat:
turn_server = "domain.com"
turn_port = 3478
turn_type = "udp"
turn_user = "user"
turn_pwd = "passwd123"
ice_enforce_list = "eth0"
不過我告訴你,不要亂設置了
原作者在issue裏面有說明的:
這段話的意思是:
只有在janus服務器在內網裏面沒有公共ip[即外面沒辦法直接訪問到的情況下]才需要設置turn server進行nat打洞,
這種情況下, turn server必須要配置在一臺有獨立ip的外網服務器上面,不能跟janus放在一起[turn server都沒辦法直接訪問到,怎麼打洞了..]
,如果janus可以直接訪問的話,就不需要配置在janus.jcfg上面配置turn server了---janus不需要turn server給自己轉發數據的...
所以, 在擁有獨立ip的主機上面部署janus就不要在janus.jcfg上面配置turn server節點了.設置了的話註釋掉然後重啓janus服務.
再打開janus.transport.http.jcfg進行配置。
vim /opt/janus/etc/janus/janus.transport.http.jcfg
分別找到general、admin、certificates三項的配置處,修改以下配置(沒有提到的不用動)。
general:
https = true
admin:
admin_https = true
certificates:
cert_pem = "/etc/ssl/cert/domain/cert.pem"
cert_key = "/etc/ssl/cert/domain/key.pem"
再打開janus.transport.websockets.jcfg進行配置。
vim /opt/janus/etc/janus/janus.transport.websockets.jcfg
分別找到general、admin、certificates三項的配置處,修改以下配置(沒有提到的不用動)。
general:
wss = true
admin:
admin_wss = true
certificates:
cert_pem = "/etc/ssl/cert/domain/cert.pem"
cert_key = "/etc/ssl/cert/domain/key.pem"
開放端口:
##ps:在spi plugin的配置文件裏面,rtp 傳輸數據時候需要用到20000-40000[默認]這個區間的端口, 需要在阿里雲以及防火牆上面都放開.
firewall-cmd --add-port=20000-40000/udp --permanent
firewall-cmd --reload
啓動以及關停腳本:
下面給出腳本方便啓動服務以及關停服務:
start.sh
#!/bin/sh
touch log.log
nohup /opt/janus/bin/janus -C /opt/janus/etc/janus/janus.jcfg -d 5 -6 >> log.log 2>&1 &
echo "如果沒有錯誤,那就是成功啓動了";
ps -ef|grep /opt/janus/bin/janus
#tail -f log.log
stop.sh
#!/bin/sh
ps -ef|grep /opt/janus/bin/janus |grep -v grep|awk '{printf $2}'|xargs kill -9
ps -ef|grep /opt/janus/bin/janus
DATE=`date +%Y-%m-%d-%H-%M` #獲取當前系統時間
mkdir logs
mv log.log logs/${DATE}_log.log
補充:
sip plugin默認配置rtp rtcp傳輸端口:
nginx配置
janus原本有 https://xxx:8089/janus之類的接口的,但是假定你已經用了https證書,那麼要訪問端口就顯得很不方便了,
這一部分就來解決部署janus的前端網站[demo頁面]的問題.
你可以直接官網的說明的:
還有, 官網的demo例子沒有額外配置ice server---沒有配置turn server的, 所以我們也需要在官網demo例子的js腳本里面修改以下內容:
iceServers:[xxxxxx] 就是我們等下需要配置的內容
ps:
先說明一下, 在不同網絡,譬如,手機4g網絡以及pc網站要互通,訪問video room測試頁面要能夠看到雙方的視頻就必須要指定iceServers, 這也是絕大部分文章沒有提及的點:
應該是很多人都沒有部署到實際生產環境的打算.
nginx.conf的配置:
charset utf-8;
###1/注意要將root改成已經修改的頁面存放目錄
set $meet_res_path /home/hansonBoy/meet_webstatic/;
root $meet_res_path;
index index.php index.html index.htm;
access_log /var/log/nginx/access.log main;
###2/要注意特別映射janus.js因爲這個與下面的/janus前面部分是一致的,如果不特別指出來nginx直接轉發到8088去了.
location /janus.js {
alias $meet_res_path/janus.js;
}
###3/將janus轉發到8088中.
location /janus {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8088/janus;
}
修改janus的demo頁面
第一步, 將官方的demo程序下載下來----因爲接下來我們需要改訪問8089的前端邏輯啦,如下圖所示:
ps:注意,官方demo用前端框架以及組件都是引用自cdn的--但我嫌cdn有時候很慢而且不知道什麼時候會掛,所以cdn的東西也下載到本地了,前面幾個文件夾就是裝的這些,但是一般情況沒必要這樣做的, 麻煩得很.
下面修改8089邏輯:
搜索關鍵字可以得到:
官方demo中有這麼多地方都要修改,
統一修改爲:
第二,添加iceServer,
查找替換:
server: server,
替換爲:
server: server,iceServers: [{urls: "turn:domain.com.cn:3478改成你自己的域名或ip", username: "user改成你自己的賬號", credential: "123456改成你自己的密碼"}],
第三上傳到nginx指定的目錄,比如,我在nginx指定代理的目錄爲:
/home/hansonBoy/meet_webstatic/
然後訪問查看結果吧.
訪問效果
電腦端:
手機端[移動4g網絡,沒有連接wifi]