安装配置opensips过程记录

本文操作系统为CentOS,所用Opensips版本为1.8.2。

Update2013/6/27: 版本1.9.1也已验证通过,下载地址为http://opensips.org/pub/opensips/latest/src/opensips-1.9.1_src.tar.gz

安装CentOS

(若已有环境可跳过此步骤)

1、安装虚拟机,VMWare Server 2.0遇到问题无法显示console(Chrome里),换为Virtualbox 4.2后可正常使用;

2、在虚拟机里安装CentOS 6.3,选择standard server类型安装。

对这种纯命令行界面的虚拟机,可以用telnet直接访问,操作剪贴板什么的比较方便;

若虚拟机映射的网卡没有自动启动,用ifup eth0命令启动。

若(Virtualbox的)虚拟机是复制过来的,可能需要先删除 /etc/udev/rules.d/70-persistent-net.rules,再修改/etc/sysconfig/network-scripts/ifcfg-eth0里的HWAddr地址。

若需要配置网卡ip地址,先ifconfig -a查看网卡设备号和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(根据官方的Tutorial视频整理的主要步骤)

opensips提供了一个视频教程(这个页面有下载链接,90M),推荐使用menuconfig方式,更方便且不容易出错。以下为步骤摘要:

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,其他不用动)
菜单里选"Compile And Install Opensips"
退出menuconfig

