1. 环境准备与系统选择
在开始搭建FreeSWITCH之前,选择合适的操作系统环境至关重要。作为一款跨平台的通信服务器软件,FreeSWITCH在CentOS和Debian两大主流Linux发行版上都有良好的支持。我曾在生产环境中多次部署过这两个系统下的FreeSWITCH,实测下来各有优劣。
1.1 CentOS与Debian的特性对比
CentOS(特别是7.x版本)以其稳定性著称,适合需要长期运行的服务。但需要注意的是,CentOS 8已停止维护,而CentOS Stream的更新策略与传统的RHEL兼容版本有所不同。如果你选择CentOS,建议使用7.9版本,这是目前最稳定的选择。
Debian 12(Bookworm)则提供了更新的软件包和更好的硬件支持。我在最近的项目中发现,Debian 12对新型网卡和存储设备的兼容性更好,特别是在虚拟化环境中表现优异。不过Debian的默认防火墙配置与CentOS有所不同,这点需要注意。
重要提示:无论选择哪个系统,都建议使用最小化安装(Minimal Install),这样可以减少不必要的软件包和潜在的安全风险。
1.2 系统初始化配置
安装完基础系统后,有几项关键配置需要完成:
网络配置:
- CentOS 7默认使用NetworkManager,而Debian使用传统的ifupdown。如果你习惯手动配置网络,可以禁用NetworkManager:
systemctl stop NetworkManager systemctl disable NetworkManager - 静态IP配置示例(CentOS):
nmcli con mod eth0 ipv4.addresses 192.168.1.100/24 nmcli con mod eth0 ipv4.gateway 192.168.1.1 nmcli con mod eth0 ipv4.dns "8.8.8.8 8.8.4.4" nmcli con mod eth0 ipv4.method manual nmcli con up eth0
- CentOS 7默认使用NetworkManager,而Debian使用传统的ifupdown。如果你习惯手动配置网络,可以禁用NetworkManager:
软件源更新:
- CentOS 7:
yum install -y epel-release yum update -y - Debian 12:
apt update && apt upgrade -y
- CentOS 7:
基础工具安装:
# CentOS yum install -y wget curl vim git net-tools # Debian apt install -y wget curl vim git net-tools
1.3 磁盘空间管理
FreeSWITCH运行过程中会产生大量日志和录音文件,因此需要特别注意磁盘空间分配。我遇到过多次因为磁盘空间不足导致服务异常的情况。
检查磁盘使用情况:
df -h du -sh /var/*如果发现
du和df显示的空间差异很大(常见于文件被删除但进程仍占用的情况),可以尝试:lsof | grep deleted # 查看被删除但仍被占用的文件 service freeswitch restart # 重启服务释放空间
对于新安装的系统,建议为/var分区分配至少50GB空间,如果是生产环境,建议100GB以上。
2. FreeSWITCH依赖安装
FreeSWITCH作为一款功能强大的通信平台,依赖众多开源库和工具。正确的依赖安装是后续编译和运行的基础。
2.1 基础编译环境准备
首先需要安装编译工具链和开发库:
# CentOS yum groupinstall -y "Development Tools" yum install -y yum-utils rpmdevtools # Debian apt install -y build-essential devscripts2.2 音频/视频相关依赖
FreeSWITCH的核心功能依赖于这些音频/视频库:
# CentOS yum install -y libogg-devel libvorbis-devel speex-devel libcurl-devel \ libtiff-devel libjpeg-devel opus-devel libsndfile-devel # Debian apt install -y libogg-dev libvorbis-dev libspeex-dev libcurl4-openssl-dev \ libtiff5-dev libjpeg-dev libopus-dev libsndfile1-dev2.3 数据库支持
FreeSWITCH支持多种数据库后端,我推荐使用PostgreSQL:
# CentOS yum install -y postgresql-devel # Debian apt install -y libpq-dev如果确实需要使用MySQL(虽然不推荐),可以安装:
# CentOS yum install -y mysql-devel # Debian apt install -y libmysqlclient-dev2.4 其他关键依赖
这些库对FreeSWITCH的高级功能至关重要:
# CentOS yum install -y libedit-devel sqlite-devel pcre-devel ldns-devel \ libuuid-devel libsrtp-devel libks-devel # Debian apt install -y libedit-dev libsqlite3-dev libpcre3-dev libldns-dev \ uuid-dev libsrtp2-dev libks-dev经验之谈:在Debian上安装时,可能会遇到libks-dev包不可用的情况。这时可以从源代码编译安装:
git clone https://github.com/signalwire/libks cd libks cmake . make && make install
3. FreeSWITCH源码编译安装
虽然有些发行版提供了FreeSWITCH的二进制包,但从源码编译可以获得最新功能和对特定硬件的优化。
3.1 获取源代码
建议从官方Git仓库获取最新稳定版:
git clone https://github.com/signalwire/freeswitch.git cd freeswitch git checkout v1.10.7 # 使用稳定版本3.2 配置编译选项
FreeSWITCH的配置非常灵活,以下是我推荐的配置参数:
./bootstrap.sh -j ./configure \ --enable-core-pgsql-support \ --enable-zrtp \ --enable-portable-binary \ --enable-system-libyuv \ --enable-system-libvpx \ --enable-system-libswscale \ --enable-system-libavresample \ --enable-system-libavformat \ --enable-system-libavcodec \ --enable-system-libavutil参数说明:
--enable-core-pgsql-support:启用PostgreSQL核心支持--enable-zrtp:启用ZRTP加密支持--enable-portable-binary:生成可移植的二进制文件- 其他
--enable-system-*选项使用系统已安装的库而非内置版本
3.3 编译与安装
配置完成后,开始编译:
make -j$(nproc) # 使用所有CPU核心加速编译 make install make cd-sounds-install # 安装默认语音提示 make cd-moh-install # 安装默认音乐保持音编译过程可能需要30分钟到2小时不等,取决于硬件性能。我曾在一台4核8G的虚拟机上编译大约需要45分钟。
3.4 初始化数据库
FreeSWITCH需要使用数据库存储配置和CDR记录:
# 创建数据库用户和数据库 sudo -u postgres psql -c "CREATE USER freeswitch WITH PASSWORD 'yourpassword';" sudo -u postgres psql -c "CREATE DATABASE freeswitch WITH OWNER freeswitch ENCODING 'UTF8';" # 导入初始表结构 psql -U freeswitch -d freeswitch -h 127.0.0.1 -f /usr/local/freeswitch/share/freeswitch/sql/pgsql/schema.sql4. FreeSWITCH配置与优化
安装完成后,需要进行细致的配置才能发挥FreeSWITCH的全部潜力。
4.1 基础配置文件调整
主要的配置文件位于/usr/local/freeswitch/conf/目录:
vars.xml- 设置全局变量:
<X-PRE-PROCESS cmd="set" data="domain=yourdomain.com"/> <X-PRE-PROCESS cmd="set" data="external_rtp_ip=stun:stun.yourdomain.com"/> <X-PRE-PROCESS cmd="set" data="external_sip_ip=stun:stun.yourdomain.com"/>autoload_configs/modules.conf.xml- 加载模块:
<load module="mod_sofia"/> <load module="mod_loopback"/> <load module="mod_commands"/> <!-- 生产环境建议禁用不必要的模块 -->
4.2 SIP配置文件
SIP是FreeSWITCH的核心协议,配置在sofia.conf.xml:
<profile name="external"> <gateways> <gateway name="yourprovider"> <param name="username" value="yourusername"/> <param name="password" value="yourpassword"/> <param name="proxy" value="sip.yourprovider.com"/> <param name="register" value="true"/> </gateway> </gateways> </profile>4.3 拨号计划配置
拨号计划定义呼叫路由逻辑,位于dialplan/default.xml:
<extension name="Local_Extension"> <condition field="destination_number" expression="^10[01][0-9]$"> <action application="set" data="dialed_extension=$1"/> <action application="bridge" data="user/${dialed_extension}@${domain}"/> </condition> </extension>4.4 性能优化建议
根据我的经验,这些优化可以显著提升FreeSWITCH性能:
调整线程池大小:
<!-- in sofia.conf.xml --> <param name="rtp-timer-name" value="soft"/> <param name="enable-timer" value="false"/>日志级别调整:
<!-- in freeswitch.xml --> <param name="log-level" value="notice"/>内存管理:
# 增大系统文件描述符限制 echo "* soft nofile 65536" >> /etc/security/limits.conf echo "* hard nofile 65536" >> /etc/security/limits.conf
5. 系统集成与管理
FreeSWITCH安装配置完成后,还需要考虑系统集成和日常管理问题。
5.1 系统服务配置
为了让FreeSWITCH随系统启动,需要创建systemd服务文件:
cat > /etc/systemd/system/freeswitch.service << 'EOF' [Unit] Description=FreeSWITCH After=syslog.target network.target postgresql.service [Service] Type=forking PIDFile=/usr/local/freeswitch/run/freeswitch.pid ExecStart=/usr/local/freeswitch/bin/freeswitch -nc -nonat ExecStop=/usr/local/freeswitch/bin/freeswitch -stop TimeoutSec=45s Restart=always User=freeswitch Group=daemon LimitCORE=infinity LimitNOFILE=100000 LimitNPROC=60000 LimitSTACK=250000 LimitRTPRIO=infinity LimitRTTIME=infinity [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable freeswitch systemctl start freeswitch5.2 监控与维护
日志监控:
tail -f /usr/local/freeswitch/log/freeswitch.logCDR记录: 确保CDR(呼叫详细记录)配置正确:
<!-- in autoload_configs/cdr_pgsql.conf.xml --> <param name="db-info" value="host=127.0.0.1 dbname=freeswitch user=freeswitch password=yourpassword"/>定期备份:
# 备份配置 tar czvf freeswitch_conf_backup_$(date +%Y%m%d).tar.gz /usr/local/freeswitch/conf # 备份数据库 pg_dump -U freeswitch -h 127.0.0.1 freeswitch > freeswitch_db_$(date +%Y%m%d).sql
5.3 常见问题排查
端口冲突:
netstat -tulnp | grep -E '5060|5080|16384-32768'音频问题: 如果遇到音频问题,检查:
fs_cli -x "show codec"注册失败: 检查SIP注册状态:
fs_cli -x "sofia status profile external"
6. 安全加固建议
作为通信服务器,安全配置至关重要。以下是我在生产环境中总结的安全实践。
6.1 网络层安全
防火墙配置:
# CentOS firewall-cmd --permanent --add-port=5060/tcp firewall-cmd --permanent --add-port=5060/udp firewall-cmd --permanent --add-port=5080/tcp firewall-cmd --permanent --add-port=5080/udp firewall-cmd --permanent --add-port=16384-32768/udp firewall-cmd --reload # Debian ufw allow 5060/tcp ufw allow 5060/udp ufw allow 5080/tcp ufw allow 5080/udp ufw allow 16384-32768/udp ufw enableSIP安全配置:
<!-- in sofia.conf.xml --> <param name="apply-nat-acl" value="rfc1918.auto"/> <param name="apply-inbound-acl" value="domains"/>
6.2 认证与加密
强密码策略:
<!-- in vars.xml --> <X-PRE-PROCESS cmd="set" data="default_password=ComplexP@ssw0rd!2023"/>TLS加密:
# 生成自签名证书 cd /usr/local/freeswitch/certs openssl req -x509 -newkey rsa:4096 -keyout tls.key -out tls.crt -days 365 -nodesSRTP加密:
<!-- in sofia.conf.xml --> <param name="sip-tls" value="true"/> <param name="tls-only" value="false"/>
6.3 系统级安全
专用用户运行:
useradd -r -d /usr/local/freeswitch -M -s /bin/false freeswitch chown -R freeswitch:daemon /usr/local/freeswitch文件权限控制:
chmod 750 /usr/local/freeswitch/bin/freeswitch chmod 640 /usr/local/freeswitch/conf/*.xml定期更新:
# CentOS yum update --security -y # Debian apt update && apt upgrade --only-upgrade security -y
7. 高级功能扩展
基础服务运行稳定后,可以考虑扩展FreeSWITCH的高级功能。
7.1 视频通话支持
安装视频相关依赖:
# CentOS yum install -y libyuv-devel libvpx-devel ffmpeg-devel # Debian apt install -y libyuv-dev libvpx-dev libavcodec-dev重新编译FreeSWITCH时启用视频支持:
./configure --enable-core-video-support make && make install配置视频编解码器:
<!-- in vars.xml --> <X-PRE-PROCESS cmd="set" data="global_codec_prefs=VP8,H264,OPUS,G722,PCMU,PCMA"/> <X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=VP8,H264,OPUS,G722,PCMU,PCMA"/>
7.2 与数据库深度集成
用户存储在数据库:
<!-- in directory/default.xml --> <user id="1000"> <params> <param name="password" value="$${default_password}"/> </params> <variables> <variable name="user_context" value="default"/> </variables> </user>使用ODBC连接:
# CentOS yum install -y unixODBC-devel postgresql-odbc # Debian apt install -y unixodbc-dev odbc-postgresql
7.3 与WebRTC集成
安装必要的Node.js组件:
curl -sL https://deb.nodesource.com/setup_16.x | bash - apt install -y nodejs npm install -g signalwire-web配置WebSocket支持:
<!-- in sofia.conf.xml --> <param name="ws-binding" value=":5066"/>配置SSL证书:
letsencrypt certonly --standalone -d yourdomain.com ln -s /etc/letsencrypt/live/yourdomain.com/privkey.pem /usr/local/freeswitch/certs/wss.pem ln -s /etc/letsencrypt/live/yourdomain.com/fullchain.pem /usr/local/freeswitch/certs/wss.pem
8. 实际部署经验分享
在多年的FreeSWITCH部署实践中,我积累了一些宝贵的经验教训。
8.1 性能调优实战
RTP端口范围优化:
<!-- in autoload_configs/switch.conf.xml --> <param name="rtp-start-port" value="16384"/> <param name="rtp-end-port" value="32768"/>这个范围应该与防火墙配置匹配,避免端口冲突。
Jitter Buffer配置:
<!-- in sofia.conf.xml --> <param name="jitterbuffer-sec" value="60"/> <param name="jitterbuffer-len" value="200"/>这对解决网络抖动问题特别有效。
8.2 高可用方案
双机热备配置:
# 在主备服务器上配置相同的数据库 # 使用rsync同步配置文件 rsync -avz /usr/local/freeswitch/conf/ backup-server:/usr/local/freeswitch/conf/使用Keepalived实现VIP:
# 安装Keepalived yum install -y keepalived # 配置/etc/keepalived/keepalived.conf vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 101 advert_int 1 virtual_ipaddress { 192.168.1.200/24 } }
8.3 监控与告警
使用Prometheus监控:
# 安装FreeSWITCH的Prometheus exporter git clone https://github.com/gmaruzz/freeswitch-prometheus-exporter cd freeswitch-prometheus-exporter pip install -r requirements.txt python freeswitch_exporter.py关键指标告警:
- 并发呼叫数
- CPU/内存使用率
- 数据库连接数
- SIP注册失败率
8.4 灾难恢复演练
定期进行灾难恢复演练非常重要。我的做法是:
- 每月进行一次完整备份
- 每季度模拟一次服务器崩溃场景
- 测试从备份恢复的全过程
- 记录恢复时间并不断优化流程
在实际操作中,我发现以下几点特别关键:
- 数据库备份必须与配置文件备份同步
- 恢复时要特别注意文件权限
- 恢复后要全面测试所有功能