器:從系統(tǒng)調(diào)優(yōu)到核心配置實(shí)戰(zhàn))
1. 項(xiàng)目概述為什么要在CentOS 7上搭建Asterisk SIP服務(wù)器最近在折騰一個(gè)內(nèi)部通訊系統(tǒng)需要一套穩(wěn)定、可控且功能強(qiáng)大的語(yǔ)音通信核心。市面上成熟的商業(yè)方案要么太貴要么不夠靈活于是把目光投向了開源領(lǐng)域的“老炮兒”——Asterisk。它就像一個(gè)功能齊全的樂(lè)高積木盒PBX、VoIP網(wǎng)關(guān)、會(huì)議服務(wù)器……你能想到的語(yǔ)音通信功能它幾乎都能通過(guò)模塊化的方式拼裝出來(lái)。而SIP協(xié)議作為現(xiàn)代IP語(yǔ)音通信的“普通話”是連接各種軟電話、硬話機(jī)、網(wǎng)關(guān)的通用語(yǔ)言。在CentOS 7這個(gè)以穩(wěn)定著稱的Linux發(fā)行版上部署Asterisk目標(biāo)就是搭建一個(gè)屬于我們自己的、高度定制化的SIP通信服務(wù)器。這個(gè)組合聽起來(lái)有點(diǎn)“復(fù)古”畢竟CentOS 7已經(jīng)停止維護(hù)而Asterisk的版本也在不斷迭代。但恰恰是這種“經(jīng)典”搭配在特定的生產(chǎn)環(huán)境中依然有其不可替代的價(jià)值。比如一些對(duì)穩(wěn)定性要求極高、應(yīng)用場(chǎng)景固定、且不希望頻繁升級(jí)底層系統(tǒng)的企業(yè)內(nèi)網(wǎng)環(huán)境。CentOS 7的生命周期支持雖然結(jié)束但其極致的穩(wěn)定性和海量的歷史文檔、社區(qū)支持對(duì)于搭建一個(gè)“部署后就不想再動(dòng)”的核心服務(wù)來(lái)說(shuō)依然有吸引力。當(dāng)然我們必須清醒地認(rèn)識(shí)到這意味著我們需要自己承擔(dān)更多的安全維護(hù)責(zé)任比如手動(dòng)更新關(guān)鍵組件。整個(gè)部署過(guò)程遠(yuǎn)不止是運(yùn)行幾條yum install命令那么簡(jiǎn)單。它涉及到系統(tǒng)環(huán)境的精細(xì)調(diào)優(yōu)、依賴庫(kù)的完整構(gòu)建、Asterisk源碼編譯的選項(xiàng)權(quán)衡、以及最關(guān)鍵的SIP基礎(chǔ)配置。任何一個(gè)環(huán)節(jié)的疏漏都可能導(dǎo)致服務(wù)器“無(wú)聲”啟動(dòng)或者出現(xiàn)各種詭異的單通、雜音、注冊(cè)失敗問(wèn)題。接下來(lái)我就把這次從零開始在CentOS 7上“啃”下Asterisk SIP服務(wù)器的完整過(guò)程、踩過(guò)的坑和總結(jié)的經(jīng)驗(yàn)毫無(wú)保留地分享出來(lái)。2. 部署前的核心準(zhǔn)備與系統(tǒng)調(diào)優(yōu)在動(dòng)手安裝任何軟件之前打好系統(tǒng)基礎(chǔ)是避免后續(xù)無(wú)數(shù)詭異問(wèn)題的關(guān)鍵。對(duì)于Asterisk這樣一個(gè)深度依賴系統(tǒng)音頻架構(gòu)和網(wǎng)絡(luò)性能的服務(wù)準(zhǔn)備工作尤為重要。2.1 系統(tǒng)環(huán)境檢查與基礎(chǔ)依賴安裝首先我們需要一個(gè)干凈的、最小化安裝的CentOS 7系統(tǒng)。最小化安裝能減少不必要的服務(wù)和端口開放提升安全性。登錄系統(tǒng)后第一件事是確認(rèn)系統(tǒng)版本和架構(gòu)cat /etc/redhat-release uname -m輸出應(yīng)該是類似“CentOS Linux release 7.9.2009 (Core)”和“x86_64”。接下來(lái)更新系統(tǒng)到最新狀態(tài)并安裝編譯Asterisk所必需的基礎(chǔ)工具鏈和庫(kù)。這里有個(gè)關(guān)鍵點(diǎn)CentOS 7默認(rèn)的yum源可能已經(jīng)失效或速度很慢我們首先將其替換為阿里云的鏡像源。# 備份原yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 下載阿里云CentOS 7的yum源配置文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 清理并重建緩存 yum clean all yum makecache現(xiàn)在安裝開發(fā)工具組和關(guān)鍵依賴yum groupinstall -y Development Tools yum install -y epel-release yum install -y wget vim net-tools ncurses-devel openssl-devel libedit-devel libxml2-devel sqlite-devel libuuid-devel jansson-devel libcurl-devel pkgconfig注意epel-release是Extra Packages for Enterprise Linux的倉(cāng)庫(kù)提供了許多CentOS官方源中沒(méi)有的軟件包比如后面會(huì)用到的jansson一個(gè)C語(yǔ)言JSON庫(kù)它對(duì)Asterisk的某些模塊如ARI很重要。務(wù)必先安裝它。2.2 音頻驅(qū)動(dòng)與內(nèi)核頭文件處理Asterisk需要與系統(tǒng)的音頻子系統(tǒng)交互。在Linux上這通常通過(guò)ALSA高級(jí)Linux聲音架構(gòu)或OSS開放聲音系統(tǒng)驅(qū)動(dòng)。CentOS 7默認(rèn)可能沒(méi)有安裝ALSA的開發(fā)包。yum install -y alsa-lib-devel然而對(duì)于純粹的SIP服務(wù)器只處理數(shù)字音頻流不涉及本地聲卡播放/錄音ALSA并非強(qiáng)制依賴。但安裝上可以避免編譯時(shí)的警告并為未來(lái)可能的本地音頻需求如播放提示音文件進(jìn)行測(cè)試做好準(zhǔn)備。另一個(gè)重中之重是內(nèi)核頭文件。Asterisk的某些功能如chan_dahdi數(shù)字電話接口驅(qū)動(dòng)在編譯時(shí)需要內(nèi)核頭文件來(lái)構(gòu)建內(nèi)核模塊。yum install -y kernel-devel-$(uname -r)請(qǐng)務(wù)必確保$(uname -r)替換后的內(nèi)核版本與你當(dāng)前運(yùn)行的內(nèi)核完全一致。你可以通過(guò)uname -r單獨(dú)查看再執(zhí)行yum install -y kernel-devel-你的內(nèi)核版本。如果不匹配編譯chan_dahdi時(shí)會(huì)失敗。2.3 防火墻與SELinux策略調(diào)整CentOS 7默認(rèn)使用firewalld作為防火墻并開啟了SELinux。這兩者對(duì)于新手來(lái)說(shuō)是最大的“攔路虎”。我們的策略是在學(xué)習(xí)和測(cè)試階段可以先適當(dāng)放行但必須理解每一步在做什么。防火墻設(shè)置SIP默認(rèn)使用UDP 5060端口進(jìn)行信令傳輸RTP實(shí)時(shí)傳輸協(xié)議則使用一系列高端口如10000-20000傳輸音頻流。我們開放這些端口# 開放SIP信令端口 firewall-cmd --permanent --add-port5060/udp # 開放RTP音頻端口范圍這是一個(gè)示例可根據(jù)需要調(diào)整 firewall-cmd --permanent --add-port10000-20000/udp # 開放Asterisk的AMI管理接口端口可選用于外部管理 firewall-cmd --permanent --add-port5038/tcp # 重新加載防火墻配置 firewall-cmd --reload # 查看已開放端口 firewall-cmd --list-allSELinux策略SELinux會(huì)嚴(yán)格限制進(jìn)程對(duì)文件、端口的訪問(wèn)。對(duì)于Asterisk我們可以先將其設(shè)置為寬容模式以便快速排除是否因SELinux導(dǎo)致的問(wèn)題。# 臨時(shí)設(shè)置為寬容模式重啟后失效 setenforce 0 # 永久禁用編輯配置文件將SELINUXenforcing改為SELINUXdisabled vim /etc/selinux/config重要心得在生產(chǎn)環(huán)境中不建議直接禁用SELinux。更佳實(shí)踐是在測(cè)試環(huán)境將SELinux設(shè)為寬容模式(setenforce 0)讓Asterisk正常運(yùn)行。然后通過(guò)audit2allow工具分析SELinux的審計(jì)日志(/var/log/audit/audit.log)生成自定義策略模塊只授予Asterisk所需的最小權(quán)限。這是一項(xiàng)進(jìn)階技能但對(duì)于構(gòu)建安全的生產(chǎn)系統(tǒng)至關(guān)重要。3. Asterisk源碼編譯安裝詳解為什么不直接用yum install asterisk因?yàn)镃entOS 7官方倉(cāng)庫(kù)中的Asterisk版本通常非常老舊可能缺少許多新功能和重要的安全補(bǔ)丁。從源碼編譯允許我們獲取最新版本并精細(xì)控制需要編譯的模塊讓系統(tǒng)更精簡(jiǎn)、高效。3.1 下載與解壓最新穩(wěn)定版源碼訪問(wèn)Asterisk官網(wǎng)的下載頁(yè)面找到最新穩(wěn)定版如當(dāng)前是18.x或20.x LTS版本的源碼包鏈接。我們使用wget下載到服務(wù)器。cd /usr/src/ # 以Asterisk 20.0.0為例請(qǐng)?zhí)鎿Q為實(shí)際找到的最新穩(wěn)定版鏈接 wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz # 解壓 tar -zxvf asterisk-20-current.tar.gz cd asterisk-20.*3.2 依賴檢查與Menuselect配置Asterisk提供了一個(gè)強(qiáng)大的配置腳本configure和交互式菜單選擇工具menuselect。# 運(yùn)行configure腳本檢查系統(tǒng)依賴 ./configure這個(gè)腳本會(huì)花一兩分鐘檢查系統(tǒng)是否具備編譯所需的各種庫(kù)和頭文件。如果看到大量“未找到”not found的警告不要慌這很正常。腳本會(huì)生成一個(gè)詳細(xì)的報(bào)告。我們需要根據(jù)報(bào)告安裝缺失的依賴。常見(jiàn)的可能需要額外安裝的包有l(wèi)ibedit-devel用于Asterisk CLI的交互式編輯。sqlite-develSQLite數(shù)據(jù)庫(kù)支持用于CDR通話詳單等。libxml2-develXML支持用于某些配置文件的解析。openssl-develTLS加密支持用于安全SIPSIPS和SRTP。jansson-develJSON解析用于RESTful APIARI。根據(jù)./configure的輸出提示用yum install補(bǔ)全它們?nèi)缓笤俅芜\(yùn)行./configure直到關(guān)鍵依賴都顯示為“找到”found。接下來(lái)是核心環(huán)節(jié)——模塊選擇make menuselect你會(huì)進(jìn)入一個(gè)基于ncurses的文本菜單界面。這里的選擇決定了最終Asterisk包含哪些功能直接影響二進(jìn)制文件的大小和復(fù)雜度。核心選擇Core Sound Packages確保Core Sound Packages中的GSM、G.711 ulaw/alaw被選中。這是北美和中國(guó)常用的基礎(chǔ)語(yǔ)音編解碼必須要有。通道驅(qū)動(dòng)Channel Drivers對(duì)于純SIP服務(wù)器我們主要需要chan_sip傳統(tǒng)的SIP通道驅(qū)動(dòng)和/或chan_pjsip較新的PJSIP通道驅(qū)動(dòng)。強(qiáng)烈建議選擇chan_pjsip因?yàn)樗犀F(xiàn)代SIP標(biāo)準(zhǔn)性能更好配置也更清晰。chan_sip已被標(biāo)記為“已棄用”deprecated但為了兼容性也可以一并選中。編解碼器Codecs根據(jù)需求選擇。G.729是商業(yè)編碼需要許可證。Opus是優(yōu)秀的開源寬帶編碼。測(cè)試階段確保G.711、GSM、G.722如果支持選中即可。撥號(hào)計(jì)劃應(yīng)用Applicationsapp_dial撥號(hào)是核心。app_voicemail語(yǔ)音信箱、app_conference會(huì)議等按需選擇。資源Resources和格式Formats保持默認(rèn)通常沒(méi)問(wèn)題。第三方Third-Party如果需要MP3播放支持可以在這里選擇MP3 decoder但需要事先安裝libmp3lame-devel。配置完成后按F12保存并退出。3.3 編譯、安裝與基礎(chǔ)配置這是一個(gè)耗時(shí)過(guò)程取決于服務(wù)器性能。# 使用多核編譯加速假設(shè)是4核CPU make -j4 # 安裝到系統(tǒng) make install # 安裝基本的配置文件樣本 make samples # 安裝初始化腳本和日志輪轉(zhuǎn)配置 make config安裝完成后Asterisk的核心二進(jìn)制文件會(huì)在/usr/sbin/asterisk配置文件在/etc/asterisk/。4. SIP服務(wù)器核心配置實(shí)戰(zhàn)安裝只是第一步讓Asterisk作為一個(gè)SIP服務(wù)器跑起來(lái)并能讓客戶端注冊(cè)、通話才是重頭戲。這里我們以更現(xiàn)代的chan_pjsip為例進(jìn)行配置。4.1 PJSIP模塊配置框架Asterisk的PJSIP配置采用了分文件、聲明式的風(fēng)格比老式的chan_sip所有配置擠在sip.conf里清晰很多。主要配置文件在/etc/asterisk/pjsip.conf。但更常見(jiàn)的做法是使用/etc/asterisk/pjsip.conf來(lái)包含include多個(gè)子配置文件實(shí)現(xiàn)模塊化管理。首先我們創(chuàng)建這個(gè)目錄結(jié)構(gòu)mkdir -p /etc/asterisk/pjsip.d/然后編輯/etc/asterisk/pjsip.conf清空原有內(nèi)容改為#include 其他配置文件 #include pjsip.d/*.conf這樣我們就可以在pjsip.d/目錄下為不同的功能創(chuàng)建獨(dú)立的.conf文件。4.2 定義傳輸層、注冊(cè)器與分機(jī)1. 傳輸層配置 (pjsip.d/transport.conf) 定義SIP通信使用的協(xié)議、端口和網(wǎng)絡(luò)接口。[transport-udp] typetransport protocoludp bind0.0.0.0:5060 ; local_net 用于告知Asterisk哪些IP地址屬于本地網(wǎng)絡(luò)用于NAT穿越 local_net192.168.1.0/24 external_media_address你的公網(wǎng)IP或域名 external_signaling_address你的公網(wǎng)IP或域名關(guān)鍵解釋bind0.0.0.0表示監(jiān)聽所有網(wǎng)絡(luò)接口的5060端口。local_net至關(guān)重要如果你的客戶端和服務(wù)器在同一個(gè)局域網(wǎng)如192.168.1.x必須正確設(shè)置否則Asterisk在發(fā)送RTP流時(shí)可能會(huì)用內(nèi)網(wǎng)地址呼叫外網(wǎng)客戶端導(dǎo)致單通。external_*地址是在服務(wù)器位于NAT路由器之后需要告知外部客戶端如何連接時(shí)使用。2. 注冊(cè)器配置可選用于連接運(yùn)營(yíng)商或上游SIP中繼 如果只是內(nèi)部使用此步可跳過(guò)。如果需要向外部SIP服務(wù)商注冊(cè)可以創(chuàng)建pjsip.d/registration.conf。3. 分機(jī)Endpoint配置 (pjsip.d/endpoints.conf) 這是核心定義每個(gè)SIP用戶分機(jī)。[1001] typeendpoint contextfrom-internal ; 撥號(hào)計(jì)劃上下文非常重要 disallowall allowulaw allowalaw allowgsm auth1001-auth aors1001 [1001-auth] typeauth auth_typeuserpass passwordmysecretpassword username1001 [1001] typeaor max_contacts1這段配置定義了一個(gè)分機(jī)1001endpoint定義了終端的基本屬性如允許的編解碼器(allow)、關(guān)聯(lián)的認(rèn)證(auth)和地址記錄(aors)。auth定義了認(rèn)證方式這里是用戶名/密碼。aor(Address of Record)定義了如何聯(lián)系這個(gè)終端。max_contacts1表示只允許一個(gè)設(shè)備同時(shí)以此分機(jī)注冊(cè)。4. 撥號(hào)計(jì)劃配置 (/etc/asterisk/extensions.conf) 這是Asterisk的“大腦”定義了來(lái)電和去電的路由邏輯。我們需要編輯這個(gè)文件。[general] staticyes writeprotectno clearglobalvarsno [from-internal] ; 注意這個(gè)上下文名必須和endpoint里定義的context一致 exten _1XXX,1,NoOp(呼叫分機(jī) ${EXTEN}) same n,Dial(PJSIP/${EXTEN},20) ; 呼叫PJSIP通道的對(duì)應(yīng)分機(jī)超時(shí)20秒 same n,Playback(vm-nobodyavail) ; 無(wú)人接聽播放提示音 same n,Hangup() exten 1000,1,Answer() same n,Playback(hello-world) ; 播放測(cè)試音 same n,Hangup()這個(gè)簡(jiǎn)單的撥號(hào)計(jì)劃做了兩件事匹配模式_1XXX任何以1開頭的4位數(shù)如1001就嘗試用PJSIP通道呼叫該分機(jī)。分機(jī)1000是一個(gè)自動(dòng)應(yīng)答并播放“hello-world”提示音的測(cè)試號(hào)碼。4.3 啟動(dòng)服務(wù)與基礎(chǔ)測(cè)試首先創(chuàng)建Asterisk運(yùn)行所需的用戶和目錄權(quán)限useradd -r -d /var/lib/asterisk -s /sbin/nologin asterisk chown -R asterisk:asterisk /var/lib/asterisk /var/log/asterisk /var/spool/asterisk /etc/asterisk使用systemd管理Asterisk服務(wù)systemctl daemon-reload systemctl enable asterisk systemctl start asterisk # 查看狀態(tài) systemctl status asterisk # 跟蹤日志 tail -f /var/log/asterisk/messages如果狀態(tài)是active (running)并且日志沒(méi)有大量錯(cuò)誤就可以進(jìn)入Asterisk的命令行界面進(jìn)行測(cè)試asterisk -rvvv在Asterisk CLI中可以運(yùn)行一些診斷命令*CLI pjsip show endpoints你應(yīng)該能看到分機(jī)1001的狀態(tài)信息。*CLI core show channels查看當(dāng)前活躍的通話通道?,F(xiàn)在你可以在同一局域網(wǎng)的電腦或手機(jī)上安裝一個(gè)SIP軟電話如MicroSIP, Zoiper配置如下服務(wù)器/域名你的CentOS服務(wù)器IP用戶名/分機(jī)1001密碼mysecretpassword傳輸協(xié)議UDP嘗試用這個(gè)軟電話注冊(cè)然后在Asterisk CLI中用pjsip show endpoints查看注冊(cè)狀態(tài)。如果顯示“Avail”恭喜你注冊(cè)成功了可以嘗試用軟電話撥打1000測(cè)試音或者另一臺(tái)配置了1002分機(jī)的軟電話進(jìn)行通話測(cè)試。5. 高級(jí)配置與性能調(diào)優(yōu)要點(diǎn)基礎(chǔ)通話跑通后要構(gòu)建一個(gè)穩(wěn)定可用的服務(wù)器還需要考慮以下方面。5.1 NAT穿越與RTP端口管理在復(fù)雜的網(wǎng)絡(luò)環(huán)境尤其是客戶端在路由器后中NAT是導(dǎo)致單通、無(wú)法通話的元兇。除了在傳輸層配置local_net和external_*地址外還可以在endpoint中強(qiáng)制設(shè)置[1001] typeendpoint ... force_rportyes rewrite_contactyes ice_supportno ; 除非你明確需要ICE dtls_cert_file/etc/asterisk/keys/asterisk.pem ; 如需SRTP加密 dtls_verifyfingerprint dtls_setupactpass對(duì)于RTP端口Asterisk默認(rèn)使用10000-20000??梢栽?etc/asterisk/rtp.conf中調(diào)整[general] rtpstart10000 rtpend20000確保防火墻開放了這個(gè)端口范圍。5.2 安全加固配置禁用不必要的模塊在menuselect中只編譯需要的模塊。運(yùn)行時(shí)可以在/etc/asterisk/modules.conf中動(dòng)態(tài)加載或禁止加載模塊。修改默認(rèn)端口將SIP的5060端口改為非常用端口可以減少自動(dòng)化掃描攻擊。使用強(qiáng)密碼endpoint的auth密碼要足夠復(fù)雜。限制注冊(cè)嘗試在pjsip.conf的[system]部分或endpoint中配置max_attempts和challenge_expiration。啟用TLS和SRTP為chan_pjsip配置TLS傳輸和DTLS-SRTP實(shí)現(xiàn)信令和媒體的全程加密。這需要生成或購(gòu)買證書。5.3 日志與監(jiān)控默認(rèn)的日志級(jí)別可能不夠詳細(xì)??梢栽贏sterisk CLI中動(dòng)態(tài)調(diào)整*CLI logger set level DEBUG *CLI pjsip set logger on但要注意DEBUG日志會(huì)產(chǎn)生大量數(shù)據(jù)僅用于排查問(wèn)題。生產(chǎn)環(huán)境建議使用NOTICE或WARNING級(jí)別。監(jiān)控可以使用AMIAsterisk Manager Interface或ARIAsterisk REST Interface接口將呼叫事件、狀態(tài)信息推送到外部監(jiān)控系統(tǒng)如Zabbix, Prometheus。6. 常見(jiàn)問(wèn)題排查與解決實(shí)錄即使按照步驟操作也難免會(huì)遇到問(wèn)題。這里記錄幾個(gè)最典型的“坑”。問(wèn)題1客戶端顯示“注冊(cè)被拒絕”或“408超時(shí)”。排查檢查防火墻firewall-cmd --list-all確認(rèn)5060/udp端口已開放。檢查SELinux臨時(shí)setenforce 0看是否解決。檢查配置確認(rèn)pjsip show endpoints里endpoint的配置是否正確特別是auth部分的username和password是否與客戶端完全匹配注意大小寫。抓包分析在服務(wù)器上運(yùn)行tcpdump -i any -n port 5060觀察客戶端發(fā)來(lái)的REGISTER報(bào)文是否到達(dá)服務(wù)器以及服務(wù)器的回復(fù)是什么。這是最直接的診斷方法。問(wèn)題2能注冊(cè)能振鈴但接通后沒(méi)有聲音單通或雙向無(wú)聲。排查首要懷疑NAT和RTP檢查傳輸層(transport)配置中的local_net是否正確設(shè)置了客戶端所在的網(wǎng)段。這是最常見(jiàn)的原因。檢查RTP端口范圍是否在防火墻中開放。在Asterisk CLI中通話建立后運(yùn)行rtp show stats查看RTP流是否有收發(fā)包。檢查編解碼器是否匹配。在CLI中運(yùn)行core show translation查看編解碼器路徑確保雙方有共同的編解碼器如ulaw/alaw。問(wèn)題3Asterisk啟動(dòng)失敗報(bào)錯(cuò)“Failed to load module chan_sip.so”或其他模塊。排查檢查/etc/asterisk/modules.conf確認(rèn)沒(méi)有顯式禁止(noload)該模塊??赡苁且蕾噹?kù)缺失。運(yùn)行l(wèi)dd /usr/lib64/asterisk/modules/chan_sip.so查看是否有“not found”的動(dòng)態(tài)庫(kù)。需要安裝對(duì)應(yīng)的-devel包并重新編譯安裝Asterisk。問(wèn)題4編譯Asterisk時(shí)./configure通過(guò)但make時(shí)出錯(cuò)。排查最常見(jiàn)的是內(nèi)存不足。編譯Asterisk尤其是多線程make -j4時(shí)需要較多內(nèi)存。如果是在小內(nèi)存VPS上嘗試make單線程編譯。檢查是否安裝了完整的內(nèi)核頭文件(kernel-devel)且版本與當(dāng)前內(nèi)核一致。查看具體的錯(cuò)誤信息通常是某個(gè)依賴庫(kù)的頭文件或庫(kù)文件找不到根據(jù)提示安裝對(duì)應(yīng)的開發(fā)包。整個(gè)過(guò)程下來(lái)從系統(tǒng)準(zhǔn)備到最終能穩(wěn)定通話就像在組裝一臺(tái)精密的機(jī)械鐘表。每一個(gè)齒輪配置項(xiàng)都必須嚴(yán)絲合縫。CentOS 7的穩(wěn)定給了我們一個(gè)堅(jiān)實(shí)的基礎(chǔ)而Asterisk的強(qiáng)大與復(fù)雜則帶來(lái)了學(xué)習(xí)和掌控的樂(lè)趣。記住遇到問(wèn)題多查日志(/var/log/asterisk/messages和full)多用CLI診斷命令(pjsip show ...,sip show ...,core show ...)善用抓包工具(tcpdump)大部分難題都能迎刃而解。