p2p云端服务配置介绍和部署说明

    云端服务由golang语言开发,天然具有跨平台和高性能特点。kkp2p云端服务有五个运行模块,分别是p2p_route、p2p_track、p2p_relay,redis, turnserver,这五个模块均支持分布式部署,即可以分别部署在多台机器上,也可以集中部署在同一台服务器上,整个云端系统可以随着业务规模的变化进行弹性的扩缩容。

     上述五个模块中,redis和turnserver是开源服务,用户可以自行到网上下载并部署。

     turnserver模块是开源服务,如果您需要以下三个功能之一,则必须部署turnserver模块,否则可以不用部署(如果仅使用tcp类型通道,且不需要ipv6穿透功能)。其开源地址为  https://github.com/coturn/coturn.git

     (1)、需要使用udp类型通道

     (2)、需要使用webrtc类型通道

     (3)、需要支持ipv6穿透,此时turnserver必须多配置监听机器的ipv6地址,该ipv6地址要加到turnserver的域名解析中。

1、p2p_route模块的配置说明和部署

1.1 模块介绍

    SDK使用域名登录,则域名对应的所有ip地址机器上,都必须部署p2p_route模块。

    p2p_route向sdk提供登录接口。p2p_route一台机器只能部署一个实例,因为p2p_route对外提供的服务端口号只能有一个,该端口号是给peer server登录以及给peer client建连使用的。peer server和peer client支持使用域名或者ip地址进行登录或者建连。当使用域名进行登录或建连时,您可以设计成一个域名对应多台机器,每台机器上部署一个p2p_route实例。kkp2p sdk内部会定时对域名进行解析出ip地址列表,会随机选择一台机器ip进行登录或者建连。

1.2 启动命令

nohup ./p2p_route -f ./p2p_route.json &

启动命令如上,开头的nohup和最后的&符号表示以后台方式运行。-f后面是配置文件名称

1.3 配置说明

[root@ecs-def8 p2p_route]# cat p2p_route.json 

{
  "public_ip" : "124.71.217.15",
  "route_wan_host": "192.168.0.44:3080",
 "jwt_secret": "D1AvCgYEXTpkyn",
  "ocm_lan_host": "192.168.0.44:32917",
  "coturn":{
       "turn_server": "your-domain:3478",
       "turn_realm": "your-domain"
  },
  "webrtc_conf":{
       "http_wan_host": "192.168.0.44:8080",
       "ssl_cert_file": "/etc/nginx/test.pem",
       "ssl_key_file": "/etc/nginx/test.key"
    },
   "redis_conf":{
        "host":"192.168.0.15",
        "port":6379,
        "password":"Le7zWQZ",
        "conn_pool_size":10,
        "use_tls":0
    }
}



配置项说明
public_ip

是对外提供的云服务器的公网ip地址,即初始化kkp2p中间件配置文件中域名所对应的ip地址或者ip地址之一,该ip地址用于peer server登录或者peer client建连使用。

如果您从云厂商购买了一台服务器,您也是通过该ip地址远程登录到您服务器上进行管理。

route_wan_host

进程运行实际绑定的ip和端口号,用于对公网提供服务,即用于对客户端peer client和peer server提供服务。


顾名思义,route_wan_host本应该是一个公网的ip地址,但是一般情况下,您从云服务商购买的服务器,机器网卡只有一个局域网ip地址,程序运行只能绑定这个地址。云服务商内部的NAT设备(路由器)将一个公网ip地址(上述的public_ip)和该局域网地址做了映射,外部访问的是public_ip,您程序实际绑定的是局域网地址。


如果您的云服务器主机的网卡本身有公网ip地址,那么这里就填写实际的公网ip地址用于程序启动绑定。linux服务器可以通过ifconfig -a命令看机器的网卡和ip地址信息。


您的云服务器必须开放该端口的tcp访问权限。

jwt_secret内部使用的加密密钥,所有的p2p_route模块必须相同
turn_server

该配置项是开源服务turnserver的部署机器对应的访问域名以及对应udp端口号。

如果需要使用webrtc功能或者ipv6功能,则必须配置;否则可不配置

turn_realm

该配置项一般配置为开源服务turnserver的域名

如果需要使用webrtc功能或者ipv6功能,则必须配置;否则可不配置

http_wan_host

如果需要支持webrtc通信,则必须配置该配置项。该配置项向浏览器前端提供http/https接口服务,不需要webrtc功能可以填空

云服务器必须开通该端口外网访问权限

ssl_cert_file

