Loading... ## 背景 在企业内经常遇到内部分享、培训等场景,但是如果都用外网直播的话,一堆人访问那么公网带宽肯定扛不住~ 当然商业化的也有很多方案可以解决这个问题,但是动不动就是几十万,伤不起~ 先看架构图 ## 架构 ![请输入图片描述](https://minio-api.open.yantao.wiki:16666/blog-image/2024/10/05/6700d53b2a9f1.png) 简单的讲解下: 主播通过OBS工具,推到SRS的边缘节点(Edge)或者源节点(Origin)。当然单节点可以不是用Nginx,因为Nginx和Edge是同一个机器,起不到什么负载的情况。 ## SRS官方介绍 ![](https://minio-api.open.yantao.wiki:16666/blog-image/2024/10/05/6700d54b4cc76.png) ![](https://minio-api.open.yantao.wiki:16666/blog-image/2024/10/05/6700d57fd0d77.png) ## 部署介绍 我这边采用的是HTTP-FLV ### 边缘节点配置 #### 配置文件 ``` listen 1935; max_connections 1000; daemon on; srs_log_tank console; http_api { enabled on; listen 1985; https { enabled on; listen 1990; key ./custom/server.key; cert ./custom/server.crt; } } http_server { enabled on; listen 8080; dir ./objs/nginx/html; https { enabled on; listen 8088; key ./custom/server.key; cert ./custom/server.crt; } } srt_server { enabled on; listen 10080; maxbw 1000000000; connect_timeout 4000; peerlatency 0; recvlatency 0; latency 0; tsbpdmode off; tlpktdrop off; sendbuf 2000000; recvbuf 2000000; } # @doc https://github.com/ossrs/srs/issues/1147#issuecomment-577607026 vhost __defaultVhost__ { cluster{ mode remote; origin 10.152.9.173:1935; } http_remux { enabled on; mount [vhost]/[app]/[stream].flv; } hls { enabled on; hls_fragment 10; hls_window 60; hls_path ./objs/nginx/html; hls_m3u8_file [app]/[stream].m3u8; hls_ts_file [app]/[stream]-[seq].ts; } srt { enabled on; srt_to_rtmp on; } } # For SRT to use vhost. vhost srs.srt.com.cn { } stats { network 0; } ``` #### docker-compose ``` version: '3' services: srs: image: registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 volumes: - /root/srs/srs.conf:/usr/local/srs/conf/srs.conf - /root/srs/custom:/usr/local/srs/custom # command: ./objs/srs -c conf/rtmp2rtc.conf command: ./objs/srs -c conf/srs.conf container_name: srs-jz network_mode: my_custom_network ports: - "1935:1935" - "1985:1985" - "8080:8080" - "8088:8088" - "8000:8000/udp" - "1990:1990" - "10080:10080/udp" ``` ### 源节点配置 #### 配置文件 ``` listen 1935; max_connections 1000; daemon off; srs_log_tank console; http_api { enabled on; listen 1985; https { enabled on; listen 1990; key ./custom/server.key; cert ./custom/server.crt; } } http_server { enabled on; listen 8080; dir ./objs/nginx/html; https { enabled on; listen 8088; key ./custom/server.key; cert ./custom/server.crt; } } # @doc https://github.com/ossrs/srs/issues/1147#issuecomment-577607026 vhost __defaultVhost__ { http_remux { enabled on; mount [vhost]/[app]/[stream].flv; } hls { enabled on; hls_fragment 2; hls_window 10; hls_path ./objs/nginx/html; hls_m3u8_file [app]/[stream].m3u8; hls_ts_file [app]/[stream]-[seq].ts; } } stats { network 0; } ``` #### docker-compose ``` version: '3' services: srs: image: registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 volumes: - /data/srs/conf:/usr/local/srs/custom command: ./objs/srs -c custom/srs.conf container_name: srs-origin ports: - "1935:1935" - "1985:1985" - "8080:8080" - "8088:8088" - "8000:8000/udp" - "1990:1990" - "10080:10080/udp" environment: - CANDIDATE=xxx.xxx.xxx.xxx ``` ## Nginx Edge Server ### 缓存配置 路径:/etc/nginx/conf.d/srs-cache.conf ``` proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=srs_cache:8m max_size=1000m inactive=600m; proxy_temp_path /data/nginx-cache/tmp; log_format main_cache '$upstream_cache_status $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main_cache; ``` ### 转发配置 路径:/etc/nginx/default.d/srs-cache.conf ``` proxy_cache_valid 404 10s; proxy_cache_lock on; proxy_cache_lock_age 300s; proxy_cache_lock_timeout 300s; proxy_cache_min_uses 1; location ~ /.+/.*\.(m3u8)$ { proxy_set_header Host $host; proxy_pass http://127.0.0.1:8080$request_uri; proxy_cache srs_cache; proxy_cache_key $scheme$proxy_host$uri$args; proxy_cache_valid 200 302 10s; add_header X-Cache-Status $upstream_cache_status; } location ~ /.+/.*\.(ts)$ { proxy_set_header Host $host; proxy_pass http://127.0.0.1:8080$request_uri; proxy_cache srs_cache; proxy_cache_key $scheme$proxy_host$uri; proxy_cache_valid 200 302 3600s; add_header X-Cache-Status $upstream_cache_status; } location ~ /.+/.*\.(flv)$ { proxy_pass http://127.0.0.1:8080$request_uri; } ``` ### 判断缓存是否生效 何判断缓存有没有生效呢?可以在NGINX日志中,加入一个字段upstream\_cache\_status,分析NGINX日志来判断缓存是否生效: ``` log_format main '$upstream_cache_status $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; ``` 第一个字段就是缓存状态,可以用下面的命令分析,比如只看TS文件的缓存情况: ``` cat /var/log/nginx/access.log | grep '.ts HTTP' \ | awk '{print $1}' | sort | uniq -c | sort -r ``` 可以看到哪些是HIT缓存了,就不会从SRS下载文件,而直接从NGINX获取文件了。 ## 相关资料 开源方案:[https://github.com/ossrs/srs](https://github.com/ossrs/srs) Edge Server:[https://ossrs.io/lts/zh-cn/docs/v5/doc/edge](https://ossrs.io/lts/zh-cn/docs/v5/doc/edge) Nginx Edge Server:[https://github.com/ossrs/oryx/tree/main/scripts/nginx-hls-cdn](https://github.com/ossrs/oryx/tree/main/scripts/nginx-hls-cdn) 页面播放器:[https://h5player.bytedance.com/guide/#%E5%AE%89%E8%A3%85](https://h5player.bytedance.com/guide/#%E5%AE%89%E8%A3%85) 最后修改:2024 年 10 月 05 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