CentOS 7提供了FreeSWITCH的安装包(编译自1.6.15版本的源码),可以通过yum命令直接下载、安装。
我们为什么没有直接使用这个安装包,而是选择直接从源码编译FreeSWITCH,是因为这个安装包存在如下问题:
1)缺少libav库。实现转码的模块mod_av依赖该库;
2)缺少mod_rtmp模块。该模块支持基于Flash的终端。
3)1.6.15版本的源码,通过rtmp拨打电话时,会导致程序崩溃。
我们目前使用的FreeSWITCH源码版本是1.6.10。
FreeSWITCH官方推荐的CentOS版本,要求至少是CentOS7.0。CentOS7的安装本文不讲解,请查阅其它资料自行安装。
以下的过程假定CentOS已经安装(最小化安装)
一、编译环境和FreeSWITCH依赖库
1、让网卡自动启用
CentOS 7安装后,有时候网卡并未自动启用,需要修改配置文件,让网卡跟随系统自动启用。
1)进入目录/etc/sysconfig/network-scripts/
2) 修改ifcfg-enxxxxxxxx 文件 (即你的网卡标识命名的配置文件)
3) 将ONBOOT=no改成yes
4) 保存后重启即可
2、会用到的工具软件
1)ifconfig工具
ifconfig常用来查询IP地址等信息,CentOS7最小化安装时没有安装这个工具。
安装命令:yum install net-tools.x86_64
说明:
也可以使用ip addr命令查看IP地址
2)patch工具
libav库编译之前需要打一个补丁文件。patch的安装命令是:
yum install patch
3)rzsz工具
该工具用于配合xshell上传文件到CentOS系统中,安装命令是:
yum install lrzsz
说明:
XShell连上CentOS后,直接把文件拖到XShell窗口,就可以上传文件到CentOS系统中。
3、FreeSWITCH官方环境和依赖库
依次执行如下两条命令,安装编译环境和依赖库:
yum install -y http://files.freeswitch.org/freeswitch-release-1-6.noarch.rpm epel-release
yum install -y git gcc-c++ wget alsa-lib-devel autoconf automake bison broadvoice-devel bzip2 curl-devel db-devel e2fsprogs-devel flite-devel g722_1-devel gdbm-devel gnutls-devel ilbc2-devel ldns-devel libcodec2-devel libcurl-devel libedit-devel libidn-devel libjpeg-devel libmemcached-devel libogg-devel libsilk-devel libsndfile-devel libtheora-devel libtool libvorbis-devel libxml2-devel lua-devel lzo-devel mongo-c-driver-devel ncurses-devel net-snmp-devel openssl-devel opus-devel pcre-devel perl perl-ExtUtils-Embed pkgconfig portaudio-devel postgresql-devel python26-devel python-devel soundtouch-devel speex-devel sqlite-devel unbound-devel unixODBC-devel libuuid-devel which yasm zlib-devel
4、关闭防火墙
CentOS7的防火墙会阻止客户端连接FreeSWITCH,需要关闭它。CentOS 7.0默认使用的是firewalld防火墙。
停止firewalld :systemctl stop firewalld.service
禁止firewall开机启动 :systemctl disable firewalld.service
说明:
可以使用systemctl status firewalld.service命令检查firewalld是否已经启动。
sudo useradd freeswitch
sudo groupadd freeswitch
查看SELinux状态:
1、/usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态
SELinux status: enabled
2、getenforce ##也可以用这个命令检查
关闭SELinux:
1、临时关闭(不用重启机器):
setenforce 0 ##设置SELinux 成为permissive模式
##setenforce 1 设置SELinux 成为enforcing模式
2、修改配置文件需要重启机器:
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
重启机器即可
5、指定动态链接库的搜索目录
在/etc/ld.so.conf.d目录下建立一个文件,文件名随便取,例如:locallib.conf,
然后在locallib.conf输入一行:/usr/local/lib。
说明:
编译x264和libav时,它们的库默认会安装到/usr/local/lib中。CentOS 64位版链接动态库时默认不会搜索这个目录。
为了让程序链接时可以找到这些库,需要把 /usr/local/lib 加到动态库的搜索列表中
安装动态库后,可以执行ldconfig刷新。也可以直接重启电脑,让系统自动刷新。
二、其它依赖库
FreeSWITCH默认只支持VP8视频编码,为了支持使用H264编码的终端,需要使用libav进行转码。libav库依赖x264库做H264的编码。所以,
需要先编译x264库,然后编译libav库。
1、x264
1)获取源码
下载:git clone git://git.videolan.org/x264.git
2)编译、安装
tar -xvf x264-20170217.tar.gz
cd x264
./configure --enable-static --enable-pic
make
make install
cp /usr/local/lib/pkgconfig/x264.pc /usr/lib64/pkgconfig/ // 用来让libav编译时,可以找到x264的库
ldconfig // 执行刷新,以让程序运行时可以找到x264的库。本例因为使用了静态库,应该不需要这步
说明:
x264提供H264的编码。libav库依赖它。
2、librtmp
make
make install
cp /usr/local/lib/pkgconfig/librtmp.pc /usr/lib64/pkgconfig/ // 用来让libav编译时,可以找到x264的库
ldconfig // 执行刷新,以让程序运行时可以找到x264的库。本例因为使用了静态库,应该不需要这步
说明:
librtmp提供rtmp的解包。libav库依赖它。
3、编译libav
1)获取源码
下载:git clone https://freeswitch.org/stash/scm/sd/libav.git
2)编译、安装
tar -xvf libav-20170217.tar.gz
cd libav
patch -p1 < 0001-Fix-linking-errors-when-VC1-parser-is-enabled-and-VC.patch // 打补丁,FreeSWITCH对libav做了修改
./configure --enable-pic --enable-shared --enable-libx264 --enable-gpl --extra-libs="-ldl"
make
make install
./configure --enable-pic --enable-shared --enable-libx264 --enable-librtmp --enable-gpl --extra-libs="-ldl"
cp /usr/local/lib/pkgconfig/libavcodec.pc /usr/lib64/pkgconfig/
cp /usr/local/lib/pkgconfig/libavdevice.pc /usr/lib64/pkgconfig/
cp /usr/local/lib/pkgconfig/libavfilter.pc /usr/lib64/pkgconfig/
cp /usr/local/lib/pkgconfig/libavformat.pc /usr/lib64/pkgconfig/
cp /usr/local/lib/pkgconfig/libavresample.pc /usr/lib64/pkgconfig/
cp /usr/local/lib/pkgconfig/libavutil.pc /usr/lib64/pkgconfig/
cp /usr/local/lib/pkgconfig/libswscale.pc /usr/lib64/pkgconfig/
ldconfig
说明:
libav是一个编解码库,FreeSWITCH的转码模块mod_av依赖它实现。
三、编译FreeSWITCH
1、下载
git clone -b v1.6 https://freeswitch.org/stash/scm/fs/freeswitch.git freeswitch
2、配置
cd freeswitch-1.6.10
./configure --enable-core-pgsql-support
3、mod_av和mod_rtmp模块
修改源码目录下的modules.conf文件。
编译mod_av模块, 把第2行#applications/mod_av前的#去掉
编译mod_rtmp模块,把第92行#endpoints/mod_rtmp前的#去掉
说明:
FreeSWITCH的很多功能模块会编译为动态库,在程序启动时根据配置文件加载。我们需要的转码和rtmp模块默认不被编译。
在编译之前,需要
4、编译、安装
make
make install
5、声音文件
四、运行前配置
1、加载mod_av和mod_rtmp模块
如果需要程序运行时自动加载模块,需要修改程序的配置文件,位置在/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml文件
大约104行 ,把注释去掉,让它生效。将会自动加载mod_av模块。
大约49行 ,把注释去掉,让它生效。将会自动加载mod_rtmp模块。
说明:
mod_av模块提供转码功能。使用h264和vp8的客户端之间可以进行视频通讯
mod_rtmp模块实现了rtmp协议。可以让运行在Flash Player中的swf程序和FreeSWITCH通讯。间接让IE实现了实时通讯。
2、更改FreeSWITCH默认登录密码
修改/usr/local/freeswitch/conf/vars.xml,大约15行
修改为
说明:
使用FreeSWITCH的默认密码1234登录,会有10秒的延时。把默认密码改为2345。
3、增加H264编码支持
修改/usr/local/freeswitch/conf/vars.xml,大约258和259行,检查global_codec_prefs和outbound_codec_prefs中是否有H264。如下两行:
说明:
FreeSWITCH的默认只支持VP8编码,如果要使用H264编码,需要增加H264。
4、修改WSS端口
修改/usr/local/freeswitch/conf/sip_profiles/internal.xml,大约313行:
修改为
说明:
WSS端口是WebSocket的安全连接端口。默认是7443,因为会和IM服务的端口冲突,所以修改为8443。
5、ESL配置
修改/usr/local/freeswitch/conf/autoload_configs/event_socket.conf.xml,
检查 这样中的value是不是等于"::",如不是需要修改;
修改为
说明:
使用ESL库,默认只能连接本机安装的FreeSWITCH。如果要连接局域网内其它主机上的FreeSWITCH,则需要做如上修改。
ESL使外部程序可以通过发送命令来控制FreeSWITCH。
6、为FreeSWITCH增加30000到39999共10000个号码
第一步
修改/usr/local/freeswitch/conf/dialplan/default.xml,大约265行,找到name为Local_Extension的extension,
,修改如下行的expression属性
修改为:
说明:
也就是为expression中的正则表达式,增加一个条件,与原来的条件做或运算,这样新号码段和旧号码段都可以使用。
新增加部分为:3\d{4}| (注意最后的 | )
这样修改后,只是说明可以路由30000到39999的号码了,还需为这些号码增加号码文件。
第二步
复制1000.xml为30000.xml
将30000.xml中所有的1000改为30000
因为这种文件太多,可以使用一个小工具(FS_PhoneCode.exe)来生成需要的号码文件。
生成后,复制这些文件到目录conf/directory/default
7、为FreeSWITCH增加20000到29999共10000个会议号
修改/usr/local/freeswitch/conf/dialplan/default.xml,找到name为 cdquality_stereo_conferences 的extension。
它的首行为:。
在这个extension下边增加一个新的extension。如下:
// 注意,@之前只有$1
说明:
@之前只有$1,是为了把会议名简化成会议后,这样ESL的命令中就可以直接使用会议号,来识别或者控制会议。
8、为rtmp客户端增加路由
修改/usr/local/freeswitch/conf/dialplan/default.xml,大约265行,找到name为Local_Extension的extension,
然后在它的前边新建一个extension。强调一下,必须是前边。
说明:
因为来自与rtmp客户端的联系人是单独管理的,所以需要单独设置路由。
只有设置了这个路由,其它客户端才能呼叫rtmp的客户端。
9、修改视频会议分辨率
修改/usr/local/freeswitch/conf/autoload_configs/conference.conf.xml,大约257行
修改为
说明:
这么改主要是考虑主机的负荷。
五、启动脚本
为了让FreeSWITCH在主机启动时可以自动运行,需要创建自启动脚本。
1、freeswitch.service文件
在目录/usr/lib/systemd/system下创建文件freeswitch.service,内容如下:
[Unit]
Description=FreeSWITCH
After=syslog.target network.target
After=postgresql.service postgresql-9.3.service postgresql-9.4.service mysqld.service httpd.service
[Service]
User=root
EnvironmentFile=-/etc/sysconfig/freeswitc
WorkingDirectory=/usr/local/freeswitch
ExecStart=/usr/local/freeswitch/bin/freeswitch -nc -nf $FREESWITCH_PARAMS
ExecReload=/usr/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
2、freeswitch文件
在目录/etc/sysconfig下创建文件freeswitch,内容如下:
FREESWITCH_PARAMS=""
3、修改文件夹属性
cd /usr/local/
chown -R root:root freeswitch
chmod -R g+w freeswitch
4、启动
systemctl enable freeswitch.service
systemctl start freeswitch.service
六、录制会议
修改文件/usr/local/freeswitch/conf/autoload_configs/conference.conf.xml
部分,最后添加两行
七、安装nginx
客户端播放已录制的会议视频,需要借助nginx来实现,安装nginx命令如下:
yum install nginx
启动nginx命令如下:
systemctl enable nginx.service
systemctl start nginx.service
八、数字证书
为了支持在浏览器中使用WebRTC,需要安全的连接。这样需要为FreeSWITCH制作、安装证书。证书的制作需要借助一个FreeSWITCH
提供的工具,下载地址:wget http://files.freeswitch.org/downloads/ssl.ca-0.1.tar.gz
1、制作根证书
tar zxfv ssl.ca-0.1.tar.gz
cd ssl.ca-0.1/
perl -i -pe 's/md5/sha256/g' *.sh
perl -i -pe 's/1024/4096/g' *.sh
./new-root-ca.sh
2、制作服务器证书
根证书制作完成后,就可以使用这个工具来制作服务器证书,并用这个根证书给服务器证书做签名了。
以制作self.bkw.org的证书为例。
1)生成证书
./new-server-cert.sh self.bkw.org
根据提示输入,其中只有Common Name这一项是必须的,其它的可以随便填。
2)签名
./sign-server-cert.sh self.bkw.org
完成后,会生成三个文件,其中只有self.bkw.org.crt和self.bkw.org.key是有用的。
3)生成pem文件
FreeSWITCH需要pem格式的证书,所以需要进行格式转换
cat self.bkw.org.crt self.bkw.org.key > ./wss.pem
cat self.bkw.org.crt self.bkw.org.key > ./agent.pem
cat ca.crt > ./cafile.pem
九、为FreeSWITCH安装证书
把wss.pem、agent.pem、cafile.pem三个文件复制到文件夹:/usr/local/freeswitch/certs
修改配置文件 /usr/local/freeswitch/conf/sip_profiles/internal.xml,把tls-cert-dir的value设置为/usr/local/freeswitch/certs,如下:
十、为nginx安装证书
nginx启用https,也需要安装证书。因为nginx和FreeSWITCH在同一台主机,所以可以使用FreeSWITCH的证书。
修改nginx的配置文件/etc/nginx/nginx.conf,找到如下部分,取消前边的#,以让配置生效。其中ssl_certificate和ssl_certificate_key需要指向
FreeSWITCH的数字证书。
# Settings for a TLS enabled server.
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name _;
root /usr/share/nginx/html;
ssl_certificate "/usr/local/freeswitch/certs/wss.pem";
ssl_certificate_key "/usr/local/freeswitch/certs/wss.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}