vi /usr/etc/opensips/opensipsctlrc,把与mysql有关的注释去掉(DB_PATH和USERCOL保留注释)
service mysqld start
opensipsdbctl create(提示的两个问题都选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 (关闭防火墙)

如果启动opensips时提示错误,检查/var/log/messages(若opensips.cfg里设置了log_stderror=no则日志都进入此文件,链接),一般是模块参数未设置引起的。例如在log里发现“ERROR:uri:db_checks_fixup1: configuration error - no database URL is configured!”,则在opensips.cfg里的“loadmodule "uri.so"”后添加modparam("uri", "db_url","mysql://opensips:opensipsrw@localhost/opensips")即可。

创建测试用户:

opensipsctl add 101 101

如果创建用户时提示“ERROR: domain unknown: use usernames with domain or set default domain in SIP_DOMAIN”,可修改opensipsctlrc文件将SIP_DOMAIN设为本机域名或IP地址。

进一步配置Opensips

设置日志输出方式

在opensips.cfg里有几个参数控制日志的输出:

debug=3 #此值控制日志输出的详细程度,3为普通,4为详细(会产生很多日志)。
log_stderror=no #设置为no表示将日志输出到文件,否则输出到控制台(应该是以前台方式启动opensips服务时才有用)。
log_facility=LOG_LOCAL0 #应该是用于在syslog服务的配置文件里区分opensips产生的日志(见下面“使用独立的log文件”)。
fork=yes #设置为yes表示在后台启动opensips服务,设置为no表示在前台启动。

使用独立的log文件

opensips使用syslog服务,所以缺省情况下日志会进入/var/log/message这个文件,如果希望使用独立的log文件,可以这样设置:

touch /var/log/opensips.log
vi /etc/rsyslog.conf  --> 增加一行:local0.*             /var/log/opensips.log
/etc/init.d/rsyslog restart

配置STUN模块

opensips自带一个stun模块,可以实现stun服务器的功能(需要双网卡)。配置方法也很简单(官方文档),在opensips.cfg里添加如下内容:

#### STUN module
loadmodule "stun.so"
modparam("stun", "primary_ip", "11.22.33.44") #opensips服务器的ip地址
modparam("stun", "primary_port", "5060") #必须与opensips的udp端口相同(一般是5060)
modparam("stun", "alternate_ip", "55.66.77.88") #另一网卡的ip地址
modparam("stun", "alternate_port", "3479") #另一端口号

配置好stun以后,可以使用stun-client来测试,以windows下为例,测试命令为:

stun-client-0-96.exe 11.22.33.44:5060 -v

安装配置RTPProxy模块

rtpproxy模块通常与nathelper模块一起使用。首先要确保服务器上已经安装了rtpproxy,启动rtpproxy:

rtpproxy -F

然后在opensips.cfg文件里做如下配置:

loadmodule "rtpproxy.so"
modparam("rtpproxy", "rtpproxy_sock", "unix:/var/run/rtpproxy.sock") # CUSTOMIZE ME

安装配置MediaProxy模块

MediaProxy官方文档链接

一个在CentOS6上安装MediaProxy2.5.2的参考链接。

下载mediaproxy源码(和所需要的各种依赖包),并安装(过程略)。安装完成后:

把config.ini.sample复制到/etc/mediaproxy/config.ini,把tls目录也复制过来。

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方面的问题。 参考链接

(未完)

抓取SIP包

在Opensips所在服务器上使用tcpdump可以抓取SIP包以便分析问题(注意要抓取的网卡是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/

要抓手机上的包稍微复杂一些,要先root手机,然后把tcpdump复制到手机上使用:

adb shell
su
tcpdump -nqt -s 0 -w /sdcard/packets_xx.pcap
adb pull /sdcard/packets_xx.pcap

具体请参考这篇文章。

安装opensips-cp

从sourceforge下载opensips-cp源码压缩包后,里面附有名为INSTALL的文档,建议根据这个文档进行安装,网上能查到的一些资料往往是过期的或不准确的。

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变量里(一些教程写的是加/usr/share/php,实际检验要加/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”)复制到/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有点看不懂,postgresql应该是与mysql二选一。)

安装必须的admin:

cd /var/www/opensips-cp/config/tools/admin/add_admin/

mysql -Dopensips -p<ocp_admin_privileges.mysql

mysql -uroot opensips进入mysql命令行,执行下面的命令添加管理员用户:

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 (填写数据库连接信息)

注意,generate-cdrs_mysql.sh这个文件里的“call opensips_cdrs_1_6()”可能要改为“call opensips_cdrs()”,必须要与opensips_cdrs.mysql里定义的名称一致。

vi /etc/crontab (添加定时任务,例如每三分钟生成一次:*/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 (添加定时任务,例如每分钟一次:* * * * * root php /var/www/opensips-cp/cron_job/get_opensips_stats.php > /dev/null)

安装add_user:

(最前面已经装过了ocp_admin_privileges.mysql,这里应该不需要再做一次,INSTALL文档的小问题不少)

启动opensips-cp:

service mysqld start

service httpd start

打开浏览器访问http://xxx.xxx.xxx.xxx/cp/ 应该能看到登录界面,用之前创建的admin用户登录。

未完待续..

其他有用链接

Opensips官方论坛

关于sip和sip的客户端

Best practices for SIP NAT traversal

一些问题和解决

服务器端保持连接:使用 nat_traversal或nathelper模块(根据讨论组里的一些帖子,这两个模块的功能几乎相同),让opensips每个一段时间向客户端发一个包,使得路由器上的端口映射将保持(即洞口一直打开)。在客户端抓包时应该可以看到这些来自服务器的sip包,一般名称为OPTIONS。

客户端接收到INVITE命令后没有RING:很奇怪的问题,但在我这里时不时的发生,客户端程序为Boghe v2.0.153.836,暂时还没有找到原因和解决方法。

路由器修改SIP包:使用Volans VE602W作为路由器,从客户端发出的REGISTER包里的Via字段会被修改为公网地址,导致opensips服务器判断是否来自内网(nat_traversal模块中的nat_client_test方法)失败,其他三个路由器(TPLink、Mercury和Buffalo没有这种情况)。暂时没有找到解决方法。这里有一个类似问题。

客户端接收到重复的OPTIONS消息:由于重复(通过不同路由器)登录到opensips,Opensips有时会发送多个OPTIONS包给客户端,直到服务器认为客户端已经掉线。若客户端在REGISTER消息的Contact字段里添加了expires=xxx时,服务器会在location表里记录客户端失效的时间,若这个时间很长则服务器会一直尝试连接客户端。

有时接通以后没有视频画面:遇到过这样的问题:拨打十次,每次都能接通,但有时没有画面。后来发现是服务器防火墙禁止了一些端口(用iptables --list INPUT查询发现服务器仅允许udp 35000~50000进入)。解决方法是启动rtpproxy时指定端口范围,例如rtpproxy -m 40000 -M 50000 -F。

Contact URI字段没有被改为公网IP:通过增加调试信息发现虽然fix_nated_contact()方法已经被调用,但服务器端发回的sip包里Contact URI里的内网地址并没有被替换为公网地址。在公司没有这个问题,在家有这个问题(更换路由器无效),暂时没找到原因。(更正:这个问题本身有误,应该观察从服务器返回的200OK消息,而不是服务器接收到的原始消息)

单向有声音/视频或仅音频能拨通:可能是SIP包的长度超出了网络设备的MTU值,在UDP协议下,如果客户端不能处理过长的SIP包(一般是带有SDP的那些SIP消息,而且视频请求比音频请求产生的SIP消息要大),多出的部分可能会被丢弃,导致服务器发送/接收的SIP包失效。解决办法有:1)切换到TCP协议;2)精简SIP包尺寸,有些客户端生成的SIP包里带有不必要的字段可以删除掉(如果能够定制开发的话),另外这里有一个参考链接;3)使用支持超长UDP包或SIP包比较小的客户端(我用的基于doubango的boghe这部分做的不太好,换用x-lite后发现同样的请求SIP包长度小很多:18xx vs 10xx)。

