在CentOS 7.9上部署FreeSWITCH之前,我们需要先做好基础环境配置。这个老牌Linux发行版虽然稳定,但默认配置可能需要一些调整才能更好地支持VoIP服务。
首先更新系统并安装编译工具链:
bash复制yum update -y && yum install -y epel-release
yum groupinstall -y "Development Tools"
yum install -y wget git vim
这里特别说明几个关键包的作用:
epel-release:提供额外的软件仓库Development Tools:包含gcc、make等基础编译工具wget/git:后续下载源码必备注意:生产环境建议先测试yum update的影响,有些服务对内核版本敏感。如果只是测试环境,可以直接更新。
FreeSWITCH的依赖可以分为几个类别,我习惯分组安装方便排查问题:
音频处理相关:
bash复制yum install -y alsa-lib-devel flite-devel libsndfile-devel \
soundtouch-devel speex-devel opus-devel \
libshout-devel libmpg123-devel lame-devel
视频处理相关:
bash复制yum install -y libtheora-devel libvorbis-devel libavformat-devel
数据库支持:
bash复制yum install -y sqlite-devel postgresql-devel unixODBC-devel \
libdb4-devel
网络协议栈:
bash复制yum install -y libcurl-devel ldns-devel unbound-devel \
gnutls-devel openssl-devel
这种分组安装方式有两个好处:
官方推荐使用源码编译安装,我通常这样组织源码目录:
bash复制mkdir -p /usr/local/src/freeswitch/{sources,modules}
cd /usr/local/src/freeswitch/sources
wget https://files.freeswitch.org/releases/freeswitch/freeswitch-1.10.7.tar.gz
tar xvf freeswitch-1.10.7.tar.gz
实测发现:/usr/local/src目录权限更灵活,比直接放在root家目录更便于多用户协作。
FreeSWITCH依赖的几个核心模块需要单独编译:
sofia-sip模块:
bash复制cd /usr/local/src/freeswitch/modules
git clone https://github.com/freeswitch/sofia-sip.git
cd sofia-sip
./bootstrap.sh && ./configure
make -j$(nproc) && make install
spandsp模块(特别注意版本):
bash复制cd /usr/local/src/freeswitch/modules
git clone https://github.com/freeswitch/spandsp.git
cd spandsp
git checkout 0d2e6ac # 这个提交点最稳定
./bootstrap.sh && ./configure
make && make install
编译这些模块时常见两个坑:
在/etc/profile.d/freeswitch.sh中添加:
bash复制export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
然后执行:
bash复制source /etc/profile
ldconfig
进入FreeSWITCH源码目录:
bash复制cd /usr/local/src/freeswitch/sources/freeswitch-1.10.7
首次配置前建议:
bash复制make current
这样会重置所有编译配置。然后执行:
bash复制./configure --enable-portable-binary \
--prefix=/usr/local/freeswitch \
--with-gnu-ld
几个关键参数说明:
--enable-portable-binary:生成可移植的二进制--prefix:指定安装目录--with-gnu-ld:明确使用GNU链接器编辑modules.conf文件,推荐启用以下中文相关模块:
code复制mod_say_zh
mod_zh
mod_zh_tts
禁用可能不需要的模块:
code复制#mod_amr
#mod_ilbc
使用多线程编译:
bash复制make -j$(($(nproc)+1))
安装到指定目录:
bash复制make install
创建软链接方便使用:
bash复制ln -sf /usr/local/freeswitch/bin/freeswitch /usr/bin/
ln -sf /usr/local/freeswitch/bin/fs_cli /usr/bin/
vars.xml 关键配置:
xml复制<X-PRE-PROCESS cmd="set" data="default_password=your_secure_password"/>
<X-PRE-PROCESS cmd="set" data="domain=yourdomain.com"/>
sip_profiles/internal.xml 修改:
xml复制<param name="rtp-ip" value="$${local_ip_v4}"/>
<param name="sip-ip" value="$${local_ip_v4}"/>
创建systemd服务文件 /etc/systemd/system/freeswitch.service:
ini复制[Unit]
Description=FreeSWITCH
After=syslog.target network.target
[Service]
Type=forking
PIDFile=/usr/local/freeswitch/run/freeswitch.pid
ExecStart=/usr/local/freeswitch/bin/freeswitch -nc -nonat -rp
ExecStop=/usr/local/freeswitch/bin/freeswitch -stop
TimeoutSec=45s
Restart=always
[Install]
WantedBy=multi-user.target
然后执行:
bash复制systemctl daemon-reload
systemctl enable freeswitch
如果使用firewalld:
bash复制firewall-cmd --add-port={5060/tcp,5060/udp,5080/tcp,5080/udp} --permanent
firewall-cmd --add-port={16384-32768/udp} --permanent # RTP端口范围
firewall-cmd --reload
问题1:error: spandsp.h not found
解决方案:
bash复制export C_INCLUDE_PATH=/usr/local/include:$C_INCLUDE_PATH
问题2:undefined reference to 'symbol'
解决方案:
bash复制make clean
./configure
make
问题1:30秒自动挂断
检查internal.xml中的NAT设置:
xml复制<param name="NDLB-received-in-nat-reg-contact" value="true"/>
<param name="NDLB-broken-auth-hash" value="true"/>
问题2:WSS连接失败
确保证书配置正确:
bash复制cat /path/to/cert.pem /path/to/key.pem > /usr/local/freeswitch/certs/wss.pem
chown -R freeswitch:freeswitch /usr/local/freeswitch/certs
修改/usr/local/freeswitch/conf/autoload_configs/switch.conf.xml:
xml复制<param name="max-sessions" value="1000"/>
<param name="sessions-per-second" value="30"/>
<param name="rtp-timer-name" value="timerfd"/>
调整日志级别(conf/autoload_configs/console.conf.xml):
xml复制<param name="log-level" value="info"/>
日志轮转配置(/etc/logrotate.d/freeswitch):
code复制/usr/local/freeswitch/log/freeswitch.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/bin/killall -HUP freeswitch
endscript
}
在vars.xml中添加:
xml复制<X-PRE-PROCESS cmd="set" data="cluster_password=your_cluster_password"/>
<X-PRE-PROCESS cmd="set" data="cluster_enabled=true"/>
bash复制# 启动
systemctl start freeswitch
# 查看状态
fs_cli -x "status"
# 重载配置
fs_cli -x "reloadxml"
bash复制# 查看通话
fs_cli -x "show calls"
# 查看注册用户
fs_cli -x "sofia status profile internal reg"
# 查看资源使用
fs_cli -x "show channels count"
bash复制# 配置备份
tar czvf freeswitch_conf_backup_$(date +%Y%m%d).tar.gz \
/usr/local/freeswitch/conf
# 录音备份
rsync -avz /usr/local/freeswitch/recordings \
backupuser@backupserver:/path/to/backup
在CentOS 7.9上部署FreeSWITCH确实需要耐心,特别是在处理依赖关系和版本兼容性时。我建议在正式环境部署前,先在测试环境完整走一遍流程。遇到编译错误时,仔细阅读错误信息,大部分问题都能通过安装对应开发包解决。对于生产环境,一定要规划好日志管理和监控方案,FreeSWITCH运行稳定后很少出问题,但一旦出问题,详细的日志就是救命稻草。