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 OpenSSL | libssl-dev | sudo apt install libssl-dev |
Could NOT find SRTP | libsrtp2-dev | sudo apt install libsrtp2-dev |
Could NOT find SQLite3 | libsqlite3-dev | sudo apt install libsqlite3-dev |
Boost not found | libboost-all-dev | sudo 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 ldconfigldconfig这一步别省,它刷新动态链接库缓存,不执行的话运行时会提示找不到.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=10reg-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 的配置难点不在于单个参数有多复杂,而在于参数之间的关联和版本差异。把配置文件的结构理解透,知道每个模块负责什么,排查问题时就能快速定位到对应的段。另外,日志是你最好的朋友,遇到问题先看日志,比盲目改配置高效得多。最后再分享一个小技巧:把每次改动的配置和对应的现象记下来,形成自己的排查笔记,下次遇到类似问题能省很多时间。