从事通讯系统搭建多年,我见证过太多企业在外呼系统选型上的纠结。传统外呼方案通常面临三大痛点:一是硬件设备采购成本高,二是扩容灵活性差,三是功能定制化难度大。而基于FreeSWITCH的软件解决方案,恰好能完美解决这些问题。
FreeSWITCH作为开源的通讯平台,其模块化设计允许我们像搭积木一样构建外呼系统。在教培、房产、金融等行业中,我们通常需要实现以下核心功能:
选择CentOS/Debian作为部署系统,主要基于以下考量:
在开始安装前,必须对操作系统进行针对性优化。许多部署失败案例,究其根源都是基础环境配置不当。
bash复制# 关闭SELinux(通讯类服务常见需求)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
注意:生产环境如需保持SELinux开启,需额外配置freeswitch.te策略模块,这对运维复杂度要求较高。建议测试环境先禁用以便快速验证。
时区同步看似简单,却直接影响通话记录的时序准确性:
bash复制timedatectl set-timezone Asia/Shanghai
hwclock --systohc
文件句柄数优化是高并发外呼的必备配置:
bash复制echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
echo "fs_cli soft nofile 65535" >> /etc/security/limits.conf
sysctl -w fs.file-max=2097152
在/etc/sysctl.conf中添加以下参数:
conf复制net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.ip_local_port_range = 10000 65000
vm.swappiness = 10
执行sysctl -p使配置生效。这些调整将显著提升SIP信令处理能力,实测可支持单服务器500+并发呼叫。
对于CentOS 7/8系统,建议先配置EPEL源:
bash复制yum install -y epel-release
yum-config-manager --enable PowerTools
核心开发工具链安装:
bash复制yum groupinstall -y "Development Tools"
yum install -y autoconf automake libtool rpm-build
音频处理关键库:
bash复制yum install -y libsndfile-devel speex-devel opus-devel libogg-devel
数据库连接支持:
bash复制yum install -y unixODBC-devel postgresql-devel mysql-connector-odbc
某些核心组件必须通过源码编译才能获得最佳兼容性:
SpandSP编译(必须使用指定版本)
bash复制wget https://github.com/freeswitch/spandsp/archive/0d2e6ac65e0e8f53d652665a743015a88bf048d4.tar.gz
tar zxvf 0d2e6ac65e0e8f53d652665a743015a88bf048d4.tar.gz
cd spandsp-0d2e6ac
./bootstrap.sh && ./configure && make && make install
Sofia-SIP协议栈安装
bash复制wget https://github.com/freeswitch/sofia-sip/archive/refs/tags/v1.13.17.tar.gz
tar zxvf v1.13.17.tar.gz
cd sofia-sip-1.13.17
./bootstrap.sh && ./configure && make && make install
推荐使用1.10.7稳定版:
bash复制wget https://files.freeswitch.org/freeswitch-releases/freeswitch-1.10.7.-release.tar.gz
tar zxvf freeswitch-1.10.7.-release.tar.gz
cd freeswitch-1.10.7.-release
配置编译选项(外呼系统专用):
bash复制./configure \
--enable-core-odbc-support \
--enable-core-pgsql-support \
--enable-zrtp \
--enable-portable-binary \
--prefix=/usr/local/freeswitch \
--with-lws=no
启用多核编译加速:
bash复制make -j $(nproc)
安装时建议先检查依赖完整性:
bash复制make current
make install
语音文件安装(按需):
bash复制make sounds-install moh-install
编辑/usr/local/freeswitch/conf/autoload_configs/event_socket.conf.xml:
xml复制<param name="listen-ip" value="0.0.0.0"/>
<param name="listen-port" value="8021"/>
<param name="password" value="ClueCon"/>
<param name="apply-inbound-acl" value="freeswitch_acl"/>
在acl.conf.xml中配置业务服务器白名单:
xml复制<list name="freeswitch_acl" default="deny">
<node type="allow" cidr="192.168.1.0/24"/>
<node type="allow" cidr="10.0.0.0/8"/>
</list>
修改vars.xml关键参数:
xml复制<X-PRE-PROCESS cmd="set" data="default_password=1234"/>
<X-PRE-PROCESS cmd="set" data="external_rtp_ip=$${local_ip_v4}"/>
<X-PRE-PROCESS cmd="set" data="external_sip_ip=$${local_ip_v4}"/>
安装MySQL ODBC驱动:
bash复制yum install -y mysql-connector-odbc
配置/etc/odbc.ini:
ini复制[freeswitch]
Driver = MySQL
SERVER = 127.0.0.1
PORT = 3306
USER = fs_user
PASSWORD = fs_pass
DATABASE = freeswitch
OPTION = 3
建议至少包含以下表:
sql复制CREATE TABLE calls (
call_uuid VARCHAR(255) PRIMARY KEY,
caller_id_number VARCHAR(50),
destination_number VARCHAR(50),
start_stamp DATETIME,
end_stamp DATETIME,
duration INT,
recording_path VARCHAR(255)
);
CREATE TABLE customer_data (
phone_number VARCHAR(50) PRIMARY KEY,
name VARCHAR(100),
last_call_time DATETIME,
call_count INT DEFAULT 0
);
Systemd服务配置示例:
ini复制[Unit]
Description=FreeSWITCH
After=syslog.target network.target
[Service]
Type=forking
PIDFile=/usr/local/freeswitch/run/freeswitch.pid
ExecStart=/usr/local/freeswitch/bin/freeswitch -nc
ExecReload=/usr/local/freeswitch/bin/freeswitch -nc reload
TimeoutSec=45s
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
关键日志路径:
常用grep命令:
bash复制# 查找呼叫失败记录
grep "CALL_FAILED" /usr/local/freeswitch/log/freeswitch.log
# 统计各状态码出现次数
grep -oP "SIP/2.0 \K\d{3}" /usr/local/freeswitch/log/sip.log | sort | uniq -c
使用sipp进行压力测试:
bash复制sipp -sf uac.xml 192.168.1.100 -i 192.168.1.200 -p 5065 -m 500 -l 100 -r 10
测试参数建议:
常见瓶颈点及解决方案:
| 瓶颈类型 | 症状表现 | 解决方案 |
|---|---|---|
| CPU瓶颈 | 高负载时呼叫建立延迟 | 启用opus编码、减少DSP处理 |
| 内存瓶颈 | 频繁OOM崩溃 | 调整session-per-second限制 |
| 网络瓶颈 | 语音卡顿、丢包 | 优化QoS策略、增加带宽 |
| 磁盘IO瓶颈 | 录音文件写入延迟 | 使用SSD、独立录音存储 |
必做安全配置:
bash复制# 仅允许指定IP访问管理端口
iptables -A INPUT -p tcp --dport 8021 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 8021 -j DROP
# SIP端口访问控制
iptables -A INPUT -p udp --dport 5060 -s 192.168.1.0/24 -j ACCEPT
对于大型外呼中心,建议采用分层架构:
code复制 +-----------------+
| 负载均衡层 |
| (Kamailio/OpenSIPS) |
+--------+--------+
|
+-----------------------+-----------------------+
| | |
+---------v---------+ +---------v---------+ +---------v---------+
| FreeSWITCH节点1 | | FreeSWITCH节点2 | | FreeSWITCH节点N |
| 呼叫处理+媒体服务 | | 呼叫处理+媒体服务 | | 呼叫处理+媒体服务 |
+-------------------+ +-------------------+ +-------------------+
| | |
+---------v---------+ +---------v---------+ +---------v---------+
| 数据库集群 | | 存储集群 | | 监控系统 |
| (MySQL Galera) | | (GlusterFS) | | (Prometheus+Grafana)|
+-------------------+ +-------------------+ +-------------------+
关键设计要点:
在实际部署中,我们发现采用Docker容器化部署可以大幅提升部署效率。以下是通过Docker Compose快速部署的开发测试环境示例:
yaml复制version: '3'
services:
freeswitch:
image: freeswitch/freeswitch:1.10.7
ports:
- "5060:5060/tcp"
- "5060:5060/udp"
- "5080:5080/tcp"
- "5080:5080/udp"
- "8021:8021/tcp"
volumes:
- ./conf:/etc/freeswitch
- ./recordings:/var/lib/freeswitch/recordings
environment:
- SIP_PORT=5060
- EVENT_SOCKET_PORT=8021
ulimits:
nofile: 65535:65535
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: freeswitch
MYSQL_DATABASE: freeswitch
MYSQL_USER: freeswitch
MYSQL_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
这个方案特别适合需要快速搭建演示环境或开发测试的场景。对于生产环境,建议在容器编排基础上加入:
在教培行业的外呼实践中,我们通过这套方案将外呼效率提升了3倍,同时将系统运维成本降低了60%。一个典型的成功案例是某在线教育机构,部署后实现了: