ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Ubuntu 18.04.4 LTS 下 Flexisip 编译安装与配置填坑实录

Ubuntu 18.04.4 LTS 下 Flexisip 编译安装与配置填坑实录

1. 为什么要在 Ubuntu 18.04.4 LTS 上折腾 Flexisip

先把背景交代清楚。Flexisip 是 Linphone 生态里的服务端组件,干的活儿包括 SIP 代理、注册服务器、推送网关、会议服务器等。如果你要做一套自建的实时通信系统,客户端用 Linphone,服务端基本绕不开 Flexisip。它不像某些开箱即用的商业方案那样点几下就完事,配置项散落在多个配置文件里,版本之间还有差异,所以"填坑"这个词用得非常准确。

我这次的环境是 Ubuntu 18.04.4 LTS,选这个版本不是因为它新,恰恰是因为它"旧得刚好"——系统自带的依赖库版本和 Flexisip 的编译要求比较匹配,能省掉一堆手动编译依赖的麻烦。但即便如此,从安装到跑通,我还是踩了不少坑,这篇就把整个过程和配置细节完整记录下来。

这篇文章适合谁看?如果你正在自建 SIP 通信服务,或者想用 Linphone 搭一套内部通话系统,又或者你已经在装 Flexisip 但卡在某个配置报错上,那这篇内容应该能帮到你。我会从依赖安装讲到配置文件逐项拆解,再到实际验证和排错,尽量做到照着做就能跑起来。

需要提前说明的是,Flexisip 的版本迭代比较快,不同版本配置文件的结构和参数名会有出入。我下面讲的是基于当时稳定版本的实践,你在操作时如果发现参数对不上,先确认版本号,再对照官方仓库的变更记录,不要硬套。

2. 安装前的环境准备与依赖梳理

2.1 系统基础环境确认

Ubuntu 18.04.4 LTS 是 18.04 系列的一个点版本,内核和基础库都比较稳定。装 Flexisip 之前,先做几件基础的事。

第一,更新软件源并升级已有包。这一步不是走形式,因为 Flexisip 依赖的一些库如果版本太旧,编译时会直接报错。

sudo apt update sudo apt upgrade -y

第二,确认系统架构。Flexisip 在 x86_64 上支持最好,如果你用的是 ARM 平台,编译参数和依赖会有差异。

uname -m

第三,检查磁盘空间。Flexisip 本身不大,但编译过程中产生的中间文件和依赖包会占不少空间,建议根分区至少留 10GB 以上。

df -h /

提示:如果你是在虚拟机里操作,建议先打一个快照。配置过程中改动的文件比较多,出问题回滚比逐个排查快得多。

2.2 依赖包安装的取舍逻辑

Flexisip 的依赖分两类:编译期依赖和运行期依赖。很多人图省事直接装一堆,结果版本冲突反而更难排查。我的做法是按需安装,先装核心的,编译报错缺什么再补什么。

核心依赖包括:

  • CMake:构建工具,Flexisip 用 CMake 管理编译流程
  • C++ 编译器:g++ 或 clang++,建议用系统自带的 g++
  • pkg-config:帮助 CMake 找到各个库的位置
  • libssl-dev:TLS 支持,SIP over TLS 必须
  • libsrtp2-dev:SRTP 加密媒体流
  • libavcodec-dev / libavutil-dev:媒体处理相关
  • libsqlite3-dev:本地数据库支持
  • libboost-dev:Boost 库,Flexisip 大量使用

安装命令:

sudo apt install -y cmake g++ pkg-config libssl-dev libsrtp2-dev \ libavcodec-dev libavutil-dev libsqlite3-dev libboost-all-dev

这里有个坑:libboost-all-dev装的东西很多,编译时间长。如果你明确知道只需要某几个 Boost 组件,可以只装对应的包,比如libboost-system-dev、libboost-thread-dev。但第一次装的话,全装省心。

还有一个容易忽略的依赖是liblinphone-dev。Flexisip 和 Linphone 共享一些底层库,如果系统里没有,编译时会提示找不到某些头文件。这个包在 Ubuntu 18.04 的默认源里可能没有,需要从 Linphone 的官方仓库获取。

2.3 获取源码的正确姿势

Flexisip 的源码托管在官方 Git 仓库。克隆的时候注意两点:一是用--recursive拉取子模块,二是选对分支。

git clone --recursive https://gitlab.linphone.org/BC/public/flexisip.git cd flexisip git submodule update --init --recursive