清除在线用户:用opensipsctl ul rm id可以删除一个在线用户,一个用户段时间内多次登录时会造成重复记录,这时可能需要清除掉这个用户的在线状态。

本文地址:http://www.cnblogs.com/bjzhanghao/archive/2013/02/13/2910903.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse快捷键Alt + /

很多书籍中Eclipse的快捷键Ctrl Space在中文系统中被Alt / 代替转载于:https://www.cnblogs.com/jubincn/archive/2012/04/19/3381206.html

Linux Kbuild文档 1

Linux内核配置方式1.1 概述 Linux内核源代码组织了一个配置系统&#xff0c;该配置系统可以生成内核配置菜单&#xff0c;方便内核配置。配置系统主要包含Makefile、Kconfig和配置工具&#xff0c;可以生成配置界面。其中&#xff0c;配置界面是通过配置工具来生成的&#xff…

依赖注入原理 php,PHP依赖注入原理与用法分析

本文实例讲述了PHP依赖注入原理与用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;引言依然是来自到喜啦的一道面试题&#xff0c;你知道什么是依赖注入吗&#xff1f;依赖注入(DI)的概念虽然听起来很深奥&#xff0c;但是如果你用过一些新兴的php框架的话&#xf…

jQuery1.7.2正式发布了

下载地址 jQuery1.7.2正式发布了&#xff0c;下载地址&#xff1a; http://code.jquery.com/jquery-1.7.2.min.js (minified, production)http://code.jquery.com/jquery-1.7.2.js (unminified, debug)注&#xff1a;如果你正在使用jQuery Mobile&#xff0c;请使用最新的jQuer…

Linux Kbuild文档 2

2. Kconfig linux在2.6版本以后将配置文件由原来的config.in改为Kconfig&#xff0c;对于Kconfig的语法在内核源代码/Documentation/kbuild/kconfig-language.txt中做了详细的说明。 2.1 Kconfig的树状关系 Kconfig的配置选项是以树的形式组织的&#xff0c;如下所示所示&am…

php upw5.5,UPW

PHP EngineerResponsibilities:●Analysis and module design of software system&#xff1b;●Development and design of new products, and be able to write the core module code independently&#xff1b;●Responsible for the maintenance and upgrading of existing…

cocos2d对动画的各种操作

关于动画的各种操作&#xff0c;总结一下以便以后复习查找。 内容简要: 1、瞬时动作2、延时动作 3、 组合动作 4、动画 5、速度变化6、函数调用7、创建动作动画8、控制动画帧的速度 原文地址&#xff1a; http://blog.csdn.net/dingkun520wy/article/details/7014233 --…

matlab的灰色关联,五种灰色关联度分析matlab代码

《五种灰色关联度分析matlab代码》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《五种灰色关联度分析matlab代码(3页珍藏版)》请在人人文库网上搜索。1、灰色邓关联分析% p12-the study on the grey relational degree and its applicationFunction R1gld_deng(x)ssi…

Linux Kbuild文档 3

3. Kbuild Makefile Linux内核源代码是通过Makefile组织编译的&#xff0c;Linux2.6内核Makefile的许多特性和2.4内核差别很大&#xff0c;在内核目录的documention/kbuild/makefiles.txt中有详细的说明。 3.1 Makefile的组织结构 Linux内核的Makefile分为5个部分&#xff0…

