在CentOS 7上部署FreeSWITCH的过程

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、声音文件
           

                make cd-sounds-install

                make cd-moh-install


四、运行前配置
    1、加载mod_av和mod_rtmp模块
 如果需要程序运行时自动加载模块,需要修改程序的配置文件,位置在/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml文件

      大约104行 <load module="mod_av"/> ,把注释去掉,让它生效。将会自动加载mod_av模块。
      大约49行  <load module="mod_rtmp"/> ,把注释去掉,让它生效。将会自动加载mod_rtmp模块。

      说明:
           mod_av模块提供转码功能。使用h264和vp8的客户端之间可以进行视频通讯
   mod_rtmp模块实现了rtmp协议。可以让运行在Flash Player中的swf程序和FreeSWITCH通讯。间接让IE实现了实时通讯。

    2、更改FreeSWITCH默认登录密码

修改/usr/local/freeswitch/conf/vars.xml,大约15行
           <X-PRE-PROCESS cmd="set" data="default_password=1234"/>
修改为
           <X-PRE-PROCESS cmd="set" data="default_password=2345"/>     

        说明:
    使用FreeSWITCH的默认密码1234登录,会有10秒的延时。把默认密码改为2345。
   
    3、增加H264编码支持

修改/usr/local/freeswitch/conf/vars.xml,大约258和259行,检查global_codec_prefs和outbound_codec_prefs中是否有H264。如下两行:
    <X-PRE-PROCESS cmd="set" data="global_codec_prefs=OPUS,G722,PCMU,PCMA,H264,VP8"/>
    <X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=OPUS,G722,PCMU,PCMA,H264,VP8"/>

说明:
     FreeSWITCH的默认只支持VP8编码,如果要使用H264编码,需要增加H264。

    4、修改WSS端口

       修改/usr/local/freeswitch/conf/sip_profiles/internal.xml,大约313行:
             <param name="wss-binding" value=":7443"/>
  修改为
     <param name="wss-binding" value=":8443"/>

       说明:
   WSS端口是WebSocket的安全连接端口。默认是7443,因为会和IM服务的端口冲突,所以修改为8443。


     5、ESL配置
修改/usr/local/freeswitch/conf/autoload_configs/event_socket.conf.xml,

    检查 <param name="listen-ip" value="::"/> 这样中的value是不是等于"::",如不是需要修改;

    <!--<param name="apply-inbound-acl" value="loopback.auto"/>-->
    修改为
    <param name="apply-inbound-acl" value="lan"/>


说明:
    使用ESL库,默认只能连接本机安装的FreeSWITCH。如果要连接局域网内其它主机上的FreeSWITCH,则需要做如上修改。
            ESL使外部程序可以通过发送命令来控制FreeSWITCH。


      6、为FreeSWITCH增加30000到39999共10000个号码
第一步

     修改/usr/local/freeswitch/conf/dialplan/default.xml,大约265行,找到name为Local_Extension的extension,
     <extension name="Local_Extension">,修改如下行的expression属性

<condition field="destination_number" expression="^(10[01][0-9])$"> 
修改为:
<condition field="destination_number" expression="^(3\d{4}|10[01][0-9])$">  


说明:
也就是为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 name="cdquality_stereo_conferences">。

    在这个extension下边增加一个新的extension。如下:
<extension name="my_cdquality_stereo_conferences">
  <condition field="destination_number" expression="^(2\d{4})$">
<action application="answer"/>
<action application="send_display" data="FreeSWITCH Conference|$1"/>
<action application="set" data="conference_member_flags=join-vid-floor"/>
<action application="conference" data="$1@video-mcu-stereo"/>                       // 注意,@之前只有$1
  </condition>
</extension>

说明:
            @之前只有$1,是为了把会议名简化成会议后,这样ESL的命令中就可以直接使用会议号,来识别或者控制会议。 

     8、为rtmp客户端增加路由

  修改/usr/local/freeswitch/conf/dialplan/default.xml,大约265行,找到name为Local_Extension的extension,
  然后在它的前边新建一个extension。强调一下,必须是前边。

<extension name="rtmp_extension">
  <condition field="destination_number" expression"^(3\d{4}|10[01][0-9])$" />
     <condition field="${rtmp_contact(default/${destination_number}@$${domain})}" expression="^rtmp">
<action application="set" data="call_timeout=10"/>
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="continue_on_fail=true"/>
<action application="bridge" data="${rtmp_contact(default/${destination_number}@$${domain})}"/>
     </condition>
</extension>

        说明:
    因为来自与rtmp客户端的联系人是单独管理的,所以需要单独设置路由。
    只有设置了这个路由,其它客户端才能呼叫rtmp的客户端。

     9、修改视频会议分辨率

修改/usr/local/freeswitch/conf/autoload_configs/conference.conf.xml,大约257行

     <param name="video-canvas-size" value="1920x1080"/>
  修改为
     <param name="video-canvas-size" value="1280x720"/>

        说明:
    这么改主要是考虑主机的负荷。


五、启动脚本
    为了让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
   <profile name="video-mcu-stereo">部分,最后添加两行
      <param name="auto-record" value="/usr/share/nginx/html/${conference_uuid}_${conference_name}.mp4"/>
      <param name="min-required-recording-participants" value="1"/>

七、安装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,如下:
  
      <param name="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 {
        }
    }

猜你喜欢

转载自blog.csdn.net/tanningzhong/article/details/79884700
今日推荐