这篇文章记录一下在 Debian 11 中编译安装 FreeSWITCH 1.10.12 的过程。

我这里走的是源码编译方案,依赖使用 Sofia-SIP v1.13.17SpanDSP fs 分支,同时主动剔除
SignalWire 以及 mod_verto 相关依赖。

安装前提

安装前提,需要安装代理软件,没有一个稳定的代理的话,安装基本不可能实现。这是前提中的前提。

另外,下面的操作默认你使用 root 用户执行,或者至少具备足够的 sudo 权限。

新建安装脚本

新建脚本文件 freeswitch_install.sh,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/bin/bash

# 遇到错误停止执行
set -e

# --- 核心版本定义 ---
FS_VERSION="v1.10.12"
SOFIA_VERSION="v1.13.17"
# 使用官方推荐的 fs 分支以确保兼容性
SPANDSP_BRANCH="fs"

# 安装路径
INSTALL_PATH="/usr/local/freeswitch"

echo "==============================================================="
echo "开始安装 FreeSWITCH $FS_VERSION"
echo "依赖库:Sofia-SIP ($SOFIA_VERSION), SpanDSP (branch: $SPANDSP_BRANCH)"
echo "已移除 SignalWire 及 mod_verto 依赖"
echo "==============================================================="

# 1. 安装 Debian 11 基础编译环境
apt-get update
apt-get install -y git build-essential cmake automake autoconf libtool-bin pkg-config \
libssl-dev zlib1g-dev libsqlite3-dev libcurl4-openssl-dev libpcre3-dev \
libspeex-dev libspeexdsp-dev libldns-dev libedit-dev libtiff5-dev yasm \
libopus-dev libsndfile1-dev libavformat-dev libswscale-dev liblua5.2-dev \
libshout3-dev libmpg123-dev libmp3lame-dev libpq-dev \
python3-dev wget uuid-dev libmagic-dev libjpeg-dev

# 清理旧的源码目录(如果存在)
rm -rf /usr/src/freeswitch-deps
mkdir -p /usr/src/freeswitch-deps
cd /usr/src/freeswitch-deps

# 2. 编译安装 Sofia-SIP (v1.13.17)
echo ">>> 正在编译 Sofia-SIP $SOFIA_VERSION..."
git clone --branch $SOFIA_VERSION https://github.com/freeswitch/sofia-sip.git
cd sofia-sip
./bootstrap.sh
./configure --prefix=/usr
make -j$(nproc)
make install
cd ..

# 3. 编译安装 SpanDSP (fs 分支)
echo ">>> 正在编译 SpanDSP ($SPANDSP_BRANCH 分支)..."
git clone --branch $SPANDSP_BRANCH https://github.com/freeswitch/spandsp.git
cd spandsp
./bootstrap.sh
./configure --prefix=/usr
make -j$(nproc)
make install
cd ..

# 更新动态链接库缓存
ldconfig

# 4. 下载并配置 FreeSWITCH 1.10.12
echo ">>> 正在下载 FreeSWITCH $FS_VERSION..."
cd /usr/src
# 如果目录已存在则删除,确保干净构建
rm -rf freeswitch
git clone --branch $FS_VERSION https://github.com/signalwire/freeswitch.git
cd freeswitch

# 初始化构建文件
./bootstrap.sh -j

# 5. 【重要】调整模块配置
echo ">>> 配置模块 (禁用 SignalWire 和 Verto)..."

# 禁用依赖 libks 的模块
sed -i 's/endpoints\/mod_verto/#endpoints\/mod_verto/' modules.conf
sed -i 's/applications\/mod_signalwire/#applications\/mod_signalwire/' modules.conf

# 确保开启 mod_sofia (SIP 核心) 和 mod_spandsp
sed -i 's/#endpoints\/mod_sofia/endpoints\/mod_sofia/' modules.conf
sed -i 's/#applications\/mod_spandsp/applications\/mod_spandsp/' modules.conf

# 开启常用多媒体模块
sed -i 's/#applications\/mod_av/applications\/mod_av/' modules.conf
sed -i 's/#formats\/mod_shout/formats\/mod_shout/' modules.conf

# 6. 执行配置、编译与安装
echo ">>> 开始执行 Configure..."
./configure --prefix=$INSTALL_PATH --enable-core-pgsql-support

echo ">>> 开始编译 (请耐心等待)..."
make -j$(nproc)
make install

# 7. 安装声音文件
echo ">>> 安装声音文件..."
make cd-sounds-install
make cd-moh-install

# 8. 权限设置与符号链接
ln -sf $INSTALL_PATH/bin/fs_cli /usr/bin/fs_cli
ln -sf $INSTALL_PATH/bin/freeswitch /usr/bin/freeswitch

