I built an online livestream platform using OBS and Nginx, implementing RTMP streaming and HLS storage. I encountered some challenges with router configurations for different site applications, which was kind of torching.





2025.8.29 Updated:

在管理网络流量方面,Nginx 是一个强大且灵活的反向代理服务器,能够基于子域名和特定文件夹路径进行路由。


配置中的关键点总结

1. 子域名路由:通过子域名隔离服务

在这个配置中,子域名 admin.ecokayizasweb.xyz 专门用于服务 Strapi 后端应用。这是通过以下代码块实现的:

    # sub domain for strapi
    upstream strapi {
        server 127.0.0.1:8004; # 如果你的 Strapi 用的是 8004端口
    }

    server {
        listen 80;
        server_name admin.ecokayizasweb.xyz;

        location / {
            proxy_pass http://strapi;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
  • 为什么使用子域名? 子域名可以逻辑和功能上分离不同的网络服务。例如,admin.ecokayizasweb.xyz 服务管理后台,而主域名 (ecokayizasweb.xyz) 则处理面向公众的内容。
  • 灵活性:你可以独立扩展每个子域名的服务,为其分配不同的服务器资源。

2. 基于路径的路由:组织具体功能的访问路径

该配置还展示了使用基于路径的路由来组织和服务不同功能。

这部分需要严格注意App中的路由问题,还可能需要借助中间件同一路径

示例:/ros//vis/ 路径

location /vis/ {
    proxy_pass http://127.0.0.1:8000/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Script-Name /vis; # 确保后端应用正确处理路径
}
  • 目的:这些路径在主域名下为特定的后端服务提供服务,例如 /ros//vis/。通过分配唯一的前缀,可以在同一个域名上运行多个服务而不会发生冲突。
  • 脚本名称头X-Script-Name 头确保后端应用能够识别其路径,从而实现无缝集成。

3. 静态内容服务:优化文件交付

配置中包含了对静态文件的处理,例如 /live/pictures//vis/static/ 路径:

这里就体现文件路径路由方法的坏处了

location /live/pictures/ {
    alias /home/admin/homePage/live/pictures/;
    access_log off;
    expires 30d;
}

location /vis/static/ {
    alias /home/admin/Vis_Design/static/;
    access_log off;
    expires 30d;
}
  • 主要特点
    • 路径别名:将 URL 路径映射到服务器上的特定目录。
    • 缓存expires 30d; 指令确保静态文件缓存 30 天,从而减轻服务器负载并改善用户体验。

4. 特殊处理:直播和 HLS

该配置还集成了 RTMP 和 HLS 支持,用于直播流的高级路由:

rtmp {
    server {
        listen 1935;  # RTMP 默认端口
        chunk_size 4096;

        application live {
            live on;
            record off;

            # HLS 配置
            hls on;
            hls_path /tmp/hls;
            hls_fragment 3s;
            hls_playlist_length 60s;
        }
    }
}
  • 用途:通过 HLS 实现实时媒体流,确保即使是直播活动也能平稳交付。
  • 跨域访问:如 /hls/ 路径中设置的 Access-Control-Allow-Origin * 头允许客户端无缝集成。

5. WebSocket 支持:实时通信

WebSocket 连接通过 /socket.io/ 路径高效处理:

location /socket.io/ {
    proxy_pass http://127.0.0.1:8001/socket.io/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}
  • 功能:支持实时更新,例如通知或实时数据流。
  • 协议升级:无缝处理 HTTP 到 WebSocket 的协议升级。