十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Debian 12源码编译安装FreeSWITCH v1.10.x完整指南与排错实战

Debian 12源码编译安装FreeSWITCH v1.10.x完整指南与排错实战 刚到手的Debian 12bookworm新机器要装一套FreeSWITCH v1.10.x说难不难但坑是真不少。网上教程一大堆不是缺依赖就是编译到一半报错要么就是跑起来后模块加载失败折腾一晚上没睡成觉。我把这一路踩过的坑、试过的命令、最后跑通的完整流程整理出来从虚拟机网络问题、依赖安装、源码编译、systemd托管到常见报错排查一篇说透照着做基本能一次过。先说个结论FreeSWITCH建议用源码编译安装不要贪图省事用apt直接装。Debian官方源里的FreeSWITCH版本老到能用但扩展模块不全SignalWire官方仓库则更倾向于维护较新的版本如果你要的是v1.10.x这个稳定分支源码编译是掌控力最强、最不容易出幺蛾子的方式。后面所有操作我都默认你是root用户或者有sudo权限基于Debian 12 minimal环境。1. 整体设计与安装方案选型1.1 为什么坚持源码编译安装很多新手上来就问“apt install freeswitch行不行”。行是行但你要明白apt源里的包版本往往滞后而且Debian 12的包管理机制会把FreeSWITCH拆得很散mod、sound、config各自独立装完还要手动拼装反而不省心。源码编译的核心优势有三个定制化程度高、版本精确可控、模块自由裁剪。v1.10.x并不是一个会自动拉取的固定版本而是需要你在源码仓库上通过分支或tag来锁定。编译时你可以选择启用或禁用特定模块比如不想要mod_av就在modules.conf里注释掉不需要数据库支持就跳过相关依赖出来的二进制更干净内存占用也更可控。不过别误会源码编译不是让你从零写代码。FreeSWITCH使用的是autoconf/automake这套经典构建系统跟编译普通Linux软件包没有本质区别只是依赖项比较多需要耐心。我把这个流程拆成环境检查、依赖安装、源码获取、配置生成、编译安装、基础配置、系统服务托管七个阶段每一步都有明确的验证方式卡住了也知道去查哪里。另外要强调的是FreeSWITCH和操作系统之间的耦合很深。它在运行时要动态加载.so模块模块之间的依赖关系错综复杂比如mod_sofia依赖libsofia-sip-uamod_spandsp依赖libspandsp。这些第三方库在Debian 12上有些有现成包有些没有比如libspandsp必须手动编这就是很多人卡在依赖地狱里的原因。所以提前梳理依赖比出错了再一个个补要高效得多。1.2 Debian 12版本适配性评估Debian 12bookworm是目前Debian的稳定版本内核升级到了6.1 LTSglibc版本也足够新跑FreeSWITCH v1.10.x完全没有兼容性问题。但我实测下来有几个细节值得注意直接关系到后续能不能编译通过。第一Debian 12的默认gcc版本是12.2.0编译老的FreeSWITCH版本时偶尔会遇到一些“warning treated as error”的情况比如变量未使用的告警在某些模块里会直接中断编译。解决办法是编译时加上--disable-dependency-tracking和CXXFLAGS-Wno-error后面我会在configure部分详细展开。第二Debian 12中很多开发包的名字和旧版Debian不一样了。比如libpcre3-dev对应的是libpcre3-dev没错但有些衍生包换成了libpcre2-dev。FreeSWITCH v1.10.x默认需要PCRE1装错成PCRE2会链接失败。这种细节不实际跑一遍是真的注意不到。第三Debian 12的systemd版本是252service文件写法和老版本有些不同比如ProtectSystem、ReadWritePaths这些选项如果设置不当会导致FreeSWITCH启动后无法写日志或记录CDR。后面我给的service文件是实测过的直接用。总而言之Debian 12是一个对FreeSWITCH v1.10.x非常友好的平台前提是你要摸清它的包管理器脾气和默认工具链特性。这就好比你装一台电脑CPU和主板都是新的但电源线接口和旧硬盘不匹配你得多备几根转接线。2. 环境准备与基础依赖安装2.1 虚拟机网络问题快速处置这次部署我本来打算用现成的虚拟机模板结果新建VM的时候直接给我来个“error 未找到网络: 没有网络与名称 default 映射”虚拟机起不来。这个报错看起来跟FreeSWITCH没关系但它会拦截在第一步不解决什么都干不了。这个问题的根因是libvirt的默认网络没有被创建或没有自动激活。Debian 12装完libvirt-daemon后default网桥默认是存在的但某些最小化安装或定制化安装里这个网络会被删掉或者处于inactive状态。检查方法很简单sudo virsh net-list --all如果default网络显示为inactive直接启动并设为开机自启sudo virsh net-start default sudo virsh net-autostart default如果列表里根本没有default网络那就需要从默认配置文件里重新定义并启动sudo virsh net-define /usr/share/libvirt/networks/default.xml sudo virsh net-start default sudo virsh net-autostart default处理完之后回到虚拟化管理界面重启VM网络就能正常识别了。这个折腾过程浪费了我差不多半小时写出来就是提醒各位装任何服务之前先把宿主机的虚拟网络环境确认好不然你连登录系统的机会都没有更别提后面那一长串编译命令。2.2 系统更新与基础软件包安装进入Debian 12系统后第一件事永远是更新软件源并安装基础工具咱不整那些花里胡哨的按顺序执行sudo apt update sudo apt upgrade -y sudo apt install -y build-essential git wget curl autoconf automake libtool \ pkg-config m4 libssl-dev zlib1g-dev libdb-dev unixodbc-dev \ libncurses5-dev libexpat1-dev libgdbm-dev libbdb-dev \ libsqlite3-dev libpcre3-dev libpcre3 libedit-dev libldns-dev \ libspeex-dev libspeexdsp-dev libcurl4-openssl-dev libpq-dev \ liblua5.2-dev libopus-dev libsndfile1-dev libtiff-dev libjpeg-dev \ libavformat-dev libavcodec-dev libavutil-dev libswscale-dev \ uuid-dev libsrtp2-dev这里面的包不是随便抄来的每个都有对应模块在做支撑。libldns-dev是给mod-ldns用的libpq-dev是给mod-pgsql用的libsrtp2-dev是WebRTC和SRTP通话加密的基础libopus-dev负责语音编码。如果后面你觉得不需要某些模块可以从这个清单里去掉对应依赖但万一报错缺头文件回过来再装反而麻烦。Debian 12的仓库里libavformat-dev等ffmpeg相关包的版本比较新FreeSWITCH的mod_av编译要求ffmpeg头文件路径正确装完这些包后一般不会有什么冲突但要注意不要同时装libavcodec-extra和libavcodec-dev的冲突版本。官方源里不会出现这种问题就怕你手动加第三方源。所以听我一句劝Debian 12上不要随便加PPA或者第三方apt源来装ffmpeg直接用官方源最稳。2.3 手动编译libspandsp这是Debian 12上最容易踩的坑之一。FreeSWITCH v1.10.x的mod_spandsp模块依赖libspandsp但这个库在Debian官方源里没有现成的开发包或者说版本太老API不匹配必须手动编译。方法是从官方仓库克隆指定版本注意不要用master要用稳定tag。编译安装步骤如下cd /usr/local/src git clone https://github.com/freeswitch/spandsp.git cd spandsp git checkout v3.0.0 ./autogen.sh ./configure --disable-dependency-tracking make -j$(nproc) sudo make install sudo ldconfig为什么要用v3.0.0这个tag因为FreeSWITCH v1.10.x官方文档和CI测试用的就是spandsp 3.0太新的master反而有可能引入API变动导致mod_spandsp编译失败。--disable-dependency-tracking这个参数在热词里出现了它的作用是减少编译系统对头文件依赖关系的追踪加快configure速度同时对最终产物没有任何影响。这个参数在libspandsp和FreeSWITCH本体的configure里都可以放心使用。编译完务必执行sudo ldconfig刷新动态链接库缓存否则后续链接libspandsp.so时会提示找不到共享库文件。这个命令太小很多人会漏掉但它恰恰是解决“undefined reference to spandsp”类报错的关键一步。3. FreeSWITCH v1.10.x源码获取与编译3.1 拉取指定版本源码FreeSWITCH的源码托管在GitHub上仓库地址是https://github.com/signalwire/freeswitch。注意FreeSWITCH项目的维护方是SignalWire所以官方仓库在signalwire组织下有些教程让你去freeswitch/freeswitch那是老地址虽然也能用但建议用新的。v1.10.x分支对应的就是1.10稳定版序列直接用git拉分支cd /usr/local/src git clone https://github.com/signalwire/freeswitch.git cd freeswitch git checkout v1.10.12这里我锁定的是v1.10.12这已经是v1.10分支里比较新的稳定版。你可以去GitHub的tags页面看有没有更新的patch版本比如v1.10.13、v1.10.14选择最高的稳定tag即可。不建议直接用git checkout v1.10.x这种分支名方式因为分支会持续滚动你无法保证当前拉下来的代码和某次线上稳定运行的版本完全一致。提示如果你在公司内网或者网络受限环境无法直接访问GitHub可以考虑先下载release tar包然后同步到服务器上解压。FreeSWITCH的release包自带configure脚本不需要执行autogen.sh能省一步。拉完代码之后先进目录看一眼modules.conf这个文件决定了编译哪些模块cd /usr/local/src/freeswitch nano modules.conf文件里默认把绝大多数模块都注释掉了你需要按需取消注释。最关键的是这几个applications/mod_conference、codecs/mod_g723_1、codecs/mod_opus、endpoints/mod_sofia、endpoints/mod_loopback、dialplans/mod_dialplan_xml、languages/mod_lua。其中mod_sofia是SIP协议栈的核心mod_conference是电话会议用的mod_lua是脚本支持。如果不做特殊功能用默认启用列表也行但mod_sofia和mod_dialplan_xml一定要保留。3.2 configure参数选择与编译执行源码目录里没有configure文件需要先用脚本生成。这一步很多第一次编译的朋友会漏掉然后疑惑为什么找不到configure。cd /usr/local/src/freeswitch ./bootstrap.shbootstrap.sh会调用autoconf、automake、libtool等工具生成configure脚本。执行成功后接着就是configure配置./configure --prefix/usr/local/freeswitch --disable-dependency-tracking CFLAGS-O2 -Wno-error--prefix指定安装目录我建议固定在/usr/local/freeswitch不跟系统目录混在一起后续卸载或者升级直接删除这个目录就行。--disable-dependency-tracking前面解释过加快configure速度。-Wno-error是为了避免Debian 12的gcc 12把一些warning当作错误处理导致编译中断。实际上FreeSWITCH的代码质量挺高大部分模块都能顺利编译但总有些边缘模块在特定编译器版本下会出问题比如libavcodec头文件变更导致的告警。加上这个保险不亏。configure完成后会生成Makefile接下来编译。官方建议用make我建议加上-j参数多核并行毕竟FreeSWITCH模块众多单核编译真的能等到天荒地老make -j$(nproc)$(nproc)会读取CPU核心数假设你的机器是8核就会执行make -j8。如果你是在虚拟机里跑的CPU核数也不小但内存不够大时并行编译容易OOM建议在编译前用free -h看一下内存如果小于4GB就把并行数减半比如make -j4。编译成功的标志是没有任何error字样最后停留在make[1]: Leaving directory这类提示。如果中间某个模块编译失败先别急着重新跑make找到具体是哪个模块报错去网上搜一下错误信息通常是缺依赖或者代码兼容性问题。大部分情况下补装对应开发包后重新运行configure再make就能解决。3.3 安装与目录结构确认编译通过后安装就很快了sudo make install这个命令会把所有编译好的二进制、模块、配置模板、声音文件全部拷贝到/usr/local/freeswitch目录下。整个目录结构大致是这样的/usr/local/freeswitch/ ├── bin/ # 可执行文件freeswitch、fs_cli等 ├── conf/ # 配置文件目录 ├── db/ # 内置数据库文件 ├── grammar/ # 语音识别语法文件 ├── htdocs/ # 内置web服务目录 ├── include/ # 头文件 ├── lib/ # 库文件 ├── mod/ # 动态模块 ├── recordings/ # 录音默认目录 ├── sounds/ # 语音提示音 ├── storage/ # 存储目录 └── log/ # 日志目录同时make cd-sounds-install可以安装内置的音频提示文件。如果不安装FreeSWITCH能跑起来但语音信箱、IVR等场景下会提示音播放不了电话进入后是沉默的。建议执行这个命令cd /usr/local/src/freeswitch sudo make cd-sounds-install cd-moh-install这两个命令会下载并安装默认的英文提示音和保留音乐。如果你后续要换中文语音包先把sounds目录结构搞清楚再按需替换对应文件不要覆盖整个目录否则容易导致文件缺失。安装完成后验证一下基本版本信息/usr/local/freeswitch/bin/freeswitch -version正常会输出类似FreeSWITCH Version 1.10.12-release的内容。如果提示找不到libspandsp.so说明前面ldconfig没执行赶紧回去补上。4. 基础配置与Systemd服务托管4.1 修改默认SIP端口和防火墙配置FreeSWITCH启动后默认监听UDP/TCP 5060端口如果你的机器上已经有其他SIP服务占用该端口需要修改/usr/local/freeswitch/conf/vars.xml里的配置X-PRE-PROCESS cmdset datainternal_sip_port5060/这个文件是整个FreeSWITCH配置的“总开关”很多变量都是在这里预定义然后被其他XML文件引用的。改端口时注意同时检查conf/sip_profiles/internal.xml里是否硬编码了端口vars.xml里的变量优先级不一定能覆盖每一个地方稳妥起见两个地方都改。Debian 12默认没有启用防火墙但如果你装了ufw或者系统自带nftables记得放行所需端口sudo ufw allow 5060/udp sudo ufw allow 5060/tcp sudo ufw allow 8081/tcp sudo ufw allow 8021/tcp8081是FreeSWITCH内置HTTP服务的默认端口8021是fs_cli控制台的ESL监听端口。如果你要用WebRTC还要放行TCP 7443端口要用RTP媒体流还得放行UDP 16384-32768这段区间。端口规划最好一次想清楚不然跑起来后打不出电话排查起来很头疼。4.2 编写Systemd服务开机自启直接命令行启动/usr/local/freeswitch/bin/freeswitch当然也能跑但重启服务器后需要手动再拉起来不够优雅。我用systemd方式托管实测稳定运行两周没有任何意外退出。创建服务文件sudo nano /etc/systemd/system/freeswitch.service写入以下内容[Unit] DescriptionFreeSWITCH Afternetwork.target [Service] Userfreeswitch Groupfreeswitch WorkingDirectory/usr/local/freeswitch ExecStart/usr/local/freeswitch/bin/freeswitch -nc -nonat -nf ExecReload/usr/bin/kill -HUP $MAINPID Restarton-failure RestartSec5s LimitNOFILE1048576 [Install] WantedBymulti-user.target这里有几个关键点。-nc表示no console模式不占终端-nonat表示不做NAT穿越检测公网部署如果不想让FreeSWITCH自动探测公网IP可以加上-nf表示不fork配合systemd管理让主进程直接在前台运行这样systemd才能正确跟踪进程状态。系统默认的LimitNOFILE经常不够用FreeSWITCH作为通信服务要同时管理大量socket文件描述符默认1024肯定不够我直接设成1048576跟常见的高性能服务保持同一量级。要单独建一个低权限用户来跑服务不要用root。虽然FreeSWITCH的官方安装脚本也会创建freeswitch用户但手动编译安装不会自动创建需要手动补上sudo useradd -r -s /sbin/nologin freeswitch sudo chown -R freeswitch:freeswitch /usr/local/freeswitch设置好权限后重新加载systemd并启动服务sudo systemctl daemon-reload sudo systemctl enable freeswitch sudo systemctl start freeswitch sudo systemctl status freeswitch如果状态显示active (running)说明服务托管成功。接下来用客户端连进去验证一下/usr/local/freeswitch/bin/fs_cli -x status这个命令会输出版本号、会话数、运行时长等信息。出现类似“UP 0 sessions”就说明核心已正常运转。注意fs_cli默认通过本地8021端口连接如果连接失败检查conf/autoload_configs/event_socket.conf.xml里的配置默认监听127.0.0.1密码是ClueCon。生产环境一定要改掉这个默认密码别哪天被人连上去执行了业务逻辑级别的命令。5. 常见问题与排查技巧实录5.1 configure阶段高频报错与处理报错1checking for SPANDSP... no这说明configure脚本没找到libspandsp的头文件或库文件。最常见原因是libspandsp编译安装完没有执行ldconfig或者安装到了非标准路径。解决方法是确认/usr/local/lib下有libspandsp.so文件然后在/etc/ld.so.conf.d/下新建一个freeswitch.conf文件内容写入/usr/local/lib再执行ldconfig。报错2libavcodec version mismatch这种问题一般出现在有多个ffmpeg版本共存的环境里。Debian 12官方源里的ffmpeg是5.x但如果你另外装了静态编译的ffmpeg或者手动编译过ffmpeg头文件和库文件版本就会冲突。最干净的解决方法是把非官方路径下的ffmpeg相关头文件全部移除重新apt install libavcodec-dev libavformat-dev libavutil-dev确保系统只有一个ffmpeg开发环境。报错3configure: error: C compiler cannot create executables这个报错通常意味着build-essential没装全或者gcc版本有问题。先确认gcc --version和g --version能正常输出再确认make存在。不要只看错误输出末尾要往上翻几行看具体是哪个库或者头文件缺失。5.2 编译过程中常见问题make时报错找不到某某.h头文件这是最典型的依赖缺失问题。例如报错缺opus.h就装libopus-dev缺pq.h就装libpq-dev。Debian 12的apt源里几乎所有开发包都能直接搜到方法是在线搜索apt search opus找到带-dev后缀的包装上即可。某个模块编译失败其他模块正常有些模块比如mod_av、mod_fsv这种跟多媒体相关的依赖ffmpeg的版本比较敏感。如果编译到mod_av时报错最快的方式是暂时不编译它在modules.conf里把它注释掉等基础功能跑通后再回头研究模块兼容性问题。不要死磕单个模块拖慢整个项目进度。make -j8编译过程中内存溢出Killed如果你用的是小内存虚拟机2GB以下并行编译会直接OOM。解决方法是先free -h查看内存如果紧张就改用make -j2或者临时增加swap编译完成后再关掉swap。5.3 启动与运行期关联问题问题1启动后fs_cli连接不上先确认服务是否真的在运行systemctl status freeswitch。如果在运行但连不上用netstat -tlnp | grep 8021看端口是否在监听。如果是UDP/RTP问题检查5060端口是否被占用ss -ulpn | grep 5060。端口被占时FreeSWITCH不会启动失败但SIP注册会超时。问题2打电话没有声音这个问题十有八九是RTP端口没有放行或者NAT配置不对。先确认服务器的UDP 16384-32768端口段在防火墙上放行再用tcpdump -i any udp portrange 16384-32768抓包确认媒体流有没有到达服务器。如果是内网环境可以用ext-rtp-ip和ext-sip-ip这两个变量来指定内外网IP映射。问题3提示音播放不出来大概率是sounds没装全。执行sudo make cd-sounds-install cd-moh-install重新安装或者检查conf/vars.xml里的sound_prefix变量指向的目录是否存在对应音频文件。问题4Debian 12防火墙和网络问题Debian 12 minimal默认不带ufw但不排除你手动装了。注意nftables和iptables的关系Debian 12转向nftables后如果你同时启用iptables规则和ufw两条链路可能重复拦截。建议统一用ufw管理别两套混着用。5.4 值得收藏的排障命令集FreeSWITCH运行时的排查手段重点在于会用它的自带工具和Linux系统工具# 查看模块加载情况 /usr/local/freeswitch/bin/fs_cli -x module_exists mod_sofia # 查看SIP注册状态 /usr/local/freeswitch/bin/fs_cli -x sofia status # 跟踪日志输出 tail -f /usr/local/freeswitch/log/freeswitch.log # 实时抓SIP信令包 tcpdump -i any -s0 -w sip.pcap port 5060fs_cli就是一个交互式命令行进入之后可以敲help看所有命令。很多功能比如查看通话、踢掉会话、重启模块都可以在fs_cli里一键操作比你不断地改配置重启服务要高效得多。从这几天的实测来看日志文件freeswitch.log是最直接的问题定位工具启动错误、拨号失败、媒体协商失败都会有明确记录排查问题前先翻日志别瞎猜。我个人在实际操作中的体会是FreeSWITCH这套系统装好只是第一步真正考验人的是理解它的模块化思想——一个呼叫流程会经过dialplan、endpoint、codec、application等多个模块的协作每个环节都可能出问题。以上这套Debian 12安装部署流程我到今天已经完整跑了三次前两次踩了依赖和systemd权限的坑第三次开始一路顺畅。你照着我这份操作来理论上两个小时以内能把系统跑起来但如果遇到网络慢、源码编译超时这类问题稍安勿躁耐心排查就好。毕竟搞通信底层服务稳比快重要跑通一次之后后面改配置、加模块就都熟门熟路了。
返回列表