centos或ubuntu部署OpenSips

news2024/12/29 10:13:55

参考

Centos7安装opensips超详细教程
centos7 部署opensips信令服务器
【死磕opensips】sip协议解析
开源SIP Kamailio OpenSIPS的四种均衡负载算法详解和SBC呼叫路由
基于SIP协议的性能测试——奇林软件kylinPET
OpenSIPS实战(一):OpenSIPS使用简介
Sip服务器搭建全过程(Linphone拨号)

关于via和Record-Route的理论

SIP系列讲座-关于VIA和Record-Route header
SIP route与 record_route /SIP路由机制解析

关于rport机制

国标视频sip协议的rport机制

概述

竞争对手Kamailio、Asterisk
https://github.com/kamailio/kamailio/blob/master/src/core/utils/srjson.h

安装依赖

centos

# 如果已经存在不需要安装
yum install gcc gcc-c++
# 如果已经存在不需要安装
yum install make
yum install flex bison ncurses ncurses-devel
yum install -y gcc make bison openssl-devel pkgconfig mysql-devel libcurl-devel pcre-devel zlib-devel
yum install -y redis

ubuntu

# apt update
# apt install gcc -y
# apt install g++ -y
# apt install build-essential -y
//mysql必须为5.7版本,服务端已经装好docker,这里就不装了,若要安装,则安装下,要去配置文件中注释监听地址 # 127.0.0.1
// #apt-get install mysql-server 
# apt install mysql-client
# apt install libmysqlclient-dev -y
# apt install pkg-config
# apt install libssl-dev

# apt-get install perl libdbi-perl libdbd-mysql-perl libdbd-pg-perl libfrontier-rpc-perl libterm-readline-gnu-perl libberkeleydb-perl

# apt-get install bison flex libncurses5 libncurses5-dev

下载

访问官网https://opensips.org/pub/opensips/latest/找最新版本
下载https://opensips.org/pub/opensips/latest/opensips-3.3.5.tar.gz

cd /usr/local/opensips
wget https://opensips.org/pub/opensips/2.4.11/opensips-2.4.11.tar.gz
# 解压
tar -zxvf opensips-2.4.11.tar.gz
# 切换目录
cd  opensips-2.4.11

选择安装模块(db_mysql)

1、在opensips源码根目录执行make menuconfig,出现配置界面
2、箭头移动到“Configure Compile Options”,按右方向键→进入“Configure Excluded Modules”
3、移动到“db_mysql”项,按空格键选中,选中出现“*”号

数据库版本5.7

mysql8.0会提示mysql授权语句错误

配置安装目录

再按左方向键←回到上一页,移动到“Configure Install Prefix”,再按并按右方向键→,输入opensips安装目录为/usr/local/opensips/opensips2,回车保存。
默认位置:/usr/local/share/opensips/
默认启动项:/usr/local/sbin/下面
默认配置项:/usr/local/etc/opensips/

如果配置了Install Prefix,比如/usr/local/opensips/opensips2 则
位置:/usr/local/opensips/opensips2
启动项:/usr/local/opensips/opensips2/sbin/下面
认配置项:/usr/local/opensips/opensips2/etc/opensips/

保存配置项

再按左方向键←回到上一页,移动到“Save Changes ”,并按右方向键→,执行保存操作。

安装

回到上一页选择“Compile And Install OpenSIPS”,Enter执行编译。

配置日志

OpenSIPS实战(二):日志文件配置
OpenSIPS可以设置写入的设施,设施配置对应的log文件路径。默认配置的是log_facility=LOG_LOCAL0。如下配置:

vim  /etc/rsyslog.conf
# 增加一行:
local0.*   /opt/opensips.log
# 一定要创建并授权
cd /opt
touch opensips.log
sudo chmod -R 777 /opt/opensips.log
# 然后重启rsyslog服务:
/etc/init.d/rsyslog restart #(如果删除了日志文件,也要再次执行这个命令才行)