数字证书文件。如果配置该选项,则向往提供https协议;如果为空则向外提供http协议。为了数据安全,建议配置。不需要webrtc功能可以填空

ssl_key_file

数字证书对应的私钥文件。不需要webrtc功能可以填空

redis_conf该配置段是redis服务的登录ip,端口号,登录密码,以及是否使用数字证书登录。redis是开源服务,用户可以自行部署,可以部署单台也可以部署集群。如果部署集群,登录ip选择集群中的任一ip地址即可,不同模块尽量选择集群中不同ip,以实现负载均衡。

2、p2p_track模块的配置说明和部署

2.1 模块介绍

    p2p_track是实际的登录模块,peer server会登录到p2p_track模块并保持和p2p_track之间的长连接,且定时和p2p_track之间发送心跳消息。peer client和peer server建连的信令协议是通过p2p_track模块进行中转的。

p2p_track同时向外提供NAT探测服务,所以需要云服务器同时放开udp和tcp端口的访问权限。

p2p_track可以部署在一台或者多台机器之上,支持动态扩缩容(增加部署实例即扩容,停止实例服务即缩容)。也支持在一台服务器之上部署多个p2p_track实例,只要这些实例的端口号配置不一样即可。

2.2 启动命令

nohup ./p2p_track -f ./p2p_track.json -l p2p_license &

启动命令如上,开头的nohup和最后的&符号表示以后台方式运行。-f选项后面是配置文件名称, -l选项后面是license文件所存放的目录;如果没有-l选项,默认是程序启动目录下的名为p2p_license的目录。

2.3 配置说明

[root@ecs-def8 p2p_track]# cat p2p_track.json 

{
    "public_ip": "124.71.217.***",
    "track_wan_host": "192.168.0.44:3380",
    "ocm_lan_host": "192.168.0.44:32918",  
    "webrtc_conf": {
        "websocket_lan_host": "192.168.0.44:8090"
     },
    "redis_conf":{
        "host":"192.168.0.15",
        "port":6379,
        "password":"Le7zWQZ",
        "conn_pool_size":10,
        "use_tls":0
    }
}


配置项说明
public_ip

和p2p_route模块的含义一样,即对外提供服务的云服务器公网ip地址

track_wan_host

即程序启动实际绑定的ip地址和端口号,用于对外的peer client和peer server提供服务。程序启动虽然绑定的是该ip地址和端口号,但对外表现的是public_ip地址。和p2p_route模块的route_wan_host类似。

您的云服务器必须同时开放该端口的tcp和udp端口访问权限。因为该端口同时向外提供tcp和udp服务。

ocm_lan_host

内部运维ip和端口号,telnet命令可以连接该地址对该模块进行运维管理。该地址必须是内网地址,且端口号访问权限不能对公网放开。

只有正式版本才支持该配置,个人版本可以配置为空

websocket_lan_host

如果需要支持webrtc通信,则必须配置该配置项。该配置项为websocket服务端地址。不需要webrtc功能可以填空。

redis_conf该配置段是redis服务的登录ip,端口号,登录密码,以及是否使用数字证书登录。redis是开源服务,用户可以自行部署,可以部署单台也可以部署集群。如果部署集群,登录ip选择集群中的任一ip地址即可,不同模块尽量选择集群中不同ip,以实现负载均衡。

2.4 license目录以及license文件

    license目录存放了所有的license文件,license文件必须由深圳库快科技有限公司提供。具体一个license文件举例如下:[root@ecs-def8 p2p_license]# cat license_id.txt 

kkuai-ipc-00001 WtXmjG

kkuai-ipc-00002 OBq26M

license-sign AUav2LFuXS5TWFwxJ3NLDL*************************


    该配置文件一共有三行。第一行和第二行是两个登录账号以及各自的密码,用于对登录的peer的签名信息进行鉴权,保障云端服务的安全性,只允许合法的账号进行登录。最后一行是深圳市库快科技有限公司的签名信息。您必须通过在深圳库快科技有限公司的官网上通过购买方式合法获取license文件,否则程序运行会出现异常。


    license文件可以按照业务的发展情况按量分多批次购买,统一放在该目录下,程序启动时候会一次性读取该目录下所有的license文件信息。


    友善提醒您,您购买的license登录账号个数只要超过您的最大同时在线设备数即可,可以在您的业务逻辑里面实现设备在线时候动态获取登录账号和密码,设备离线时候动态回收,这样可以极大节约您的购买成本。另外在很多场景,比如通过手机app观看网络摄像头,作为连接的服务端(peer server),只有网络摄像头需要购买license账号和密码进行登录;作为主动发起连接的手机app客户端(peer client),是不需要使用登录账号和密码的。