如果你网络环境拉取子模块比较慢,可以分步来,先克隆主仓库,再单独初始化子模块。子模块里主要是 mediastreamer2 等依赖,缺了编译不过。

注意:不要直接下载 zip 包解压,那样拿不到子模块内容,编译时会在 CMake 配置阶段就失败。

3. 编译与安装过程中的关键细节

3.1 CMake 配置参数怎么选

进入源码目录后,先建一个独立的构建目录,保持源码目录干净,方便出问题重新来。

mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release

几个关键参数说明:

  • CMAKE_INSTALL_PREFIX:安装路径,默认/usr/local,这样不会和系统包管理器冲突
  • CMAKE_BUILD_TYPE:Release 会开优化,Debug 方便排查问题但体积大、速度慢
  • -DENABLE_PUSH_NOTIFICATION=ON:如果需要推送功能就打开,不需要可以关掉减少依赖

CMake 配置阶段如果报错,大概率是某个依赖没找到。仔细看报错信息里提到的库名,回去补装对应的-dev包即可。常见的报错和对应解决方式我整理了一下:

报错关键词缺失的包解决方式
Could NOT find OpenSSLlibssl-devsudo apt install libssl-dev
Could NOT find SRTPlibsrtp2-devsudo apt install libsrtp2-dev
Could NOT find SQLite3libsqlite3-devsudo apt install libsqlite3-dev
Boost not foundlibboost-all-devsudo apt install libboost-all-dev
mediastreamer2 not found子模块未拉取git submodule update --init --recursive

3.2 编译阶段的资源控制

配置通过后开始编译:

make -j$(nproc)

-j$(nproc)是用满所有 CPU 核心并行编译,速度快但吃内存。如果你的机器内存小于 4GB,建议把并行数降下来,比如make -j2,否则可能因为内存不足被系统杀掉进程,报错信息还很不直观。

编译时间取决于机器性能,一般十几分钟到半小时不等。编译过程中如果出现某个源文件报错,先看是不是 C++ 标准的问题。Flexisip 对 C++ 标准有要求,Ubuntu 18.04 自带的 g++ 版本一般是够的,但如果报error: 'xxx' is not a member of 'std'这类错,可能是标准没设对,可以在 CMake 里加-DCMAKE_CXX_STANDARD=14。

编译完成后安装:

sudo make install sudo ldconfig

ldconfig这一步别省,它刷新动态链接库缓存,不执行的话运行时会提示找不到.so文件。

3.3 安装后的目录结构确认

安装完成后,几个关键路径需要确认:

  • 可执行文件:/usr/local/bin/flexisip
  • 配置文件:/usr/local/etc/flexisip/
  • 库文件:/usr/local/lib/
which flexisip ls /usr/local/etc/flexisip/

如果which flexisip找不到,说明/usr/local/bin不在 PATH 里,手动加一下或者用绝对路径调用。

4. 配置文件逐项拆解与填坑实录

4.1 配置文件整体结构

Flexisip 的配置目录下通常有这几个文件:

  • flexisip.conf:主配置文件
  • flexisip.conf.sample:示例配置,参考用
  • module::*相关配置:各模块的独立配置

主配置文件采用类似 INI 的格式,分模块组织。理解这个结构很重要,因为很多参数是挂在特定模块下的,放错位置就不生效。

4.2 全局配置段的坑

全局段主要设置监听地址、传输协议、日志级别等。

[global] transports=sip:*:5060;transport=udp transports=sips:*:5061;transport=tls log-level=info

这里第一个坑是transports 的写法。多个传输方式要写成多行,每行一个transports=,不能写在一行用逗号分隔。我一开始图省事写成一行,结果只生效了最后一个,排查了半天。

第二个坑是端口冲突。5060 是 SIP 标准端口,如果系统里已经有其他 SIP 服务在跑,会绑定失败。用netstat -tulnp | grep 5060确认端口占用情况。

第三个坑是TLS 证书路径。如果启用了sips,必须配置证书:

[tls] certificate=/usr/local/etc/flexisip/certs/server.crt certificate-key=/usr/local/etc/flexisip/certs/server.key

证书文件权限要注意,私钥文件不能让所有用户可读,否则 Flexisip 启动时会拒绝加载。

4.3 注册模块配置要点

注册模块负责处理客户端的注册请求,是 SIP 服务的基础。

[module::Registrar] enabled=true reg-domains=example.com max-contacts-by-aor=10