需要注意的是只有opensips.cfg配置debug_mode=no及log_stderror=no时日志才会写文件。

配置数据库

 cd /usr/local/etc/opensips/ # 或者自定义目录/usr/local/opensips/opensips2/etc/opensips
 vim opensipsctlrc

修改如下:
在这里插入图片描述
创建opensips数据库

//进入文件夹
# cd /usr/local/sbin
//创建数据库,这时候如果mysql版本为8.0以上的话会列出一系列编码选择,得mysql5.7版本不会出现这问题
opensipsdbctl create # 或者 sudo ./opensipsdbctl create
//表创建完成后(提示的两个问题都选n)

执行完成之后发现有很多表
在这里插入图片描述

配置文件 opensips.cfg

#
# OpenSIPS residential configuration script
#     by OpenSIPS Solutions <team@opensips-solutions.com>
#
# This script was generated via "make menuconfig", from
#   the "Residential" scenario.
# You can enable / disable more features / functionalities by
#   re-generating the scenario with different options.#
#
# Please refer to the Core CookBook at:
#      https://opensips.org/Resources/DocsCookbooks
# for a explanation of possible statements, functions and parameters.
#


####### Global Parameters #########

log_level=3
log_stderror=no
log_facility=LOG_LOCAL0

children=4

/* uncomment the following lines to enable debugging */
#debug_mode=yes

/* uncomment the next line to enable the auto temporary blacklisting of 
   not available destinations (default disabled) */
#disable_dns_blacklist=no

/* uncomment the next line to enable IPv6 lookup after IPv4 dns 
   lookup failures (default disabled) */
#dns_try_ipv6=yes

/* comment the next line to enable the auto discovery of local aliases
   based on reverse DNS on IPs */
auto_aliases=no


#listen=udp:127.0.0.1:5060   # CUSTOMIZE ME
#listen=tcp:127.0.0.1:5060   # CUSTOMIZE ME
listen=udp:192.168.0.44:5060   # CUSTOMIZE ME
listen=tcp:192.168.0.44:5060   # CUSTOMIZE ME
#listen=udp:0.0.0.0:5060   # CUSTOMIZE ME
#listen=tcp:0.0.0.0:5060   # CUSTOMIZE ME


####### Modules Section ########

#set module path
mpath="/usr/local/opensips/opensips2/lib64/opensips/modules/"
#mpath="/usr/local//lib64/opensips/modules/"

#### SIGNALING module
loadmodule "signaling.so"

#### StateLess module
loadmodule "sl.so"

#### Transaction Module
loadmodule "tm.so"
modparam("tm", "fr_timeout", 5)
modparam("tm", "fr_inv_timeout", 30)
modparam("tm", "restart_fr_on_each_reply", 0)
modparam("tm", "onreply_avp_mode", 1)

#### Record Route Module
loadmodule "rr.so"
/* do not append from tag to the RR (no need for this script) */
modparam("rr", "append_fromtag", 0)

#### MAX ForWarD module
loadmodule "maxfwd.so"

#### SIP MSG OPerationS module
loadmodule "sipmsgops.so"

#### FIFO Management Interface
loadmodule "mi_fifo.so"
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("mi_fifo", "fifo_mode", 0666)

#### URI module
loadmodule "uri.so"
modparam("uri", "use_uri_table", 0)

#### MYSQL module
loadmodule "db_mysql.so"

#### USeR LOCation module
loadmodule "usrloc.so"
modparam("usrloc", "nat_bflag", "NAT")
modparam("usrloc", "db_mode",   2)
modparam("usrloc", "db_url","mysql://opensips:opensipsrw@192.168.0.44:3316/opensips") # CUSTOMIZE ME


#### REGISTRAR module
loadmodule "registrar.so"
modparam("registrar", "tcp_persistent_flag", "TCP_PERSISTENT")
/* uncomment the next line not to allow more than 10 contacts per AOR */
#modparam("registrar", "max_contacts", 10)