2.5 open files数限制

    一般对于linux系统,每个进程能够打开的句柄数(包括socket句柄)是有限制的,可以通过ulimit -a命令查看限制,如下图所示:


ubuntu下系统缺省值是65535,因此最多只支持65535个设备同时在线,建议将该值改为655350,即单机支持65万设备同时在线。ubuntu下通过vi命令修改文件 /etc/security/limits.conf,将里面的65535改为655350,修改完毕后执行reboot命令重启生效。

经过测试,在4核(2500MHz)8G服务器(8G内存,400% cpu资源),p2p track至少支持25W设备同时在线(实耗3.6G内存、59% cpu),因此理论上单台4核8G服务器应该可以同时支持50W设备同时在线。

3、p2p_relay模块的配置说明和部署

3.1 模块介绍

    p2p_relay是中转模块,当两个peer之间NAT穿透失败无法直接通信时候,就通过p2p_relay模块中转方式进行通信。p2p_relay模块必须部署在带宽比较充足的云服务器上,您才会获取得较好的中转性能,具体需要的中转带宽和性能您可以根据自己的业务量和业务特性进行评估。

p2p_relay可以部署在一台或者多台机器之上,支持动态扩缩容(增加部署实例即扩容,停止实例服务即缩容)。也支持在一台服务器之上部署多个p2p_relay实例,只要这些实例的端口号配置不一样即可。

3.2 启动命令

nohup ./p2p_relay -f ./p2p_relay.json -l p2p_license &

启动命令如上,开头的nohup和最后的&符号表示以后台方式运行。-f选项后面是配置文件名称, -l选项后面是license文件所存放的目录;如果没有-l选项,默认是程序启动目录下的名为p2p_license的目录。

3.3 配置说明

[root@ecs-def8 p2p_relay]# cat p2p_relay.json 


{
    "public_ip":"124.71.217.***",
    "relay_wan_host": "192.168.0.44:3280",
    "ocm_lan_host":"192.168.0.44:32919",
    "redis_conf":{
         "host":"192.168.0.15",
         "port":6379,
         "password":"Le7zWQZ",
         "conn_pool_size":10,
         "use_tls":0
    }
}
配置项说明
public_ip

和p2p_route模块的含义一样,即对外提供服务的云服务器公网ip地址

relay_wan_host

即程序启动实际绑定的ip地址和端口号,用于对外的peer client和peer server提供服务。程序启动虽然绑定的是该ip地址和端口号,但对外表现的是public_ip地址。和p2p_route模块的route_wan_host类似。

服务器必须同时开放该端口号的tcp对外访问权限。

ocm_lan_host

内部运维ip和端口号,telnet命令可以连接该地址对该模块进行运维管理。该地址必须是内网地址,且端口号访问权限不能对公网放开。

只有正式版本才支持该配置,个人版本可以配置为空

redis_conf该配置段是redis服务的登录ip,端口号,登录密码,以及是否使用数字证书登录。redis是开源服务,用户可以自行部署,可以部署单台也可以部署集群。如果部署集群,登录ip选择集群中的任一ip地址即可,不同模块尽量选择集群中不同ip,以实现负载均衡。


3.4 license目录以及license文件

和2.4章节介绍相同。


4、redis模块的配置说明和部署

4.1 模块介绍

    redis是一个开源服务,是一个内存数据库。可以单实例部署,也可以集群化部署,每一个节点还可以主备部署。用户可以根据机器性能以及实际运行承压情况,选择是否集群化部署。推荐部署redis-stack-server-7.2.0版本,这是一个免费版本。

4.2 启动命令

nohup ./redis-server ../etc/redis.conf &

到redis-server所在目录执行上述启动命令,后面直接跟一个配置文件名参数即可。

4.3 配置说明

root@test-aliyun:~/test# cat redis.conf

bind 192.168.0.15

port 6379

daemonize yes

timeout 0

requirepass Le7zWQZ

save 300 1


配置项说明
bind 

redis绑定的ip地址,必须是一个内网ip地址,不对公网提供访问

portredis的绑定的端口号,该端口号不能开通外网访问权限,仅内部模块可以访问
daemonize 是否以后台方式运行
timeout 默认情况下,timeout 的值是 0,表示不设置超时时间,连接将一直保持打开状态,除非客户端主动断开或服务器端出现问题
requirepass登录密码
save内存数据备份到磁盘时间间隔,单位为秒


5、coturn模块的配置说明和部署

