Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,因此TSINGSEE青犀视频云边端架构视频智能分析平台在运行时也会使用nginx服务器。

部分情况下,EasyNVR启动时只带起来了一个nginx,但是一个nginx的能力不能满足EasyNVR直播转码分发以及存储的需求,因此这时我们需要启动多个nginx。本文就讲一下启动多个Nginx的方法。

在EasyNVR程序启动的时候,会默认启动一个nginx,我们可以查看这部分代码,仿照这部分代码编写启动多个nginx的代码。

func Start() (err error) {exe := EXE()MutliStrart(exe, 0)enable := utils.Conf().Section("base_config").Key("multi_nginx_enable").MustBool(false)if enable {number := utils.Conf().Section("base_config").Key("multi_nginx_number").MustInt()for i := 1; i < number; i++ {MutliStrart(MultiEXE(i), i)}}return
}

在启动的时候,默认会先启动EasyNVR里面默认的nginx,然后根据配置文件启动多个nginx,参考代码如下:

func MutliStrart(exe string, index int) (err error) {if exe == "" {err = fmt.Errorf("dss bin path not found")return}pids, _ := filepath.Glob(filepath.Join(filepath.Dir(exe), "logs/*.pid"))if pids != nil && index == 0 {utils.Logf("%s find pid file", filepath.Base(exe))if err := Stop(); err == nil {//wait for stop donefor i := 0; i < 10; i++ {time.Sleep(1 * time.Second)pids, _ := filepath.Glob(filepath.Join(filepath.Dir(exe), "logs/*.pid"))if pids == nil {log.Printf("%s wait for stop done", filepath.Base(exe))break}}}}//var httpPort int//var rtmpPort int//if index != 0 {// httpPort = int(GetHTTPPort()) + index// rtmpPort = int(GetRTMPPort()) + index// SetMutliHTTPPort(uint(httpPort), index)// SetMutliRTMPPort(uint(rtmpPort), index)//}if utils.IsPortInUse(int(GetHTTPPort())) && index == 0 {err = fmt.Errorf("port[%d] In Use", GetHTTPPort())return}if utils.IsPortInUse(int(GetRTMPPort())) && index == 0 {err = fmt.Errorf("port[%d] In Use", GetRTMPPort())return}err = utils.EnsureDir(HLSDir())if err != nil {log.Println(err)return}err = utils.EnsureDir(RecordDir())if err != nil {log.Println(err)return}err = utils.EnsureDir(filepath.Join(filepath.Dir(exe), "logs"))if err != nil {log.Println(err)return}err = utils.EnsureDir(filepath.Join(filepath.Dir(exe), "temp"))if err != nil {log.Println(err)return}cmd := exec.Command(exe)cmd.Dir = filepath.Dir(exe)cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow:    true,CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,}err = cmd.Start()if err != nil {log.Printf("start dss error, %v", err)return}go func() {if err := cmd.Wait(); err != nil {log.Printf("wait dss error, %v", err)}}()if index == 0 {go StartTicker()} else {go StratMutliTicker(index)}if index == 0 {log.Println("%s start ok, rtmp port[%d], http port[%d]", filepath.Base(exe), GetRTMPPort(), GetHTTPPort())} else {log.Println("%s start ok, rtmp port[%d], http port[%d]", filepath.Base(exe), GetMutliRTMPPort(index), GetMutliHTTPPort(index))}return
}

至此,启动多个nginx代码就可以了。但是,现在EasyNVR每个通道还是向默认的nginx进行推流录像,推流直播,因此我们需要在相应的地方进行修改。

func (channel *ChannelInfo) InitPushers(camera *models.Camera) {channel.lock.Lock()defer channel.lock.Unlock()if channel.client == nil {return}rtmpHost := utils.Conf().Section("base_config").Key("rtmp_host").MustString("")// 根据配置文件enable := utils.Conf().Section("base_config").Key("hls_record_enable").MustBool(true)var application = ""if enable {application = "hls"} else {application = "record"}if rtmpHost == "" {var rtmpPort uintenable := utils.Conf().Section("base_config").Key("multi_nginx_enable").MustBool(false)if enable {number := utils.Conf().Section("base_config").Key("multi_nginx_number").MustInt()channelId := int(channel.Channel)index := channelId % numberrtmpPort = dss.GetMutliRTMPPort(index)} else {rtmpPort = dss.GetRTMPPort()}channel.localPusher = stream.NewStreamPusher(fmt.Sprintf("%s - 推流直播", camera.Name), fmt.Sprintf("rtmp://127.0.0.1:%d/%s/%s", rtmpPort, application, StreamID(camera.ID)))channel.localPusher.AudioEnable = camera.Reserve1 == "1"channel.recordPusher = stream.NewStreamPusher(fmt.Sprintf("%s - 推流录像", camera.Name), fmt.Sprintf("rtmp://127.0.0.1:%d/record/%s", rtmpPort, StreamID(camera.ID)))channel.recordPusher.AudioEnable = camera.Reserve1 == "1"} else {channel.localPusher = stream.NewStreamPusher(fmt.Sprintf("%s - 推流直播", camera.Name), fmt.Sprintf("rtmp://%s/%s/%s", rtmpHost, application, StreamID(camera.ID)))channel.localPusher.AudioEnable = camera.Reserve1 == "1"channel.recordPusher = stream.NewStreamPusher(fmt.Sprintf("%s - 推流录像", camera.Name), fmt.Sprintf("rtmp://%s/record/%s", rtmpHost, StreamID(camera.ID)))channel.recordPusher.AudioEnable = camera.Reserve1 == "1"}

经过这样修改后,例如:
EasyNVR配置启动3个nginx,通道1就向nginx1推流,通道2就向nginx2推流,通道3就向nginx3推流,通道4就向nginx1推流…每隔3个通道一次轮回。至此,EasyNVR多nginx方案就已经实现了。

EasyNVR视频平台被运用在很多场景下,包括智慧水利、智慧交通、校园安防等,当然还有更多的场景在拓展当中,如果大家有需求,欢迎联系我们,TSINGSEE青犀视频团队将根据大家的需求出具最合适的解决方案。

RTSP协议视频流媒体安防智能分析平台EasyNVR如何启动多个nignx?相关推荐

  1. 安防智能视频平台EasyNVR无法接入EasyNVS并报错Login error的排查与解决

    在很多项目现场中,EasyNVR受到网络环境的多方面限制,所以我们推出了EasyNVS云管理平台,可以利用它突破用户现场网络的限制,在外网条件下获取内网EasyNVR的所有视频能力,并对EasyNVR ...

  2. RTSP协议视频智能分析平台EasyNVR在编码格式不同的情况下会导致视频无法播放吗?

    RTSP协议的视频智能分析平台EasyNVR内接入的视频通道可以通过平台进行网页直播,并且支持市面上大部分的RTSP/Onvif协议设备:IP Camera/NVR/DVR/编码器等,直播便捷稳定,是 ...

  3. TSINGSEE青犀视频云-边-端架构视频智能分析平台EasyNVR如何实现直播地址和录像地址统一

    TSINGSEE青犀视频云-边-端架构视频智能分析平台EasyNVR分为直播版和录像版,直播版内没有视频存储以及视频录像检索.回看的功能,而录像版则具备直播+存储+录像回看功能,两者大家可以自由选择. ...

  4. RTSP协议视频智能分析平台EasyNVR如何获取云端录像的视频快照截图?

    TSINGSEE青犀视频智能分析平台内一个功能是获取直播快照,比如EasyNVR视频直播中可以获取到直播快照的截图,但在实际使用中,也有用户需要获取云端录像快照. 使用过EasyNVR获取直播快照功能 ...

  5. 【解决方案】GB28181/RTSP/SDK/Ehome协议支持级联视频智能分析平台EasyCVR搭建小区园区视频监控系统

    一.背景分析 在社会信息化飞速迈进的今天,人们对住宅的关注已经不再局限于居室面积.周边环境.交通等方面,而是把更多的兴趣和注意力放在与外界沟通.信息服务.安全防范.物业管理方面,这就要求传统的住宅小区 ...

  6. 【解决方案】GB28181/RTSP/SDK/Ehome协议支持级联视频智能分析平台EasyCVR如何搭建小区/园区视频监控系统

    一.背景分析 在社会信息化飞速迈进的今天,人们对住宅的关注已经不再局限于居室面积.周边环境.交通等方面,而是把更多的兴趣和注意力放在与外界沟通.信息服务.安全防范.物业管理方面,这就要求传统的住宅小区 ...

  7. 【解决方案】如何通过RTSP协议安防视频直播平台EasyNVR打造智慧校园监控联网解决方案?

    学生是社会的弱势群体,自身的安全意识和保护意识比较薄弱,更是社会不法分子实施犯罪的对象,如何保障孩子的安全是学校.孩子家长乃至全社会最为关注的焦点,建立一套基于监控系统的智能保护网,可以让学校.家长. ...

  8. 就地过年带旺“云游”,RTSP协议视频监控智能分析平台EasyNVR助力景区“慢直播”

    牛年春节,就地过年发掘新年味,本地游成为新年俗.2021年"就地过年"的倡议让人们纷纷取消回乡过年或异地旅游计划,选择在本地短周期.近距离.慢节奏地休闲度假,以不同于以往的方式喜迎 ...

  9. 安防智能视频平台EasyCVR后台界面流量统计显示问题的优化

    EasyCVR是一个集视频联网共享.存储.流媒体转发.视频转码.视频上云.智能分析等多种功能为一体的流媒体视频服务融合型平台.EasyCVR的接入协议十分广泛,包括主流标准协议国标GB28181.RT ...

最新文章

  1. redis 计数器 java_Redis 实践汇总和使用建议。
  2. C#开源类库推荐:拼多多开放平台SDK,开源免费,支持.NET Core!
  3. AndroidStudio出现 Unknown verification type [95] in stack map frame 问题的解决办法
  4. 关于IEnumeratorT泛型枚举器 和 IEnumerableT
  5. SVN使用过程中出现“工作副本已经锁定”的解决办法
  6. Win11不能拖拽图片到任务栏软件上快速打开怎么办
  7. 基于RFID定位技术的固定资产管理,RFID资产管理带给你无限可能--新导智能
  8. 能完成加减乘除以及开根号的Java计算器
  9. PHP:【商城后台管理系统】admin超级管理员后台登录界面部署
  10. 高等数学(Calculus I)
  11. 读《我喜欢生命本来的样子》记(一)
  12. Centos6.8下安装Mysql5.6.14,连接mysql及增删改查,通过Mysql-Front远程连接(开启端口、允许远程连接)
  13. 你大概走了假敏捷:《手绘敏捷宝典》在此,还不来收!
  14. JavaScript--AJAX页面传值
  15. java.sql.SQLException: Invalid utf8 character string: 'ACED00'
  16. node.js+uni计算机毕设项目计算机配件价格查询微信小程序(程序+小程序+LW)
  17. Spring学习笔记(三十二)——SpringBoot中cache缓存的介绍和使用
  18. Service层需要接口吗
  19. 无线路由Buffalo G300N V2 CH小测
  20. 【转】JAVA中Cookie MaxAge属性及其使用

热门文章

  1. 软测面试被问:除了SIT测试,你之前还做过UAT测试吗?
  2. 手机无线耳机什么牌子好?手机蓝牙耳机十大品牌排行榜!
  3. Spring JDBC
  4. 【JavaScript】JS库:numbro
  5. 海康威视web 开发包3.2无插件踩坑点
  6. 基于ERP集成的流程制造管理系统
  7. Django后台数据导出为excel并下载
  8. Solaris10 网卡驱动安装(Intel(R) Pro/100 VM Network Connection网卡)
  9. Javaweb实现电子商城在线购物网站的购物车作业界面案例SSM JavaScript jQuery
  10. Android断点下载时异常:java.io.IOException: unexpected end of stream,请问该怎么解决