#### ACCounting module
loadmodule "acc.so"
/* what special events should be accounted ? */
modparam("acc", "early_media", 0)
modparam("acc", "report_cancels", 0)
/* by default we do not adjust the direct of the sequential requests.
   if you enable this parameter, be sure the enable "append_fromtag"
   in "rr" module */
modparam("acc", "detect_direction", 0)
modparam("acc", "db_url","mysql://opensips:opensipsrw@192.168.0.44:3316/opensips") # CUSTOMIZE ME

#### AUTHentication modules
loadmodule "auth.so"
loadmodule "auth_db.so"
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db|uri", "db_url","mysql://opensips:opensipsrw@192.168.0.44:3316/opensips") # CUSTOMIZE ME
modparam("auth_db", "load_credentials", "")

#### DOMAIN module
loadmodule "domain.so"
modparam("domain", "db_url",	"mysql://opensips:opensipsrw@192.168.0.44:3316/opensips") # CUSTOMIZE ME
modparam("domain", "db_mode", 1)   # Use caching
modparam("auth_db|usrloc|uri", "use_domain", 1)

loadmodule "proto_udp.so"
loadmodule "proto_tcp.so" 


#### dispatcher module
loadmodule "dialog.so"
modparam("dialog", "dlg_match_mode", 1)
modparam("dialog", "default_timeout", 21600)  # 6 hours timeout
modparam("dialog", "db_mode", 2)
modparam("dialog", "db_url", "mysql://opensips:opensipsrw@192.168.0.44:3316/opensips") 

#### dispatcher module
loadmodule "dispatcher.so"
modparam("dispatcher", "db_url", "mysql://opensips:opensipsrw@192.168.0.44:3316/opensips")
modparam("dispatcher", "ds_ping_method", "OPTIONS")
modparam("dispatcher", "ds_ping_interval", 5)
modparam("dispatcher", "ds_probing_threshhold", 2)
modparam("dispatcher", "ds_probing_mode", 1)

#### load_balancer module
loadmodule "load_balancer.so"
modparam("load_balancer", "db_url", "mysql://opensips:opensipsrw@192.168.0.44:3316/opensips")
modparam("load_balancer", "probing_method", "OPTIONS")
modparam("load_balancer", "probing_interval", 30)



####### Routing Logic ########

# main request routing logic
route{
		xlog("new request in \n");
        if (!mf_process_maxfwd_header("10")) {
                sl_send_reply("483","Too Many Hops");
                exit;
        }
        if (!has_totag()) {
                record_route();
        }
        else {
                loose_route();
                t_relay();
                exit;
        }
        if (is_method("CANCEL")) {
                if ( t_check_trans() )
                        t_relay();
                exit;
        }
        if (is_method("INVITE")) {
                if (!load_balance("1","pstn","1")) {
                        send_reply("503","Service Unavailable");
                        exit;
                }
        }
        else if (is_method("1REGISTER")) {

#        		if (!load_balance("1","pstn","1")) {
#				  xlog("REGISTER at 1\n");
#                      exit; 
#               }
			xlog("REGISTER at 1\n");
#			rewritehostport("192.168.0.44:15692");
#			t_relay();

			seturi("sip:192.168.0.44:15692");
			append_hf("X-My-Custom-Header: 192.168.0.44:15692/route2\r\n");
   			forward();
			
#                if (!ds_select_dst("1", "4")) {
#                        send_reply("503","Service Unavailable");
#                        exit;
#                }
        }
        else if (is_method("REGISTER")) {
			xlog("REGISTER at 2\n");
#			t_on_reply("handle_invite_reply");
#		    lb_add("destination.group", "sip:192.168.0.44:15692");
#		    lb_add("destination.group", "sip:192.168.0.44:15692");
#		    load_balance(1, "RR");
			seturi("sip:192.168.0.44:15692");
		append_hf("Record-Route: <sip:$si;lr>\r\n");
		append_hf("Via: SIP/2.0/UDP 192.168.0.102:5066;branch=z9hG4bK8ac5a;rport\r\n");
#		append_hf("Via: SIP/2.0/UDP 192.168.0.44:5060;branch=z9hG4bK8ac5a;rport;received=192.168.0.102\r\n");
#		append_hf("Via: SIP/2.0/UDP 192.168.0.102:5066;branch=z9hG4bK8ac5a;rport;received=192.168.0.102\r\n");
#    		t_relay();
   			forward();

        }
        else {
                send_reply("405","Method Not Allowed");
                exit;
        }
        if (!t_relay()) {
                sl_reply_error();
        }
}


