opensips服务器搭建与部署

opensips服务器搭建与部署

以下为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.221000@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接收被系统中断

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://zwc365.com/2025/02/10/opensips服务器搭建与部署

Buy me a cup of coffee ☕.