5.1 模块介绍

    coturn是一个开源服务,向外提供stun/turn服务。turnserver可以进行集群化部署,通过域名进行访问。

    由于coturn是一个开源服务,因此不是库快公司的正式对外交付件,用户可以取开源代码自行编译最新版本,以及查阅资料自行进行安装。官网上免费下载个人版云端服务中提供了库快科技编译的corturn服务的各模块binary以及配置文件模板,提供用户参考。一般安装时需要先安装libssl-dev、libevent-dev和sqlite数据库。

    本文档仅用于描述corturn服务的配置参考,以及和kkp2p sdk相关的一些操作。

5.2 启动命令

nohup ./turnserver -f -r your-realm -c ../etc/turnserver.conf &

启动命令如上,开头的nohup和最后的&符号表示以后台方式运行。-c选项后面是配置文件名称;-r后面的your-realm需要替换成实际的realm配置,一般是部署turnserver服务器的访问域名

5.3 配置说明

root@test-aliyun:~/test# cat tunserver.conf

no-rfc5780

no-stun-backward-compatibility

response-origin-only-with-rfc5780

listening-port=3478

listening-ip=172.17.241.15

listening-ip=2408:xxxx:10e9:xxxx:xxxx:xxxx:xxxx:8e4c

relay-device=eth0

relay-ip=172.17.241.15

external-ip=224.75.168.66

min-port=10000

max-port=65535

verbose

fingerprint

lt-cred-mech

realm=test.com

userdb=/usr/local/var/db/turndb

配置项说明
listening-port

向外提供服务的udp端口号

云端需要开放该端口的udp访问权限

listening-ip

服务绑定的ip地址

需要注意的是,如果需要支持ipv6 p2p功能,则需要配置ipv6地址。

可以配置两个listening-ip,一个配置ipv4地址,另外一个配置ipv6地址,turnserver支持同时侦听多个ip地址

relay-device

用于中转的网卡名字

relay-ip

中转ip地址,turnserver实际绑定的ip地址

external-ip

云服务器的外网ip地址,即用户访问需要设置的ip地址

min-port用于中转的最小端口号
max-port

用于中转的最大端口号

需要注意的是,要查看机器的系统配置,确定机器端口号有效范围是多少,配置的端口号范围要在机器的有效端口号范围之内。

云服务器需要放开端口号范围的udp访问权限。

ubuntu机器可以用以下命令查看机器的端口号范围,如果该端口号范围比较小,可以进行修改。

cat /proc/sys/net/ipv4/ip_local_port_range

realm一般配置为turnserver的域名,需要将test.com替换成实际的域名
userdbturnserver建议使用SQLite本地磁盘数据库,该配置为SQLite数据库的数据文件,用于存储设备账号id以及密钥生成的key,用于鉴权操作。

5.4 账号配置操作

     为了安全起见,需要将p2p登录账号和密码配置到turnserver系统中,让turnserver可以对客户端进行鉴权操作,拒绝非法访问。

     为了方便批量导入,库快提供了一个脚本,脚本内容如下:

     root@test-aliyun:/usr/local/coturn/bin# cat batch-turn-perm.sh

#!/bin/bash
if [ $# -lt 3 ] ; then
    echo "usage: $0 your-license-file your-turn-sqlite-db your-turn-realm"
    exit 1;
fi
while read id key
do
  if [ "$id" == "license-sign" ];then
      continue
  fi
  echo ./turnadmin -a -b $2 -u $id -p $key -r $3
  ./turnadmin -a -b $2 -u $id -p $key -r $3
done < $1

脚本用法如下

./batch-turn-perm.sh your-license-file your-turn-sqlite-db your-turn-realm

第1个参数为p2p账号license文件,第2个参数为sqlite的数据文件名(见配置项说明),第三个参数为turnserver的realm配置(见配置项说明)

以下命令可以查看当前turnserver中配置了哪些账号,-b后面的参数为实际的db文件名

./turnadmin  -l  -b  /usr/local/var/db/turndb

6、端口权限总结

需要开通云主机外网的端口权限总结如下

配置项中的端口号

开通udp权限

开通tcp权限

备注
track_wan_host

必选配置,属p2p_track模块

relay_wan_host

必选配置,属p2p_relay模块

route_wan_host

必选配置,属p2p_route模块

webrtc_conf:

http_wan_host

可选配置,属p2p_route模块

如果需要支持webrtc功能则必选配置

机器所有端口号范围

可选配置,属coturn模块,

如果需要支持webrtc,或者需要支持ipv6功能,或者需要使用udp通道类型则必须配置