route[relay] {
	# for INVITEs enable some additional helper routes
	if (is_method("INVITE")) {
		
		

		t_on_branch("per_branch_ops");
		t_on_reply("handle_nat");
		t_on_failure("missed_call");
	}

	

	if (!t_relay()) {
		send_reply("500","Internal Error");
	}
	exit;
}




branch_route[per_branch_ops] {
	xlog("new branch at $ru\n");
}


onreply_route[handle_nat] {
	
	xlog("incoming reply\n");
}


failure_route[missed_call] {
	if (t_was_cancelled()) {
		exit;
	}

	# uncomment the following lines if you want to block client 
	# redirect based on 3xx replies.
	##if (t_check_status("3[0-9][0-9]")) {
	##t_reply("404","Not found");
	##	exit;
	##}

	
}




生成特定配置文件

# 进入目录
cd /usr/local/etc/opensips
# osipsconfig
./osipsconfig

操作内容
//依次选择—> Generate OpenSIPS Script —> Residential Script —> Configure Residential Script

//选中如下几项[] ENABLE_TCP[] USE_AUTH[] USE_DBACC[] USE_DBUSRLOC[*] USE_DIALOG

//按q返回,选择 —> Generate Residential Script 回车,生成新的配置文件,文件格式为opensips_residential_xxxxx.cfg,按qqq退出命令,生成新的配置文件

备份旧文件,修改新文件

# 备份原配置文件
# mv opensips.cfg opensipsold.cfg1
# 用生成的opensips_residential_xxx.cfg替换原先的opensips.cfg:
mv opensips_residential_2021-7-21_6:35:0.cfg opensips.cfg
#  编辑新生成的配置文件,修改监听端口和ip,ip把127.0.0.1改为自己的ip,保存
vim opensips.cfg

在这里插入图片描述

注意如果自定义了安装路径,需要修改模块地址
mpath=“/usr/local/opensips/opensips2/lib64/opensips/modules/”
#mpath=“/usr/local//lib64/opensips/modules/”

修改数据库配置

在这里插入图片描述

创建用户

opensipsctl add 1000 123456  //创建账号1000 密码123456
opensipsctl add 1001 123456  //创建账号1001 密码123456
//创建账号将在表subscriber新增一条记录,也可以在数据库直接修改

启动

常用命令
cd /usr/local/sbin
sudo opensipsctl start 启动服务

sudo opensipsctl stop 停止服务

sudo opensipsctl restart 重启服务

查询在线用户

./opensipsctl online

负载均衡

https://www.cnblogs.com/abnk/p/14357930.html
https://www.renrendoc.com/paper/166036126.html
https://www.dandelioncloud.cn/article/details/1499035824284049410

常见错误

ERROR: database engine not specified, please setup one in the config script

是因为opensipsctlrc配置文件中没有设置mysql信息

性能测试kylinPET

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

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

相关文章

【消息中间件】RocketMQ如何保证消息的可靠性?

文章目录 前言一 、发送端消息可靠性1. 同步发送2. 异步发送3. 单向发送4. 发送重试策略 二、存储端消息可靠性1. 存储可靠性挑战2. 同步刷盘3. 异步刷盘&#xff08;默认&#xff09;4. 过期文件删除 三、消费端消息可靠性1. 消费重试2. 死信队列3. 消息回溯 四、总结参考与感…

