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 的协议升级。