if ! getent group freeswitch > /dev/null; then groupadd freeswitch; fi
if ! getent passwd freeswitch > /dev/null; then useradd -r -g freeswitch -d $INSTALL_PATH -s /bin/false freeswitch; fi

chown -R freeswitch:freeswitch $INSTALL_PATH
chmod -R ug+rw $INSTALL_PATH

echo "==============================================================="
echo "FreeSWITCH $FS_VERSION 安装成功!"
echo "依赖方案:Sofia-SIP v1.13.17 + SpanDSP (fs branch)"
echo "SignalWire 依赖已彻底剔除。"
echo "您可以执行 'freeswitch -nc' 启动程序,'fs_cli' 进入控制台。"
echo "==============================================================="

给脚本增加执行权限后直接运行:

1
2
chmod +x freeswitch_install.sh
./freeswitch_install.sh

安装后补充配置

脚本执行完成后,还需要把配置文件安装完整,并确认不需要的模块没有被自动加载。

完成配置文件安装

/usr/src/freeswitch 目录下执行:

1
2
cd /usr/src/freeswitch
make samples-conf

配置文件路径

你的所有配置文件都位于:

1
/usr/local/freeswitch/etc/freeswitch

禁用不需要的模块

看到 modules.conf.xml 内容后,如果发现 mod_signalwiremod_verto 处于开启状态,就需要手动处理。

这是因为前面的编译方案已经刻意去掉了 SignalWire 相关底层依赖,如果这里仍然加载这两个模块,
启动时就可能报错,甚至连 mod_sofia 的加载都会受到影响。

打开下面这个文件:

1
nano /usr/local/freeswitch/conf/autoload_configs/modules.conf.xml

找到以下几行并加上注释,或者直接删除:

1
2
<!-- <load module="mod_verto"/> -->
<!-- <load module="mod_signalwire"/> -->

确认 mod_sofia 已启用

确认这一行没有被注释:

1
<load module="mod_sofia"/>

处理路径并重启

如果刚执行完 make samples-conf,建议顺手把动态库缓存和配置目录路径也处理一下,然后再重启
FreeSWITCH:

1
2
3
4
5
6
7
8
9
10
11
12
# 强制刷新动态库缓存
ldconfig

# 建立软链接,确保 FreeSWITCH 能找到配置
# 如果 /usr/local/freeswitch/conf 已经存在,可以跳过
ln -s /usr/local/freeswitch/etc/freeswitch /usr/local/freeswitch/conf || true

# 杀掉旧进程
killall -9 freeswitch || true

# 启动 FreeSWITCH
/usr/local/freeswitch/bin/freeswitch -nc

如果你前面已经创建了脚本中的软链接,那么也可以直接这样启动:

1
freeswitch -nc

启动与验证

当终端里出现 Backgrounding. 以及对应的进程号时,说明 FreeSWITCH 已经成功启动。

这时候可以继续做下面几步验证。

进入控制台

1
fs_cli

常用检查命令

进入 fs_cli 后,可以执行以下命令:

1
2
3
4
version
status
sofia status
module_exists mod_spandsp

分别对应:

  • version:查看版本信息,确认是否为 1.10.12
  • status:查看当前运行状态
  • sofia status:检查 SIP 模块是否正常
  • module_exists mod_spandsp:确认 mod_spandsp 是否已经加载

如果只是退出控制台,可以输入 /exit 或者直接按 Ctrl+D,这不会关闭 FreeSWITCH 服务。

查看日志

调试时可以直接查看日志:

1
tail -f /usr/local/freeswitch/log/freeswitch.log

查看 5060 端口监听状态

1
ss -lntup | grep 5060

停止 FreeSWITCH

fs_cli 中执行:

1
shutdown

或者在系统命令行执行:

1
killall freeswitch

修改配置后,可以在 fs_cli 中执行下面的命令重新加载 XML 配置:

1
reloadxml

常见问题排查

sofia status 提示 Command not found

这通常意味着 mod_sofia.so 加载失败。

可以先在 fs_cli 中手动执行:

1
load mod_sofia

然后根据具体报错继续处理。

报错:mod_sofia.so: cannot open shared object file: No such file or directory

原因一般是编译时没有把这个模块装进去。

回到源码目录重新安装:

1
2
cd /usr/src/freeswitch
make mod_sofia-install

报错:libsofia-sip.so.0: cannot open shared object file

原因一般是动态链接库路径没有被系统正确识别。

执行下面的命令:

1
2
echo "/usr/local/lib" > /etc/ld.so.conf.d/local.conf
ldconfig

然后再重启一次 FreeSWITCH:

1
2
3
killall -9 freeswitch || true
ldconfig
freeswitch -nc

只要 mod_sofia 能成功加载,后面的 SIP 注册和客户端连通性验证基本就能继续往下走了。