一文读懂“大语言模型”

1、背景 本文基于谷歌云的官方视频&#xff1a;《Introduction to Large Language Models》 &#xff0c;使用 ChatGPT4 整理而成&#xff0c;希望对大家入门大语言模型有帮助。 本课程主要包括以下 4 方面的内容&#xff1a; 大语言模型的定义描述大语言模型的用例解释提示…

网络安全分组混战靶机攻击与加固——BPlinux系列

网络安全分组混战靶机攻击与加固——BPlinux系列 目录 一、渗透过程 二、加固过程 三、中职网络安全竞赛知识星球 一、渗透过程 #这是一个以前混战阶段用的靶机然后C模块也会用 1、我们先使用nmap --scriptvuln(这是nmap自带的脚本&#xff0c;可以扫描可利用的漏洞&…

计算机网络|第四章:网络层:数据平面

前文回顾&#xff1a;第三章&#xff1a;传输层 运输层依赖于网络层的主机到主机的通信服务&#xff0c;提供各种形式的进程到进程的通信。网络层与传输层和应用层不同的是&#xff0c;在网络中的每一台主机和路由器中都有一个网络层部分。正因如此&#xff0c;网络层协议是协议…

metaRTC+ZLMediaKit实现webrtc的推拉流

概述 ZLMediaKit是一个基于C11的高性能运营级流媒体服务框架&#xff0c;是一个支持webrtc SFU的优秀的流媒体服务器系统。 metaRTC新版本支持whip/whep协议&#xff0c;支持whip/whep协议的ZLMediaKit推拉流。 信令通信 ZLMediaKit新版本支持whip和whep协议&#xff0c;支…

065:cesium设置带有箭头的线材质(material-9)

第065个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置带有箭头的线材质,请参考源代码,了解PolylineArrowMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共82行)相关API参考…

Microsoft Office 2010安装

哈喽&#xff0c;大家好。今天一起学习的是office2010的安装&#xff0c;有兴趣的小伙伴也可以来一起试试手。 一、测试演示参数 演示操作系统&#xff1a;Windows 7 不建议win10及以上操作系统使用 系统类型&#xff1a;64位 演示版本&#xff1a;SW_DVD5_Office_Profession…

Ceres简介及示例(9)On Derivatives(Numeric derivatives)

使用analytic derivatives的另一个极端是使用numeric derivatives。关键是&#xff0c;对函数f(x)关于x的求导过程可以写成极限形式: Forward Differences前向差分 当然&#xff0c;在计算机中&#xff0c;我们不能执行数值求极限操作&#xff0c;所以我们要做的是&#xff0…

squid的基本代理

一、Squid代理服务器的概述 squid 作为一款服务器代理工具&#xff0c;可以缓存网页对象&#xff0c;减少重复请求&#xff0c;从而达到加快网页访问速度&#xff0c;隐藏客户机真实IP&#xff0c;更为安全。 Squid主要提供缓存加速、应用层过滤控制的功能 1、squid代理的工…

攻击者使用“Geacon”Cobalt Strike工具瞄准macOS

威胁行为者现在正在部署一种名为 Geacon 的 Cobalt Strike 的 Go 语言实现&#xff0c;它于四年前首次出现在 GitHub 上。 他们正在使用红队和攻击模拟工具来针对 macOS 系统&#xff0c;其方式与过去几年在 Windows 平台上使用 Cobalt Strike 进行后开发活动的方式大致相同。…

Rust每日一练(Leetday0007) 删除结点、有效括号、合并链表

目录 19. 删除链表的倒数第 N 个结点 Remove-nth-node-from-end-of-list &#x1f31f;&#x1f31f; 20. 有效的括号 Valid Parentheses &#x1f31f; 21. 合并两个有序链表 Mmerge-two-sorted-lists &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Ru…

