安装配置opensips过程记录
本文操作系統(tǒng)為CentOS,所用Opensips版本為1.8.2。
Update2013/6/27: 版本1.9.1也已驗(yàn)證通過(guò),下載地址為http://opensips.org/pub/opensips/latest/src/opensips-1.9.1_src.tar.gz
安裝CentOS
(若已有環(huán)境可跳過(guò)此步驟)
1、安裝虛擬機(jī),VMWare Server 2.0遇到問(wèn)題無(wú)法顯示console(Chrome里),換為Virtualbox 4.2后可正常使用;
2、在虛擬機(jī)里安裝CentOS 6.3,選擇standard server類型安裝。
對(duì)這種純命令行界面的虛擬機(jī),可以用telnet直接訪問(wèn),操作剪貼板什么的比較方便;
若虛擬機(jī)映射的網(wǎng)卡沒(méi)有自動(dòng)啟動(dòng),用ifup eth0命令啟動(dòng)。
若(Virtualbox的)虛擬機(jī)是復(fù)制過(guò)來(lái)的,可能需要先刪除 /etc/udev/rules.d/70-persistent-net.rules,再修改/etc/sysconfig/network-scripts/ifcfg-eth0里的HWAddr地址。
若需要配置網(wǎng)卡ip地址,先ifconfig -a查看網(wǎng)卡設(shè)備號(hào)和MAC地址,然后編輯/etc/sysconfig/network-scripts/ifcfg-eth0文件,示例如下:
DEVICE="eth0" BOOTPROTO="none" HWADDR="08:00:27:81:30:F4" NM_CONTROLLED="yes" ONBOOT="yes" TYPE="Ethernet" UUID="dcd43c45-adf4-480b-b461-179ee8d2e8d6" IPADDR=192.168.1.120 NETMASK=255.255.255.0 GATEWAY=192.168.1.1在/etc/resolv.conf里指定dns以便安裝軟件包(CentOS6以后可以在ifg-eth0里指定dns了)
nameserver 202.181.202.140 nameserver 208.67.220.220安裝Opensips(根據(jù)官方的Tutorial視頻整理的主要步驟)
opensips提供了一個(gè)視頻教程(這個(gè)頁(yè)面有下載鏈接,90M),推薦使用menuconfig方式,更方便且不容易出錯(cuò)。以下為步驟摘要:
yum install gcc make
yum install flex bison ncurses?libncurses-dev?ncurses-devel
yum install mysql mysql-server mysql-libs mysql-devel
wget?http://opensips.org/pub/opensips/1.8.2/src/opensips-1.8.2_src.tar.gz
tar zxvf opensips-1.8.2_src.tar.gz
cd opensips-1.8.2-tls
make menuconfig (勾選db_mysql,其他不用動(dòng))
菜單里選"Compile And Install Opensips"
退出menuconfig
vi /usr/etc/opensips/opensipsctlrc,把與mysql有關(guān)的注釋去掉(DB_PATH和USERCOL保留注釋)
service mysqld start
opensipsdbctl create(提示的兩個(gè)問(wèn)題都選no)
osipsconfig (選擇ENABLE_TCP,USE_AUTH,USE_DBACC,USE_DBUSERLOC,USE_DIALOG,然后generate residential script)
用生成的opensips_residential_xxx.cfg替換原先的opensips.cfg
vi /usr/etc/opensips/opensips.cfg (改listen地址和mpath,后者一般是/usr/lib/opensips/modules)
opensipsctl start (netstat -anp查端口)
service iptables stop (關(guān)閉防火墻)
如果啟動(dòng)opensips時(shí)提示錯(cuò)誤,檢查/var/log/messages(若opensips.cfg里設(shè)置了log_stderror=no則日志都進(jìn)入此文件,鏈接),一般是模塊參數(shù)未設(shè)置引起的。例如在log里發(fā)現(xiàn)“ERROR:uri:db_checks_fixup1: configuration error - no database URL is configured!”,則在opensips.cfg里的“l(fā)oadmodule "uri.so"”后添加modparam("uri", "db_url","mysql://opensips:opensipsrw@localhost/opensips")即可。
創(chuàng)建測(cè)試用戶:
opensipsctl add 101 101
如果創(chuàng)建用戶時(shí)提示“ERROR: domain unknown: use usernames with domain or set default domain in SIP_DOMAIN”,可修改opensipsctlrc文件將SIP_DOMAIN設(shè)為本機(jī)域名或IP地址。
進(jìn)一步配置Opensips
設(shè)置日志輸出方式
在opensips.cfg里有幾個(gè)參數(shù)控制日志的輸出:
debug=3 #此值控制日志輸出的詳細(xì)程度,3為普通,4為詳細(xì)(會(huì)產(chǎn)生很多日志)。
log_stderror=no #設(shè)置為no表示將日志輸出到文件,否則輸出到控制臺(tái)(應(yīng)該是以前臺(tái)方式啟動(dòng)opensips服務(wù)時(shí)才有用)。
log_facility=LOG_LOCAL0 #應(yīng)該是用于在syslog服務(wù)的配置文件里區(qū)分opensips產(chǎn)生的日志(見(jiàn)下面“使用獨(dú)立的log文件”)。
fork=yes #設(shè)置為yes表示在后臺(tái)啟動(dòng)opensips服務(wù),設(shè)置為no表示在前臺(tái)啟動(dòng)。
使用獨(dú)立的log文件
opensips使用syslog服務(wù),所以缺省情況下日志會(huì)進(jìn)入/var/log/message這個(gè)文件,如果希望使用獨(dú)立的log文件,可以這樣設(shè)置:
touch /var/log/opensips.log
vi /etc/rsyslog.conf ?--> 增加一行:local0.* ? ? ? ? ? ? /var/log/opensips.log
/etc/init.d/rsyslog restart
配置STUN模塊
opensips自帶一個(gè)stun模塊,可以實(shí)現(xiàn)stun服務(wù)器的功能(需要雙網(wǎng)卡)。配置方法也很簡(jiǎn)單(官方文檔),在opensips.cfg里添加如下內(nèi)容:
#### STUN module
loadmodule "stun.so"
modparam("stun", "primary_ip", "11.22.33.44") #opensips服務(wù)器的ip地址
modparam("stun", "primary_port", "5060") #必須與opensips的udp端口相同(一般是5060)
modparam("stun", "alternate_ip", "55.66.77.88") #另一網(wǎng)卡的ip地址
modparam("stun", "alternate_port", "3479") #另一端口號(hào)
配置好stun以后,可以使用stun-client來(lái)測(cè)試,以windows下為例,測(cè)試命令為:
stun-client-0-96.exe 11.22.33.44:5060 -v
安裝配置RTPProxy模塊
rtpproxy模塊通常與nathelper模塊一起使用。首先要確保服務(wù)器上已經(jīng)安裝了rtpproxy,啟動(dòng)rtpproxy:
rtpproxy -F
然后在opensips.cfg文件里做如下配置:
loadmodule "rtpproxy.so"
modparam("rtpproxy", "rtpproxy_sock", "unix:/var/run/rtpproxy.sock") # CUSTOMIZE ME
安裝配置MediaProxy模塊
MediaProxy官方文檔鏈接
一個(gè)在CentOS6上安裝MediaProxy2.5.2的參考鏈接。
下載mediaproxy源碼(和所需要的各種依賴包),并安裝(過(guò)程略)。安裝完成后:
把config.ini.sample復(fù)制到/etc/mediaproxy/config.ini,把tls目錄也復(fù)制過(guò)來(lái)。
echo 1 > /proc/sys/net/ipv4/ip_forward
media-dispatcher restart
media-relay restart
在opensips.cfg里配置mediaproxy模塊,如下:
#### MediaProxy module
loadmodule "mediaproxy.so"
modparam("mediaproxy", "disable", 0)
#modparam("mediaproxy", "mediaproxy_socket", "/var/run/mediaproxy/dispatcher.sock")
modparam("mediaproxy", "mediaproxy_timeout", 500)
modparam("mediaproxy", "signaling_ip_avp", "$avp(nat_ip)")
modparam("mediaproxy", "media_relay_avp", "$avp(media_relay)")
若mediaproxy提示“No suitable relay found”,可能是certification方面的問(wèn)題。?參考鏈接
(未完)
抓取SIP包
在Opensips所在服務(wù)器上使用tcpdump可以抓取SIP包以便分析問(wèn)題(注意要抓取的網(wǎng)卡是eth0或eth1):
tcpdump -nqt -s 0 -A -i eth0 port 5060 -w /home/capture_file_name.pcap
參考:http://jonathanmanning.com/2009/10/26/how-to-voip-sip-capture-with-tcpdump-on-linux/
要抓手機(jī)上的包稍微復(fù)雜一些,要先root手機(jī),然后把tcpdump復(fù)制到手機(jī)上使用:
adb shell
su
tcpdump -nqt -s 0 -w /sdcard/packets_xx.pcap
adb pull /sdcard/packets_xx.pcap
具體請(qǐng)參考這篇文章。
安裝opensips-cp
從sourceforge下載opensips-cp源碼壓縮包后,里面附有名為INSTALL的文檔,建議根據(jù)這個(gè)文檔進(jìn)行安裝,網(wǎng)上能查到的一些資料往往是過(guò)期的或不準(zhǔn)確的。
yum install httpd php php-mysql php-xmlrpc php-pear
pear install MDB2
pear install MDB2#mysql
pear install MDB2#mysqli
pear install log
在/etc/php.ini里:
把short_open_tag置為On
把/usr/share/pear加到inculde_path變量里(一些教程寫(xiě)的是加/usr/share/php,實(shí)際檢驗(yàn)要加/usr/share/pear)
wget?http://sourceforge.net/projects/opensips-cp/files/opensips-cp/5.0/opensips-cp_5.0.tgz/download
tar -zxvf opensips-cp_5.0.tgz
將解壓縮后的文件夾(名字一般是“5.0”)復(fù)制到/var/www目錄下,并改名為opensips-cp
vi /etc/httpd/conf/httpd.conf,添加下面一行:
Alias /cp "/var/www/opensips-cp/web"
chown apache:apache /var/www/opensips-cp/config/access.log (如果是其他版本linux,用戶名可能是www-data或其他)
(隨源碼附帶的安裝文檔INSTALL有點(diǎn)看不懂,postgresql應(yīng)該是與mysql二選一。)
安裝必須的admin:
cd /var/www/opensips-cp/config/tools/admin/add_admin/
mysql -Dopensips -p<ocp_admin_privileges.mysql
mysql -uroot opensips進(jìn)入mysql命令行,執(zhí)行下面的命令添加管理員用戶:
INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');
安裝cdrviewer:
cd /var/www/opensips-cp/config/tools/system/cdrviewer/
mysql -Dopensips -p < cdrs.mysql
mysql -Dopensips -p<opensips_cdrs.mysql
cd /var/www/opensips-cp/cron_job
vi?generate-cdrs_mysql.sh (填寫(xiě)數(shù)據(jù)庫(kù)連接信息)
注意,generate-cdrs_mysql.sh這個(gè)文件里的“call opensips_cdrs_1_6()”可能要改為“call opensips_cdrs()”,必須要與opensips_cdrs.mysql里定義的名稱一致。
vi /etc/crontab (添加定時(shí)任務(wù),例如每三分鐘生成一次:*/3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh)
安裝smonitor:
cd /var/www/opensips-cp/config/tools/system/smonitor/ (此處INSTALL文檔有筆誤,這里已更正)
mysql -Dopensips -p < tables.mysql
vi /etc/crontab (添加定時(shí)任務(wù),例如每分鐘一次:* * * * * root php /var/www/opensips-cp/cron_job/get_opensips_stats.php > /dev/null)
安裝add_user:
(最前面已經(jīng)裝過(guò)了ocp_admin_privileges.mysql,這里應(yīng)該不需要再做一次,INSTALL文檔的小問(wèn)題不少)
啟動(dòng)opensips-cp:
service mysqld start
service httpd start
打開(kāi)瀏覽器訪問(wèn)http://xxx.xxx.xxx.xxx/cp/ 應(yīng)該能看到登錄界面,用之前創(chuàng)建的admin用戶登錄。
未完待續(xù)..
其他有用鏈接
Opensips官方論壇
關(guān)于sip和sip的客戶端
Best practices for SIP NAT traversal
一些問(wèn)題和解決
服務(wù)器端保持連接:使用 nat_traversal或nathelper模塊(根據(jù)討論組里的一些帖子,這兩個(gè)模塊的功能幾乎相同),讓opensips每個(gè)一段時(shí)間向客戶端發(fā)一個(gè)包,使得路由器上的端口映射將保持(即洞口一直打開(kāi))。在客戶端抓包時(shí)應(yīng)該可以看到這些來(lái)自服務(wù)器的sip包,一般名稱為OPTIONS。
客戶端接收到INVITE命令后沒(méi)有RING:很奇怪的問(wèn)題,但在我這里時(shí)不時(shí)的發(fā)生,客戶端程序?yàn)锽oghe v2.0.153.836,暫時(shí)還沒(méi)有找到原因和解決方法。
路由器修改SIP包:使用Volans VE602W作為路由器,從客戶端發(fā)出的REGISTER包里的Via字段會(huì)被修改為公網(wǎng)地址,導(dǎo)致opensips服務(wù)器判斷是否來(lái)自內(nèi)網(wǎng)(nat_traversal模塊中的nat_client_test方法)失敗,其他三個(gè)路由器(TPLink、Mercury和Buffalo沒(méi)有這種情況)。暫時(shí)沒(méi)有找到解決方法。這里有一個(gè)類似問(wèn)題。
客戶端接收到重復(fù)的OPTIONS消息:由于重復(fù)(通過(guò)不同路由器)登錄到opensips,Opensips有時(shí)會(huì)發(fā)送多個(gè)OPTIONS包給客戶端,直到服務(wù)器認(rèn)為客戶端已經(jīng)掉線。若客戶端在REGISTER消息的Contact字段里添加了expires=xxx時(shí),服務(wù)器會(huì)在location表里記錄客戶端失效的時(shí)間,若這個(gè)時(shí)間很長(zhǎng)則服務(wù)器會(huì)一直嘗試連接客戶端。
有時(shí)接通以后沒(méi)有視頻畫(huà)面:遇到過(guò)這樣的問(wèn)題:撥打十次,每次都能接通,但有時(shí)沒(méi)有畫(huà)面。后來(lái)發(fā)現(xiàn)是服務(wù)器防火墻禁止了一些端口(用iptables --list INPUT查詢發(fā)現(xiàn)服務(wù)器僅允許udp 35000~50000進(jìn)入)。解決方法是啟動(dòng)rtpproxy時(shí)指定端口范圍,例如rtpproxy -m 40000 -M 50000 -F。
Contact URI字段沒(méi)有被改為公網(wǎng)IP:通過(guò)增加調(diào)試信息發(fā)現(xiàn)雖然fix_nated_contact()方法已經(jīng)被調(diào)用,但服務(wù)器端發(fā)回的sip包里Contact URI里的內(nèi)網(wǎng)地址并沒(méi)有被替換為公網(wǎng)地址。在公司沒(méi)有這個(gè)問(wèn)題,在家有這個(gè)問(wèn)題(更換路由器無(wú)效),暫時(shí)沒(méi)找到原因。(更正:這個(gè)問(wèn)題本身有誤,應(yīng)該觀察從服務(wù)器返回的200OK消息,而不是服務(wù)器接收到的原始消息)
單向有聲音/視頻或僅音頻能撥通:可能是SIP包的長(zhǎng)度超出了網(wǎng)絡(luò)設(shè)備的MTU值,在UDP協(xié)議下,如果客戶端不能處理過(guò)長(zhǎng)的SIP包(一般是帶有SDP的那些SIP消息,而且視頻請(qǐng)求比音頻請(qǐng)求產(chǎn)生的SIP消息要大),多出的部分可能會(huì)被丟棄,導(dǎo)致服務(wù)器發(fā)送/接收的SIP包失效。解決辦法有:1)切換到TCP協(xié)議;2)精簡(jiǎn)SIP包尺寸,有些客戶端生成的SIP包里帶有不必要的字段可以刪除掉(如果能夠定制開(kāi)發(fā)的話),另外這里有一個(gè)參考鏈接;3)使用支持超長(zhǎng)UDP包或SIP包比較小的客戶端(我用的基于doubango的boghe這部分做的不太好,換用x-lite后發(fā)現(xiàn)同樣的請(qǐng)求SIP包長(zhǎng)度小很多:18xx vs 10xx)。
清除在線用戶:用opensipsctl ul rm id可以刪除一個(gè)在線用戶,一個(gè)用戶段時(shí)間內(nèi)多次登錄時(shí)會(huì)造成重復(fù)記錄,這時(shí)可能需要清除掉這個(gè)用戶的在線狀態(tài)。
本文地址:http://www.cnblogs.com/bjzhanghao/archive/2013/02/13/2910903.html
總結(jié)
以上是生活随笔為你收集整理的安装配置opensips过程记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 全球一季度智能手表出货量增长13%:苹果
- 下一篇: C++中正确使用PRId64