第六章 部署(Deployment)¶
1. Deployment In Your Network¶
介绍如何将 Asterisk 部署到您的网络中,包括网络拓扑设计、NAT 穿越、端口转发以及与 SIP 代理或 SBC(会话边界控制器)的集成等。
2. Emergency Calling¶
指导如何配置 Asterisk 以支持紧急呼叫功能,确保在拨打紧急号码(如 911)时,系统能够正确路由并传递位置信息。
3. IPv6 Support¶
说明 Asterisk 对 IPv6 的支持情况,包括如何在 chan_pjsip 和 chan_sip 等通道驱动中配置 IPv6 地址绑定。
4. Performance Tuning 性能调优¶
提供性能优化建议,如调整系统参数、优化编解码器选择、配置硬件加速等,以提升 Asterisk 的处理能力和稳定性。
1. 多线程调度模型优化¶
## PJSIP 线程池配置(pjsip.conf)
[system]
type=system
threadpool_initial_size = 20
threadpool_auto_increment = 5
threadpool_idle_timeout = 120
threadpool_max_size = 100
## Stasis 线程池配置(stasis.conf)
[threadpool]
initial_size = 10
idle_timeout_sec = 120
max_size = 60
| PJSIP参数 | 说明 | 建议值 |
|---|---|---|
| initial_size | 启动初始线程数 | ≥ 10(与 UA 数量有关) |
| auto_increment | 扩展线程时的步长 | 5 |
| idle_timeout | 空闲线程回收时间(秒) | 120 |
| max_size | 最大线程池大小(关键) | ≤ 100 |
| Stasis | 涉及模块 |
|---|---|
| 控制总线 | ARI、AMI、AGI、CDR、CEL、ConfBridge 等 |
| 调优建议 | 设置合适最大线程数,避免线程过多导致系统 thrash(资源争用) |
2. PJSIP 协议参数调优¶
## 定时器(pjsip.conf [system])
timer_t1 = 100 ; 请求超时时间(ms)
timer_b = 6400 ; INVITE 事务超时(ms)
## 识别顺序优化(pjsip.conf [global])
endpoint_identifier_order=username,ip,anonymous
# 建议顺序: username → ip → anonymous
# 原因: 注册终端优先使用用户名识别,加快匹配速度
| 参数 | 默认值 | 建议值 | 说明 |
|---|---|---|---|
| timer_t1 | 500ms | 100ms | 与 RTT 最远 UA 保持略高 |
| timer_b | 32000ms | 6400ms | 控制 INVITE 生命周期,避免堆积影响内存 |
3. Sorcery 缓存配置(缓存化数据库配置项)¶
数据库(如 Realtime 配置)读写延迟较高,使用 sorcery.conf 配置缓存,大幅提升性能。
## 示例:sorcery.conf
[res_pjsip]
endpoint/cache=memory_cache,maximum_objects=3000,...
endpoint=realtime,ps_endpoints
aor/cache=memory_cache,maximum_objects=3000,...
aor=realtime,ps_aors
auth/cache=memory_cache,maximum_objects=3000,...
auth=realtime,ps_auths
contact/cache=memory_cache,...
contact=realtime,ps_contacts
| 项目 | 建议最大对象数 |
|---|---|
| endpoints/aors/auth | 终端数量 + 冗余 |
| contacts/identify | 连接频繁,设置合理上限 |
缓存刷新机制
可通过:
- CLI:sorcery memory cache ... 命令
- AMI:SorcerymemoryCache* 系列命令
在数据库更新后主动刷新缓存,确保配置变更即时生效。
4. 模块启用优化建议¶
在非必要场景下关闭高消耗模块(如 CDR、CEL):
5. 总结¶
| 优化区域 | 优先级 | 建议动作 |
|---|---|---|
| PJSIP 线程池 | 高 | 设置合理 max_size,防止线程过多 |
| Stasis 线程池 | 高 | 配合 ARI/AMI 负载调整 |
| Timer 参数 | 中 | 降低堆栈反应延迟,释放事务资源 |
| Endpoint 匹配顺序 | 中 | 优化识别速率 |
| Sorcery 缓存 | 高 | 减少数据库访问开销 |
| 模块加载控制 | 可选 | 视业务情况精简模块 |
5. Asterisk Security Framework¶
概述 Asterisk 的安全框架,包括身份验证、访问控制、加密通信等,帮助管理员构建安全的通信环境。
6. Basic PBX Functionality¶
介绍 Asterisk 作为 PBX 的基本功能,如呼叫转移、语音信箱、自动话务员(IVR)等,以及如何在拨号计划中实现这些功能。
7. Distributed Universal Number Discovery (DUNDi)¶
解释 DUNDi 的工作原理和配置方法,DUNDi 是一种分布式的号码发现协议,可用于在多个 Asterisk 系统之间共享拨号信息。
8. Enhanced Messaging¶
描述 Asterisk 对增强消息功能的支持,包括即时消息(IM)、短信(SMS)等,以及如何与外部消息服务集成。
9. Geolocation¶
指导如何在 Asterisk 中配置地理位置服务,以便在紧急呼叫或其他需要位置信息的场景中提供支持。
10. Important Security Considerations¶
列出部署 Asterisk 时需要注意的重要安全事项,如防止未授权访问、保护敏感数据、定期更新系统等。
11. Internationalization and Localization¶
说明如何对 Asterisk 进行国际化和本地化设置,包括语言包的安装、日期和时间格式的调整等,以适应不同地区的需求。
12. Media Experience Score¶
介绍媒体体验评分机制,用于评估通话质量,并提供优化建议,以提升用户的语音和视频通信体验。
13. PSTN Connectivity¶
讲解如何将 Asterisk 与公共交换电话网络(PSTN)连接,包括使用模拟或数字接口卡、配置中继线路等。
14. Packet Loss Concealment (PLC)¶
描述 Asterisk 中的丢包隐藏技术,用于在网络不稳定时减少语音质量的下降,提升通话的清晰度。
15. Phone Provisioning in Asterisk 电话自动配置¶
提供电话自动配置的指南,包括如何为 SIP 电话设置配置文件、使用 DHCP 选项等,以简化设备部署过程。
Asterisk 提供一个基本的电话自动配置模块 res_phoneprov,用于为特定 SIP 设备(如 Polycom)生成配置文件。
其核心原理为:
- 模板机制:通过模板文件和变量替换生成动态配置。
- 来源数据:主要从 phoneprov.conf 和 users.conf 读取信息。
- 目标用途:支持“一个用户绑定一个设备”的配置(限制性使用场景)。
16. Privacy Configuration¶
指导如何配置 Asterisk 以保护用户隐私,包括匿名呼叫、号码隐藏、加密通信等功能的实现。
17. Reference Use Cases for Asterisk 使用案例¶
1. 背景与用途¶
该文档基于虚构企业 Super Awesome Company (SAC) 构建了一个完整的 Asterisk 典型应用参考场景,涵盖:
- 企业组织架构
- 内外部呼叫设计
- 分机与 DID 号码映射
- 呼叫队列、IVR、语音信箱、会议等 PBX 功能需求
- 网络与 SIP Trunk 接入配置建议
目标读者:希望参考实际场景部署 Asterisk 的系统架构师或管理员。
2. 网络与语音接入设计¶
网络结构
| 内容 | 配置说明 |
|---|---|
| 外部 IP | 203.0.113.1 |
| 内部网络段 | 10.0.0.0/8 |
| NAT 路由设备 | Linksys WRT54G “Old Unreliable” |
| 接入方式 | Metro Ethernet |
SAC 使用 NAT 环境部署 Asterisk,并通过 SIP Trunk 接入 Digium 提供的公网电话服务。
电话接入资源
| 内容 | 数量与范围 |
|---|---|
| DID 号码池 | 256-555-1100 ~ 256-555-1299 |
| 每人分配 DID | 是,直接映射至桌面话机 |
| SIP Trunk | Digium 提供 |
3. Asterisk 功能设计清单¶
| 功能点 | 实现方式说明 |
|---|---|
| 内线短号拨号 | 使用 4 位分机(取自 DID 后四位) |
| 外线通话 | 支持 7 位 / 10 位 / 1+10 位拨号,进行号码规范化 |
| 语音信箱 | 超时或忙线转入;语音转发至邮件 |
| 自动话务员 IVR | 主号码进入;多级菜单引导 |
| 呼叫队列 | 销售 / 客户支持;超过设定等待时间转接接线员 |
| 接线员 | Temple Morgan;统一处理等待过久的客户 |
| 会议室 | 6500(外部+内部)、6000(内部专用) |
| 远程语音信箱 | 通过 256-555-1234 拨入,输入分机+PIN |
4. 分机与组织架构映射¶
每个员工均分配一个:
- DID(10位)
- 内部分机(4位,DID 后四位)
- 桌面话机(Digium D70)
| 姓名 | 内线 | DID | 部门/角色 |
|---|---|---|---|
| Lindsey Freddie | 1107 | 256-555-1107 | 总裁 |
| Penelope Bronte | 1103 | 256-555-1103 | 工程总监 |
| Dusty Williams | 1115 | 256-555-1115 | 客户支持 |
5. IVR 示例配置设计¶
主 IVR 功能
入口:256-555-1100 或 1100
提示语音内容包括:
1 - 销售
2 - 客服
3 - 财务
4 - 公司目录
0 - 接线员
无输入重播两次,仍无响应则挂断。
6. 呼叫队列逻辑¶
销售队列(1200)
| 特性 | 配置值 |
|---|---|
| 组成员 | Terry, Garnet, Franny |
| 策略 | ringall |
| 超时处理 | 5 分钟转接至 Operator |
客服队列(1250)
| 特性 | 配置值 |
|---|---|
| 组成员 | Maria, Dusty, Tommie |
| 策略 | ringall |
| 超时处理 | 20 分钟转接至 Operator |
7. 语音信箱策略¶
- 内部转入语音信箱使用 Busy/Unavailable Greeting 区分状态。
- 语音邮件通过 Asterisk 发送邮件至用户邮箱。
- 内部员工拨打 8000 可直接进入个人语音信箱(免输入分机+PIN)。
- 外部拨打 256-555-1234 访问语音信箱,需输入分机+PIN。
8. 会议系统¶
| 会议室 | 分机 | 用途 |
|---|---|---|
| 公共会议 | 6500 | 员工+客户 |
| 内部会议 | 6000 | 员工内部使用 |
9. 拨号计划建议(Dialplan)¶
## 使用分机匹配规则简化内部拨号:
exten => _11XX,1,Dial(SIP/${EXTEN})
## DID 到分机映射:
exten => _25655511XX,1,Goto(default,${EXTEN:7},1)
## 出站拨号规范化:
# 7 位补区号
# 10 位或 1+10 位原样拨出
10. 具体配置¶
;=============== Global and transport configuration =================
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
; 示例用户:6001,可重复定义 6002 ~ 6015
[6001](endpoint-template)
auth=6001
aors=6001
callerid=User Two <6001>
context=internal
disallow=all
allow=ulaw
[6001]
type=auth
auth_type=userpass
username=6001
password=securepass6001
[6001]
type=aor
max_contacts=1
[general]
static=yes
writeprotect=no
[globals]
OPERATOR=1111
[internal]
; Inbound DID mapping:将 DID 映射到内部 4 位分机
exten => _25655511XX,1,Goto(internal,${EXTEN:7},1)
; 本地 4 位分机拨号逻辑
exten => _11XX,1,Dial(PJSIP/${EXTEN},30)
same => n,Voicemail(${EXTEN},u)
same => n,Hangup()
; 员工内部访问语音信箱
exten => 8000,1,VoiceMailMain(${CALLERID(num)}@default)
same => n,Hangup()
; 外部员工远程访问语音信箱
[default]
exten => 1234,1,Answer()
same => n,VoiceMailMain()
same => n,Hangup()
; 销售队列入口(5 分钟无应答转接至接线员)
exten => 1200,1,Queue(sales,t,,,300)
same => n,Goto(internal,${OPERATOR},1)
; 客户服务队列入口(20 分钟无应答转接至接线员)
exten => 1250,1,Queue(support,t,,,1200)
same => n,Goto(internal,${OPERATOR},1)
; 主 IVR 菜单入口(来自外部主号码或拨 1100)
exten => 1100,1,Answer()
same => n,Set(TIMEOUT(digit)=3)
same => n,Set(TIMEOUT(response)=5)
same => n(start),Background(main-menu)
same => n,WaitExten(5)
same => n,Playback(goodbye)
same => n,Hangup()
; IVR 选项映射
exten => 1,1,Goto(internal,1200,1) ; 销售队列
exten => 2,1,Goto(internal,1250,1) ; 客服队列
exten => 3,1,Dial(PJSIP/1106,30) ; 财务
same => n,Voicemail(1106,u)
exten => 4,1,Directory(default) ; 公司目录
exten => 0,1,Goto(internal,${OPERATOR},1) ; 接线员
; 会议室
exten => 6000,1,ConfBridge(employee_conf)
exten => 6500,1,ConfBridge(public_conf)
[general]
format=wav49|gsm|wav
serveremail=voicemail@example.com
attach=yes
sendvoicemail=yes
emailbody=You have a new voicemail from ${VM_CALLERID}
[default]
1101 => 1234, Maria Berny, maria@example.com
1102 => 1234, Tommie Briar, tommie@example.com
1103 => 1234, Penelope Bronte, penelope@example.com
1104 => 1234, Richard Casey, richard@example.com
1105 => 1234, Garnet Claude, garnet@example.com
1106 => 1234, Aaron Courtney, aaron@example.com
1107 => 1234, Lindsey Freddie, lindsey@example.com
1108 => 1234, Colby Hildred, colby@example.com
1109 => 1234, Terry Jules, terry@example.com
1110 => 1234, Hollis Justy, hollis@example.com
1111 => 1234, Temple Morgan, temple@example.com
1112 => 1234, Franny Ocean, franny@example.com
1113 => 1234, Laverne Roberts, laverne@example.com
1114 => 1234, Sal Smith, sal@example.com
1115 => 1234, Dusty Williams, dusty@example.com
[general]
persistentmembers = yes
[sales]
strategy = ringall
timeout = 15
retry = 5
wrapuptime = 0
maxlen = 0
member => PJSIP/1109 ; Terry Jules
member => PJSIP/1105 ; Garnet Claude
member => PJSIP/1112 ; Franny Ocean
[support]
strategy = ringall
timeout = 15
retry = 5
wrapuptime = 0
maxlen = 0
member => PJSIP/1101 ; Maria Berny
member => PJSIP/1115 ; Dusty Williams
member => PJSIP/1102 ; Tommie Briar
[general]
; 默认桥接参数,所有会议室共用
; 无需特殊配置
[default_user]
type=user
dtmf_passthrough=yes
announce_user_count=yes
wait_marked=yes
end_marked=yes
mute=no
[sample_user_menu]
type=menu
*=playback_and_continue(conf-usermenu)
1=toggle_mute
4=decrease_listening_volume
6=increase_listening_volume
7=decrease_talking_volume
9=increase_talking_volume
[default_bridge]
type=bridge
video_mode=sfu
record_conference=no
# 使用 video_mode=sfu 以支持 WebRTC 视频会议(特别是 CMP2K 案例)
# sample_user_menu 可在会议中控制音量、静音等功能
[general]
parkext => 700
parkpos => 701-720
context => parkedcalls
courtesytone = beep
xfersound = beep
xferfailsound = beeperr
[featuremap]
blindxfer => #1
attendedxfer => #2
automon => *1
disconnect => *0
[applicationmap]
; 自定义功能键绑定(可选)
## 启用通话中的快速按键操作,如:
; #1:盲转
; #2:咨询转接
; *1:单通自动录音
; *0:强制挂机
[modules]
autoload=yes ; 启用自动模块加载
; 优先预加载所需函数(避免 res_phoneprov 等模块依赖失败)
; 保证关键模块优先加载,防止依赖失败
preload = func_strings.so
preload = res_odbc.so
preload = res_http_websocket.so
preload = res_pjsip.so
preload = res_pjsip_endpoint_identifier_ip.so
; 禁用不使用的模块(可选)
; 可禁用未使用协议通道以节省资源
noload = chan_oss.so
noload = chan_skinny.so
noload = chan_mgcp.so
; 按需加载增强模块
; load 可明确启用某些核心应用(尤其是会议、WebRTC)
load = app_confbridge.so
load = res_parking.so
load = res_rtp_asterisk.so
load = res_pjsip_registrar.so
18. STIR/SHAKEN¶
解释 STIR/SHAKEN 框架的概念和在 Asterisk 中的实现,用于防止来电号码欺骗,确保呼叫者身份的真实性。
19. Secure Calling¶
介绍如何在 Asterisk 中实现安全通话,包括使用 TLS 和 SRTP 加密协议,保护语音通信的机密性和完整性。
20. Troubleshooting¶
提供故障排除指南,帮助管理员诊断和解决常见的 Asterisk 问题,如通话质量差、注册失败、呼叫无法建立等。