web搭建服务器端+创建web后端项目详细步骤

一、搭建服务器端 Web服务器&#xff1a;用于响应来自Web客户端&#xff08;如浏览器、移动应用程序等&#xff09;的请求并提供Web页面和其他Web资源的软件程序或计算机系统。它允许用户在Web浏览器中输入网址&#xff0c;通过HTTP协议向服务器发送请求&#xff0c;并收到Web页…

用原生JS实现虚拟列表(IT枫斗者)

用原生JS实现虚拟列表 介绍 最近在开发需求的时候&#xff0c;有用到 Antd 的虚拟列表组件 rc-virtual-list &#xff0c;粗略地看了一下源码&#xff0c;于是萌生了自己写一个虚拟列表的想法。当一个列表需要渲染大量数据的时候是非常耗时的&#xff0c;而且在列表滚动的过程…

Golang每日一练(leetDay0073) 实现前缀树、最短子数组

目录 208. 实现 Trie (前缀树) Implement-trie-prefix-tree &#x1f31f;&#x1f31f; 209. 长度最小的子数组 Minimum-size-subarray-sum &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每…

多线程的三种创建方式及各自的优缺点分析

第一种方式&#xff1a;继承Thread类&#xff0c;覆写run()方法 1、创建一个MyThread类&#xff0c;继承Thread类&#xff1b; 2、覆写run()方法&#xff0c;在run()方法内编写任务代码&#xff1b; 3、创建MyThread类&#xff0c;需要注意的是&#xff0c;如果想要给线程命名…

传染病学模型 | Matlab实现SI传染病学模型 (SI Epidemic Model)

文章目录 效果一览基本描述模型介绍程序设计参考资料效果一览 基本描述 传染病学模型 | Matlab实现SI传染病学模型 (SI Epidemic Model) 模型介绍 SI传染病模型是一种基于微分方程的流行病学模型,用于模拟传染病在人群中的传播过程。SI模型中,人群被划分为易感者(S)和感染者…

来 Azure 学习 OpenAI 四 - 用 Embedding 赋能 GPT

大家好&#xff0c;我是学生大使 Jambo。在我们前一篇文章中&#xff0c;我们介绍了 OpenAI 模型的调用。今天&#xff0c;我将为大家介绍 Embedding 的使用。 嵌入是什么 嵌入&#xff08;Embedding &#xff09;是一种将高维数据映射到低维空间的方法。嵌入可以将高维数据可…

第一章 初识Python

1.1 课前必读 课程大纲 1.2 Python介绍 Python特点&#xff1a; 主流语言&#xff1b;用途广泛&#xff0c;号称万能语言&#xff1b;上手简单&#xff1b; Python用途&#xff1a; 数据挖掘&#xff08;爬虫&#xff09;和数据分析自动化脚本编写&#xff08;软件测试人员使用…

尚硅谷周阳老师 SpringCloud第二季学习笔记

前言&#xff1a;首先感谢尚硅谷周阳老师的讲解&#xff0c;让我对springcloud有了很好的理解&#xff0c;周阳老师的讲课风格真的很喜欢&#xff0c;内容充实也很幽默&#xff0c;随口一说就是一个段子&#xff0c;我也算是周阳老师的忠实粉丝啦。 先说说课程总体内容 以下是…

[学习笔记] [机器学习] 6. [上]决策树算法(熵Entropy、信息增益(率)、基尼值(指数)、CART剪枝、特征工程特征提取、回归决策树)

视频链接数据集下载地址&#xff1a;无需下载 学习目标&#xff1a; 掌握决策树实现过程知道信息熵的公式以及作用知道信息增益、信息增益率和基尼指数的作用知道id3、c4.5、cart算法的区别了解cart剪枝的作用知道特征提取的作用应用DecisionTreeClassifier实现决策树分类 1…