reg-domains是注册域名,客户端注册时用的域名必须和这里匹配,否则会被拒绝。这个域名不一定是真实可解析的,但客户端配置里填的必须一致。

max-contacts-by-aor限制同一个账号最多能注册多少个终端。默认值可能偏小,如果你有多个设备同时在线,需要调大。

实操心得:调试注册问题时,把日志级别临时调到debug,能看到完整的注册请求和响应内容,比猜快得多。调完记得改回info,不然日志文件涨得飞快。

4.4 代理模块与路由规则

代理模块负责转发 SIP 请求,路由规则决定了请求往哪里走。

[module::Forward] enabled=true [module::Router] enabled=true

路由配置里最容易出问题的是域名解析。如果目标域名无法解析,请求会直接失败。可以在/etc/hosts里加静态映射做测试,避免依赖 DNS。

另一个坑是NAT 环境下的地址处理。如果服务端在 NAT 后面,SIP 消息里的地址需要做转换,否则客户端收到的地址不可达。相关配置在[module::NatHelper]段,需要根据实际网络环境调整。

4.5 推送网关配置的注意事项

如果需要给移动端做推送,推送模块的配置不能少。这部分涉及的参数比较多,而且和具体的推送服务相关。

[module::PushNotification] enabled=true

推送配置的核心是超时时间和重试策略。超时太短会导致推送还没到就判定失败,太长又会拖慢整体响应。一般建议超时设在 10 到 30 秒之间,根据实际网络质量调整。

5. 启动验证与常见问题排查

5.1 启动方式与日志查看

前台启动方便看日志:

flexisip --verbose

后台启动:

flexisip -d

日志默认输出到 syslog,也可以配置输出到文件。排查问题时,前台启动加--verbose是最直接的方式。

5.2 常见问题速查表

现象可能原因排查方向
启动即退出配置文件语法错误检查 conf 文件括号、等号
端口绑定失败端口被占用netstat查占用进程
客户端注册失败域名不匹配核对 reg-domains 和客户端配置
通话无声音媒体端口未开放检查防火墙和 RTP 端口范围
TLS 握手失败证书问题检查证书路径和权限
编译报错找不到库依赖缺失按报错补装对应 dev 包

5.3 几个我踩过的具体坑

坑一:配置文件改了不生效。Flexisip 启动时读取配置,运行中修改不会热加载。改完必须重启服务。我一度以为改了没用,其实是没重启。

坑二:日志级别设太高导致性能下降。debug级别会记录大量信息,生产环境千万别开。测试完记得改回去。

坑三:防火墙没放行 RTP 端口。SIP 信令走 5060/5061,但媒体流走的是另一段端口范围。只放行 SIP 端口,通话能建立但没声音。RTP 端口范围在配置里可以指定,记得同步放行。

坑四:时间不同步导致注册失败。SIP 协议对时间敏感,服务器和客户端时间差太大,注册会被拒绝。用timedatectl确认时间同步状态。

坑五:SELinux 或 AppArmor 拦截。Ubuntu 默认 AppArmor 可能对 Flexisip 的网络操作有限制,检查/var/log/syslog里有没有相关拒绝记录。

6. 配置优化与后续扩展思路

6.1 性能相关的几个调优点

跑通之后如果要做压力测试或者上生产,有几个参数值得调:

  • 线程池大小:根据 CPU 核心数调整,不是越大越好
  • 连接超时:默认值偏保守,可以适当缩短加快失败检测
  • 日志缓冲:高并发下日志写入可能成为瓶颈,考虑异步日志

6.2 多模块组合的配置思路

Flexisip 的模块可以按需组合。比如只做注册服务器,就只开 Registrar 模块;要做完整代理,就 Registrar + Forward + Router 一起开。模块之间的依赖关系要理清楚,开了 Router 但没开 Forward,路由规则可能不生效。

6.3 版本升级时的配置迁移

Flexisip 升级时配置文件格式可能变化。升级前先备份现有配置,升级后对照新版本的示例配置逐项核对。不要直接覆盖,也不要假设旧配置完全兼容。

我在实际使用中的体会是,Flexisip 的配置难点不在于单个参数有多复杂,而在于参数之间的关联和版本差异。把配置文件的结构理解透,知道每个模块负责什么,排查问题时就能快速定位到对应的段。另外,日志是你最好的朋友,遇到问题先看日志,比盲目改配置高效得多。最后再分享一个小技巧:把每次改动的配置和对应的现象记下来,形成自己的排查笔记,下次遇到类似问题能省很多时间。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进