SQL求解两个时间差

sql 求解两个时间差SELECTDATEDIFF( Second, 2009-8-25 12:15:12, 2009-9-1 7:18:20) --返回相差秒数SELECTDATEDIFF( Minute, 2009-9-1 6:15:12, 2009-9-1 7:18:20) --返回相差分钟数 SELECTDATEDIFF( Day, 2009-8-25 12:15:12,2009-9-1 7:18:20)--返回相差的天数SELEC…

matlab如何画一个平面,matlab 画平面

&period;framework使用注意、静态库配置及构架合成使用注意: 1.项目中使用的framework中包含了资源文件时,需要手动添加该framework中的资源文件 2.由于动态库(framework默认生成为动态库)不能上架,我们在生成的时候需要修改为 ...spring加载hibernate映射文件的几种方式 &…

Linux Kbuild文档 4

4. 一个使用linux kbuild实现可配置编译的例子 我编写了一个使用Linux kbuild机制实现可配置编译的小例子&#xff0c;工程名为print-example。包括如下如下几个目录&#xff1a; 其中scripts、Makefile、Makefile.flags是从busybox-1.9.0复制过来的。 4.1 运行print 运行m…

php标准输出重定向,python标准输出重定向方式

一. 背景在Python中&#xff0c;文件对象sys.stdin、sys.stdout和sys.stderr分别对应解释器的标准输入、标准输出和标准出错流。在程序启动时&#xff0c;这些对象的初值由sys.__stdin__、sys.__stdout__和sys.__stderr__保存&#xff0c;以便用于收尾(finalization)时恢复标准…

C# 温故而知新:Stream篇(六)

C# 温故而知新&#xff1a;Stream篇&#xff08;六&#xff09; BufferedStream 目录&#xff1a; 简单介绍一下BufferedStream如何理解缓冲区&#xff1f;BufferedStream的优势从BufferedStream 中学习装饰模式    如何理解装饰模式    再次理解下装饰模式在Stream中的…

Linux内核的Makefile和kconfig解读

一、概述 在内核编译中如何将各个目录树中的文件组织起来编译是一个很重要的问题&#xff0c;并且要根据用户配置来编译特有的内核。为了解决这个问题&#xff0c;内核使用两种文件&#xff0c;Makefie和Kconfig。分布到各目录的Kconfig构成了一个分布式的内核配置数据库&#…

网页快照

C#生成网站网页快照&#xff0c;Html转成图片2012-04-09 22:29HtmlToImg.cs using System; using System.Drawing; using System.Threading; using System.Windows.Forms; /// <summary> /// 生成网页快照 /// </summary> publicclassHtmlToImg { Bitmap m_Bitmap;…

php获取网页输出,PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)_PHP教程

看点&#xff1a;1、file_get_contents超时控制。2、页面编码判断。3、键盘Enter键捕捉响应。4、键盘event兼容处理。//event event || window.event;5、XMLHttpRequest 和 jQuery 两种实现方案。6、页面及源码同时展示。XMLHttpRequest版本 get_web.php复制代码 代码如下:hea…

HDU 3306 Another kind of Fibonacci

题意&#xff1a;A(0) 1 , A(1) 1 , A(N) X * A(N - 1) Y * A(N - 2) (N > 2)&#xff1b;给定三个值N&#xff0c;X&#xff0c;Y求S(N):S(N) A(0)2 A(1)2……A(n)2。 思路&#xff1a;原来我们讲的斐波那契数列是&#xff1a; F(0) 1, F(1) 1, F(N) F(N - 1) F(N…

php中拼接html代码,如何利用ajax给html动态拼接代码

function get_all_category_with_id() {$.ajax( {type: "get", url: "../../../appUpload/getAllCategoryByid", async : false, dataType: "text", success: function (data) {var obj JSON.parse(data);var str "";//先将元素对应清…

Arm Linux交叉编译和连接过程分析(1)

一、配置内核&#xff08;Kconfig&#xff09; 我们配置内核是实质是根据众多目录下面的Kconfig文件中组合成我们需要的一个最佳选择&#xff0c;即最终在根目录下面生成的.config文件&#xff0c;而这个文件会在根目录Makefile下调用的。这一部分我们主要讨论整个SEP4020体系…