以下为opensips在ubuntu22服务器上的部署教程,使用官方的apt仓库进行部署。降低部署难度,而不是各种编译教程。
一般来说,推荐使用apt仓库安装官方版,而不是自行编译,编译过程中,可能遇到依赖、版本等问题,且每次更新维护均需要手动进行, 使用官方apt仓库,可以使用 apt update && apt upgrade
随时更新到最新版。
此处安装的是 opensips 3.4 版本
添加官方仓库
官方提供了仓库源地址:
https://apt.opensips.org/
其他系统版本可查看官方教程即可,使用 root 用户执行以下命令:
curl https://apt.opensips.org/opensips-org.gpg -o /usr/share/keyrings/opensips-org.gpg
# 添加 opensips 仓库
echo "deb [signed-by=/usr/share/keyrings/opensips-org.gpg] https://apt.opensips.org jammy 3.4-releases" >/etc/apt/sources.list.d/opensips.list
# 添加 opensips-cli仓库,用于管理 opensips 的命令行工具
echo "deb [signed-by=/usr/share/keyrings/opensips-org.gpg] https://apt.opensips.org jammy cli-nightly" >/etc/apt/sources.list.d/opensips-cli.list
安装 opensips
添加官方仓库后,使用 apt 即可安装:
apt update
apt install opensips opensips-mysql-modules opensips-auth-modules opensips-cli
执行命令:osipsconfig
生成指定的配置文件,默认配置文件没有mysql、授权等功能
依次选择—> Generate OpenSIPS Script —> Residential Script —> Configure Residential Script
选中如下几项
[*] ENABLE_TCP
[*] USE_AUTH
[*] USE_DBACC
[*] USE_DBUSRLOC
[*] USE_DIALOG
[*] USE_NAT
按q返回,选择 —> Generate Residential Script 回车,生成新的配置文件,文件格式为opensips_residential_xxxxx.cfg,按qqq退出命令,生成新的配置文件
生成的配置文件默认存储在 /etc/opensips/
目录下,需要到此目录,覆盖默认 cfg 文件
其他模块备忘录
USE_ALIASES
:用于设置呼叫别名,例如 1000 用户,设置别名为 2000,呼叫 2000,此时 1000 会响铃USE_MULTIDOMAIN
:用于设置 domain ,多租户设置,例如 1000@192.168.2.22 和 1000@192.168.2.33 是不同的两个用户,用于多平台分流USE_NAT
: 用于开启 rtpproxy,如果用户处于内网 nat 环境,则需要rtpproxy转发音视频数据
一般来说
USE_NAT
需要开启,USE_ALIASES
建议开启,可以灵活设置
注意
如果需要修改 opensips 监听的地址,不得改为 0.0.0.0
:
# 例如:默认 socket 监听 tcp 端口
socket=tcp:127.0.0.1:5060
# 如果改为 0.0.0.0 监听将导致无法连接,或者直接失败
# 此项配置将导致无法连接的问题
socket=tcp:0.0.0.0:5060
# 必须监听指定的 ip
socket=tcp:192.168.1.100:5060
初始化数据库
如果没有安装 mysql 或 mariadb 数据库,可以使用apt 安装 mariadb 数据库
sudo apt update
sudo apt install mariadb-server
使用数据库管理工具,创建一个用户名为:opensips
创建过程不多赘述,例如使用 phpMyAdmin 或者 mysql 命令行等等
编辑 opensips-cli
配置文件:
vim /etc/opensips/opensips-cli.cfg
向此文件写入内容:
[default]
#database_modules: acc clusterer dialog dialplan dispatcher domain rtpproxy usrloc
database_modules: ALL
#database_admin_url: postgresql://root@localhost
database_url: mysql://opensips:<此处改为密码>@127.0.0.1
database_name: opensips
执行命令:
opensips-cli -x database create
第一步要求输入数据库root密码, 直接回车即可跳过
先创建的 opensips 空白数据库,然后授予了 opensips用户访问权限,由于原本的opensips数据库名称存在,可能会失败,需要创建并授权后,删除再使用命令行执行
随后在 数据库中就会创建一个 opensips 的数据库
启动
注意 cfg 配置文件的归属用户:
chown opensips:opensips /etc/opensips/opensips.cfg
在修改配置文件的过程中,如果进行了操作导致配置文件归属于 root,则可能导致启动失败,因为启动进程是 opensips ,无法读取到配置文件
其他配置
vim /lib/systemd/system/opensips.service
# 此行可以修改内存限制
# -N 参数限制 tcp 工作进程为 1 个
# -n 参数限制 udp 工作进程为 1 个
ExecStart=/usr/sbin/opensips -P %t/opensips/opensips.pid -f /etc/opensips/opensips.cfg -m 128 -M 128 -N 1
# /etc/opensips/opensips.cfg 中限制 udp 工作进程数
## udp_workers=1
命令行启动即可
systemctl start opensips
安装 opensips-cp 控制面板
控制面板可以直接部署,使用 nginx + php 部署,源码地址:https://github.com/OpenSIPS/opensips-cp/tree/master
参考教程:https://www.cnblogs.com/roverq/p/18370589
官方安装教程:https://controlpanel.opensips.org/htmldoc_9_X_X/INSTALL.html
官方使用的 apache 部署,实际上仅仅是 http服务,可以使用 nginx
下载源码后,安装 nginx 、安装 php
sudo apt install -y nginx php php-curl php-gd php-pear php-cli php-mysql php-apcu libapache2-mod-php unzip
将下载的 opensips-cp 源码文件,解压到:/var/www/
目录,:
/var/www/opensips-cp
解压后,需要修改文件的数据库配置,如果前面修改了opensips 默认密码的话:
vim /var/www/opensips-cp/config/db.inc.php
# 修改以下字段:
//database driver mysql or pgsql
$config->db_driver = "mysql";
//database host
$config->db_host = "127.0.0.1";
//database port - leave empty for default
$config->db_port = "";
//database connection user
$config->db_user = "opensips";
//database connection password
$config->db_pass = "修改数据库密码";
使用命令行加载 opensips-cp 默认配置项(创建管理用户):
mysql -u root -p
# 输入密码进入数据库
# 以下操作在数据库中进行
> use opensips;
> source /var/www/opensips-cp/config/db_schema.mysql
> exit
也可以使用 phpMyAdmin,选中数据库后,导入 mysql 文件
添加定时任务
定时任务用来监控 opensips 运行状态:
sudo cp /var/www/opensips-cp/config/tools/system/smonitor/opensips_stats_cron /etc/cron.d/
sudo systemctl restart cron
注意:在 cp 定时任务前,可以修改 其中的运行用户 root 为 www-data ,降低运行权限,提高安全性
配置nginx
在 /etc/nginx/conf.d
中,添加一个 nginx 配置项:
server{
listen 80; listen [::]:80;
listen 443 ssl http2; listen [::]:443 ssl http2;
server_name example.com; # 修改域名
# 此处添加以下 https 相关配置
root /var/www/opensips-cp/web;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
# index index.html;
charset utf-8;
# 配置其他路径
location / {
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php?/$1 last;
# rewrite ^/(.*)$ /index.html?/$1 last;
# rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}
try_files $uri $uri/ /index.php?$query_string;
}
location ~ [^/]\.php(/|$) {
include snippets/fastcgi-php.conf;
# 注意,这里的 fpm.sock 根据不同的 php 版本,此处文件不同,需要注意修改
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}
重启 nginx即可
nginx -t && nginx -s reload
访问后,第一时间修改默认密码: admin/opensips
opensips nat相关配置
https://blog.opensips.org/2017/10/25/running-opensips-in-the-cloud/
opensips 运行与 ip 息息相关,对于服务器、用户1 -》 用户2 ,三者均需要公网ip才能提供 直接的拨号或视频通话,sip 仅仅是握手协议,数据传输是 一对一。在如今网络环境,ipv4几乎全都是 nat 环境。所以必须配置 nat相关的设置
配置外网端口
如果 opensips 运行在内网环境,必须将公网ip配置到 opensips中,否则无法正确的连接到服务器
advertised_address="<必须填写公网ip地址,端口可以映射>"
外部域名访问
官方文章: https://www.opensips.org/Documentation/Script-CoreParameters-3-1#toc5 在配置中增加:
alias=udp:<域名>:5060
alias=tcp:<域名>:5060
auto_aliases=yes
auto_aliases=1
必须配置 alias 后才能使用域名访问,否则只能使用 ip 连接
rtpproxy 配置
rtpproxy apt仓库自带的版本特别低,这个必须要编译安装
仓库地址:https://github.com/sippy/rtpproxy
安装命令
$ git clone -b master https://github.com/sippy/rtpproxy.git
$ git -C rtpproxy submodule update --init --recursive
$ cd rtpproxy
# configure --prefix=/home/admin/software/rtpproxy
# 可以指定 prefix 配置安装目录,不影响使用
$ ./configure
$ make
运行 rtpproxy
# 注意,要开放 25000 - 25020 端口映射,用来进行数据转发
./rtpproxy -A <这里必须填公网ip> -l 192.168.1.12 -s udp:127.0.0.1:12221 -F -m 25000 -M 25020
# opensips 配置中,修改 rtpproxy 一致
modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:12221") # CUSTOMIZE ME
其他问题备忘
单独开启 tcp 端口的时候,能够进行短信或呼叫,但一旦断开,恢复时间很长,tcp + udp 双端口开放后,连接质量更高,不会轻易断开
使用tcp控制协议,在手机中,如果手机锁屏,将导致直接断开,状态不正确,也许是没有心跳连接保活状态等等。
更换到 udp 协议,在手机锁屏后,唤醒之后,可立即发送消息
udp 与 tcp 协议选择
tcp 存在假死情况,可能显示在线,但对方无法发送消息,udp 接通率更高,但存在一些问题,例如:开启视频通话按钮,可能对方无反应,udp 丢失协议包
linphone 后台运行
如果在手机上使用linphone,锁屏后,消息互发可能会失败,判断为锁屏后,tcp 或 udp接收被系统中断