尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

FreeSWITCH三种部署方式全解析:源码编译、Docker与Windows安装包

FreeSWITCH三种部署方式全解析:源码编译、Docker与Windows安装包 干了这么多年通信和呼叫中心我见过太多人在FreeSWITCH安装这一步就放弃了。不是因为它难而是网上教程太碎今天给你讲源码编译明天又跟你说Docker一条命令搞定新手很容易被带偏。我自己在Linux服务器、Windows桌面和容器环境里都部署过FreeSWITCH踩过的坑攒了一堆。这篇就把源码编译、Docker容器化、Windows安装包这三种主流部署方式从头到尾拆开讲每种方式适合什么人、哪些环节容易翻车、生产环境到底该怎么选一次说清楚。不管你是刚接触软交换的小白还是已经在用其他通信方案想迁移的老手这篇文章的目标很简单让你看完之后知道自己该选哪条路并能照着实践跑起来。1. 先搞清楚这三条路分别解决什么问题FreeSWITCH本质上是一个开源的软交换平台能处理VoIP呼叫、SIP中继、会议、IVR这些事。但安装FreeSWITCH这句话在不同人嘴里是完全不同的需求。有的人是要搭一个生产环境的通信平台要求稳定、可控、能调优有的人只是想在本地快速验证一个功能比如测一下SIP呼叫流程或者调试一下拨号计划还有的人压根不熟Linux只在Windows环境里做开发测试。这三类需求对应的部署方式完全不一样。源码编译安装是最正统的方式。你在FreeSWITCH官网拉下来源代码自己解决依赖、自己编译、自己指定安装路径。这种方式的好处是可控性最强你可以在configure阶段按需裁剪模块可以把编译参数调到适合当前CPU的状态出了任何问题你都知道它是从哪里来的。缺点是步骤多、耗时长、对新手不友好。首次编译大概需要20到40分钟过程中还有可能因为某个依赖库没装全而失败。Docker部署是近几年越来越主流的方式。官方镜像拉下来就能跑五分钟内起一个完整环境。对于做二次开发、功能验证、想快速看看FreeSWITCH长什么样的朋友这是效率最高的路。但Docker方式也有它自己的问题比如容器里的版本相对滞后、模块裁剪不够灵活、持久化配置需要专门处理。你要做生产级深度定制的时候Docker环境反而会变成束缚。Windows安装包是最省心的路。官方提供MSI安装包双击、下一步、完事。这主要面向Windows平台下的开发调试和轻量测试场景。但Windows版本功能上会比Linux版少一些性能表现也弱一些扛不住高并发生产负载。在开始之前有一个很重要的选型判断。V1.10系列是当前最稳定的长期支持版本网上绝大多数资料、模块、第三方方案都是基于这个版本验证过的。开发版和预览版虽然有一些新特性但我不建议在部署的第一时间就追新。生产环境用稳定版这是通信行业里一条朴素的真理通信平台的关键诉求是永远在线、永远不出错。2. 生产级首选源码编译安装的全流程拆解源码编译是我个人在生产环境里用得最多的部署方式。虽然它繁琐但编译出来的环境边界清楚、性能可控、模块组合自由。2.1 编译前的依赖准备漏一个就等着报错在开始之前你需要一台Linux服务器Ubuntu、Debian、CentOS、Rocky Linux这些都可以但要记住不同发行版的依赖包名是不完全一样的网上搜教程的时候先确认对方的系统跟你是同源的。以Ubuntu 20.04/22.04为例首先把基础构建工具装上apt update apt install -y build-essential automake autoconf libtool pkg-config接着是FreeSWITCH运行所需的各类依赖库。这一步最容易漏因为不同模块依赖不同的库你漏了某个库不会在configure阶段报错而是在编译到某个模块的时候突然中断这个时候排查起来很费劲。我一般习惯把常用依赖一次性装齐apt install -y libssl-dev libcurl4-openssl-dev libpcre3-dev libspeex-dev libspeexdsp-dev libldns-dev libedit-dev libopus-dev libsndfile-dev liblua5.2-dev libjpeg-dev libsqlite3-dev libavformat-dev libavcodec-dev libavutil-dev libswscale-dev这里有几个注意事项libssl-dev是必装的否则SIP over TLS、WSS这些安全传输功能全部无法启用。libopus-dev针对Opus编解码现在VoIP里用得越来越多不要省。libavformat-dev等FFmpeg相关库是给mod_av模块用的如果你确定不需要视频转码能力可以不用装后面编译时把对应模块禁用掉就行。如果系统里FFmpeg相关库版本冲突严重也可以直接跳过这些库并不会影响核心语音功能。2.2 configure阶段如何做模块裁剪依赖到位后拉取源码。建议从官方Git仓库拉取稳定分支这样能拿到最新的修复补丁git clone -b v1.10 https://github.com/signalwire/freeswitch.git cd freeswitch然后初始化子模块这一步是很多人容易忘的。FreeSWITCH的代码依赖一系列子模块不初始化的话编译必失败git submodule update --init --recursive接下来进入编译的核心配置阶段。首先生成configure脚本./bootstrap.sh -j这个脚本会读取当前目录下的模块配置文件默认大概是modules.conf里面列出了要编译安装的所有模块。你可以在这一步打开这个文件做裁剪不用的模块注释掉就行。我的习惯是至少保留以下几类核心模块信令和会话类mod_sofia、mod_loopback这是SIP通信的基础。媒体处理类mod_opus、mod_g729如果你有G.729授权、mod_sndfile。拨号与应用类mod_dialplan_xml、mod_dptoolsPVT功能的核心。数据库与接口类mod_event_socket、mod_commands做二次开发和运维监控必须保留。会议类mod_conference很多业务场景都要用到电话会议。不需要的模块比如mod_av、mod_tts_commandline、mod_sms等可以直接注释。裁剪模块的意义有两个一是缩短编译时间二是减少运行时的安全暴露面。生产环境里多一个模块就多一份被利用的风险。configure命令如下./configure --prefix/usr/local/freeswitch--prefix指定安装目录后续所有文件、配置都会装在这个目录下。如果你不指定默认会散落在系统各处卸载和排查都麻烦。我强烈建议指定一个独立目录这样整个环境干干净净的出问题可以直接删目录重新来过。2.3 编译过程中最常见的两类翻车现场configure通过之后就开始编译make -j4-j参数是并行编译的核数可以根据你服务器的CPU核数来定比如4核机器就用-j48核就用-j8。并行编译能显著节省时间但如果你是用虚拟机装的环境内存小于2G建议还是用-j2比较稳否则编译过程中内存耗尽会直接OOM。我经历过的最典型翻车场景有两个。第一个是编译到某个模块时报”ld returned 1 exit status“这种通常都是缺某个库或者某个库的版本不兼容。解决办法不是去死磕这个模块而是回到modules.conf把对应的模块注释掉避开它。比如mod_av报错频率最高没有视频需求就不用在这个模块上耗时间。第二个是编译完成后启动时发现找不到某些.so动态库文件。这是因为系统没有更新动态链接库缓存。解决方法是ldconfig或者手动把FreeSWITCH的lib目录加入/etc/ld.so.conf.d/freeswitch.conf然后执行ldconfig。这个问题在很多教程里都不提但实际中特别常见因为FreeSWITCH安装在了自定义prefix目录系统默认是找不到它的动态库的。代码编译完成后还要安装默认的语音文件和音乐保持文件。这一步很多人会漏掉导致后面做IVR或者测试放音的时候发现没有任何提示音make install make cd-sounds-install cd-moh-install2.4 初始化配置与首次启动验证安装完成后FreeSWITCH的目录结构在这个/usr/local/freeswitch下bin/ 可执行文件 conf/ 配置文件目录 db/ SQLite数据库文件 log/ 日志文件 mod/ 编译好的模块 } sound/ 语音资源文件首次启动前一般不需要改任何配置就直接可以跑起来/usr/local/freeswitch/bin/freeswitch -nc-nc参数表示以守护进程方式后台运行。首次跑起来后验证是否正常/usr/local/freeswitch/bin/fs_clifs_cli是FreeSWITCH自带的命令行管理客户端进去后执行status查看运行状态。如果能看到类似UP 0 years, 0 days, 0 hours, 1 minutes, 0 seconds这样的输出说明核心已经跑起来了。这时你可以做一个最简单的验证。用fs_cli执行originate user/1000 echo这个命令的意思是向分机1000发起一个呼叫然后立即执行echo应用。你可以用软电话注册一个分机测试一下如果通了就能听到自己的回音。这一步通过就说明SIP注册、呼叫路由、媒体处理整条链路都是通的。源码编译部署到这里就算完成了。整个过程看起来步骤多但其实每一步都是透明的你能看到每个模块被编译安装到了哪里能看到每个依赖被用在了哪里。生产环境里出了问题你排查起来会比黑盒部署有底气得多。3. 轻量与快速Docker部署方式与容器化取舍如果你只是想快速跑一个环境来测试或者开发环境不想在机器上装一堆依赖Docker方式简直就是救星。我第一次用Docker装FreeSWITCH的时候前后五分钟就把环境跑起来了那种心情是真的舒畅。3.1 一条命令跑起来的快感与坑Docker部署的前提是你已经有了docker环境。然后直接拉镜像、启动容器docker pull freeswitch/freeswitch:latest docker run -d \ --name freeswitch \ -p 5060:5060/udp \ -p 5060:5060/tcp \ -p 5061:5061/tcp \ -p 8021:8021/tcp \ freeswitch/freeswitch:latest端口说明5060/UDP和5060/TCP是SIP信令的默认端口。5061/TCP是SIP over TLS的端口。8021/TCP是Event Socket端口用于外部程序通过ESL跟FreeSWITCH通信做二次开发时必须映射出来。跑起来后进入容器的fs_cli也很方便docker exec -it freeswitch /usr/local/freeswitch/bin/fs_cli但如果你只用这串命令跑完就当生产环境用后面会有一堆让你头疼的事。3.2 容器化部署最容易被忽略的持久化问题Docker容器默认是临时的容器一旦被删除里面所有配置、录音文件、CDR话单、SQLite数据库全部灰飞烟灭。我之前帮一个朋友排查过一个问题他花了三天调好了拨号计划然后不小心把容器删了重建所有配置回到初始状态三天白干了。所以用Docker部署FreeSWITCH第一件事就是挂载数据目录。关键目录有几个/etc/freeswitch配置文件目录、/var/lib/freeswitch数据库和录音文件目录、/var/log/freeswitch日志目录。完整的启动命令应该是这样的docker run -d \ --name freeswitch \ -p 5060:5060/udp \ -p 5060:5060/tcp \ -p 5061:5061/tcp \ -p 8021:8021/tcp \ -v /opt/freeswitch/conf:/etc/freeswitch \ -v /opt/freeswitch/data:/var/lib/freeswitch \ -v /opt/freeswitch/log:/var/log/freeswitch \ --restartalways \ freeswitch/freeswitch:latest挂载之后你对/opt/freeswitch/conf下的XML文件做的任何修改都会同步到容器内的配置目录里。以后升级镜像、迁移服务器配置和录音文件都还在这才是生产级的用法。3.3 Docker方式适合谁不适合谁我的判断是Docker部署最适合开发环境、测试环境和轻量级生产场景。适合的原因很明显环境隔离干净不污染宿主机。一条命令就能启动完整环境。快速重建环境适合持续集成场景。一台物理机上可以跑多个互不干扰的FreeSWITCH实例这对做多租户的SaaS平台很有价值。不适合的场景也很明确需要深度定制编译模块的时候容器方式没法灵活裁剪。需要用到特殊编译参数比如G.729专利编码模块非标准集成容器镜像里没有。极高性能场景容器网络NAT转发会带来额外的延迟损耗。需要复杂网络模型如多个网卡对应不同运营商SIP线路的时候容器端口映射机制会很别扭。我个人的实践建议是如果只是做功能验证和开发联调Docker优先如果是要上线扛流量源码编译优先。有一种折中的玩法是拿Docker先做开发和灰度验证定稿之后再用源码编译一版放到生产环境两边的配置同步用git管理这样既有开发效率又保住线上稳定。4. 桌面端尝试Windows安装包部署的正规路线虽然不是生产首选但Windows环境确实有大量开发者在用。特别是那些主攻C#、Java需要给本地应用集成呼叫功能的场景一台Windows机器上装一个FreeSWITCH能省掉很多远程联调的烦恼。4.1 下载安装过程中的几个关键选择Windows版FreeSWITCH在官方仓库里有对应的MSI安装包下载。下载的时候注意版本和位数官方推荐64位版本对应的运行性能更好。双击MSI进入安装向导后一路Next并不是最优选择。有几个选项你需要认真看一眼第一个是安装路径。默认安装在C:\Program Files\FreeSWITCH如果你后续要频繁编辑配置文件这个路径不是不能用但路径里带空格有时候会让某些脚本出问题。我习惯装到D:\FreeSWITCH这类不含空格的目录路径越简单越好省得后面写命令还要加引号。第二个是组件选择。MSI安装包会包含核心服务、fs_cli命令行工具、默认配置等组件建议全部勾选一次性到位避免后面要用某个工具时发现没装上。第三个也是最重要的一个安装过程中会创建Windows服务默认情况下这个服务是以LocalSystem账户运行的。如果要让FreeSWITCH访问网络共享目录作为录音存储或者读写某些受限目录就需要改成专门的账户。大多数场景保持默认就能跑。4.2 Windows服务与防火墙的必修课安装完成后FreeSWITCH会作为Windows后台服务自动启动。打开Windows服务管理器能看到一个名为FreeSWITCH的服务项。启动服务的命令方式net start FreeSWITCH停止服务net stop FreeSWITCH注意一个细节如果你在命令行直接启动freeswitch.exe来调试它会占用5060端口这时候Windows服务反而起不来因为端口已经被占了。这两个不要同时跑容易把自己绕晕。防火墙是Windows部署里最容易被坑的地方。默认情况下Windows防火墙会拦截外部进入的UDP 5060端口也就是说你的SIP话机根本注册不上来。装完后必须手动放行打开Windows Defender防火墙点击高级设置。选择入站规则点击新建规则。选择端口协议选UDP端口填5060加上TCP的5060。选择允许连接应用。顺带把8021端口也放行了不然开发机没法通过ESL连接。这三个端口放行之后外部SIP话机、fs_cli远程连接、应用层调用才算通了。4.3 Windows版与其他方式的差异点Windows版本跟Linux版本在功能上的差异是客观存在的。我在实际使用中感受到的几个差异供你参考性能上限不一样。Windows版扛个几十路并发没问题但到了几百路并发的时候Linux版的稳定性和性能优势就会明显拉开。这不是信仰问题是操作系统内核的网络栈和线程调度机制决定的。部分模块不可用或者表现不一致。比如mod_av在Windows上编译支持不完整某些音视频处理行为跟Linux版有细微差别。再比如mod_curl在Windows上处理大文件上传时偶尔会出现内存释放异常这在Linux版上几乎没遇到过。调试体验反而是Windows更好。配置错了、崩溃了直接在Visual Studio里附加进程调试或者用Event Viewer看日志对熟悉Windows开发的朋友来说更顺手。所以Windows部署的合理定位是本地开发调试、单机测试、给周边平台联调用。上生产还是建议回到Linux环境。5. 三条路线的实战对比与选择建议三种部署方式都走了一遍之后我把它们放在一起做一个横向对比。这个对比表是根据我自己在不同场景下的实践总结出来的仅供参考对比维度源码编译Docker容器Windows安装包部署耗时30-60分钟5-10分钟10-20分钟环境要求Linux系统依赖库Docker环境Windows 10/11及以上模块自由度完全可控可裁剪受限于镜像内置受限于MSI提供性能表现最优有少量网络损耗中等受制于Windows系统调试能力可完全掌控日志和进程依赖docker logsVisual Studio可调试版本更新速度源码拉取可追最新镜像发布有延迟发布周期较慢生产环境适用度高中轻量场景可低5.1 不同目标的选型决策线路在动手之前先问自己三个问题。第一个问题你要做的是什么如果是学习FreeSWITCH的模块机制、拨号计划语法、媒体处理流程选Docker最快。三个小时装好环境加上手比编译一下午再学要好得多。Docker环境的快速重建能力能让你放心大胆地做各种破坏性实验。第二个问题这个环境要不要长期跑如果答案是肯定的比如你们公司的客服系统要用它跑业务那源码编译几乎是最优解。不是因为Docker不行而是源码编译环境出问题时你能定位到具体模块、具体依赖、具体编译参数这对长期维护非常重要。第三个问题你有没有其他限制条件比如团队只熟悉Windows维护、项目要求部署在多台Windows服务器上、客户环境不允许安装Docker这些情况下直接选Windows安装包就好不用犹豫。5.2 生产环境使用的几条固守原则不管选了哪种部署方式有几条通用的实践原则是不分方式的。配置必须纳入版本管理。FreeSWITCH的配置核心是XML文件这些文件应该放在git里任何改动都留下记录。我见过太多人直接在服务器上改配置改完忘了改了什么出了问题只能回滚到备份。这种习惯在通信系统上是很危险的因为一个小的拨号计划错误可能会导致整个呼叫链路异常。日志保留策略要提前设计。FreeSWITCH的日志默认会写到log/freeswitch.log长时间不清理会占据大量磁盘。建议用logrotate或者外部日志收集工具把日志定期归档和清理。另外把loglevel调到notice级别比较平衡太详细的信息量巨大太简单的问题排查又不够用。版本升级前先备份配置和数据库。这听起来像废话但真到了升级的时候总会有人跳过这一步。FreeSWITCH升级后配置格式可能会有变化数据库表结构也可能有迁移。备份是你的后悔药没有备份就升级等于裸奔。安全基线要做。修改默认的Event Socket密码acl.conf.xml里不要开放大范围IP段对外暴露的管理端口用防火墙严格限制来源IP。这些虽然不直接属于安装部署的范畴但部署完成后紧接着就是要做这些加固。5.3 运维侧还要想清楚的事部署只是开始不是结束。真正考验部署方式好不好的是上线之后的运维体验。源码编译环境下你升级某个模块的方式是重新编译整个项目或者针对单个模块编译这个过程灵活但耗时。我一般会在服务器上保留完整的源码目录升级时直接拉取最新代码重新编译编译完成后通过make install覆盖安装然后重启服务。这是最平滑的升级路径。Docker环境下的运维优势是版本切换极快。你可以同时拉取两个版本的镜像用不同的容器名跑起来再通过端口区分做对比测试。确认新版本没问题之后切换流量过去就行。这种灰度验证能力在源码编译环境下做起来就麻烦很多。Windows环境下的运维思考维度完全不同。你更多要考虑的是Windows更新导致服务重启、杀毒软件扫描导致进程卡顿、系统补丁和FreeSWITCH兼容性这类问题。如果你有Windows平台运维经验这些都不是大事但如果你是第一次在Windows上跑通信服务建议先压测一下看能不能接受。我最后想说的是部署方式从来不是目的跑起来只是一个起点。真正能体现部署好坏的是你上线三个月后遇到问题时能不能快速定位、快速恢复、快速升级。从这个角度看没有绝对最好的部署方式只有最适合你当前团队、当前环境、当前阶段的那一种。选一种先跑起来把业务跑通后面再优化部署架构这才是一条务实的路线。
返回列表