Nginx RTMP on_publish未触发Vercel部署的Next.js API端点问题
Nginx RTMP on_publish指令无法触发Vercel部署的Next.js API端点
问题详情
- 通过Postman手动发送POST请求至API端点,可正常更新数据库
- Nginx的on_publish指令发起的请求未到达API,既未出现在Vercel日志中,也未更新数据库
- Nginx日志无相关错误,但从Nginx服务器用curl测试端点时返回“Redirecting...”消息
环境信息
- 安装了libnginx-mod-rtmp模块的Nginx
- 部署在Vercel上的Next.js应用
- 用于接收数据并更新MongoDB Atlas的API端点
Nginx配置(/etc/nginx/nginx.conf)
rtmp { server { listen 1935; # ... 其他配置 application live { live on; record off; on_publish http://example.com/api/stream/startStream?streamKey=test; on_publish_done http://example.com/api/stream/endStream?streamKey=test; } } }
Next.js API端点(/api/stream/startStream)
export async function POST( req: NextRequest ): Promise<NextResponse<ResponseData>> { try { // 连接数据库逻辑 // ... // 获取streamKey并存入数据库 const streamKey = req.nextUrl.searchParams.get("streamKey"); if (!streamKey) { return NextResponse.json({ msg: "Streamkey is not defined", data: false, }); } const insertedStreamKey = await connectedStreams.insertOne({ streamKey: streamKey, }); if (!insertedStreamKey) { return NextResponse.json({ msg: "Streamkey couldn't be inserted!", data: false, }); } return NextResponse.json({ msg: "User is successfully connected", data: true, }); } catch (error) { // 错误处理逻辑 // ... } }
已执行的排查步骤
- 验证Nginx on_publish的URL(Postman请求正常且能在API日志中查看)
- 从Nginx服务器通过curl发送直接请求测试
- 检查网络问题、SSL/TLS配置错误及重定向行为
解决方案
1. 处理HTTPS重定向问题
Vercel默认会将HTTP请求重定向到HTTPS,但Nginx RTMP模块默认发送HTTP请求且不自动跟随重定向。修改on_publish的URL为HTTPS:
on_publish https://example.com/api/stream/startStream?streamKey=test; on_publish_done https://example.com/api/stream/endStream?streamKey=test;
2. 确保Nginx能访问HTTPS端点
检查Nginx服务器是否安装了必要的CA证书,避免SSL证书验证失败。可临时关闭证书验证测试(生产环境不建议):
on_publish https://example.com/api/stream/startStream?streamKey=test; on_publish_verify off;
3. 匹配请求方法与API规则
Nginx RTMP的on_publish默认发送GET请求,但你的API仅处理POST请求。有两种解决方式:
- 修改Nginx配置,强制发送POST请求:
on_publish { set $publish_url https://example.com/api/stream/startStream; set $publish_method POST; set $publish_body streamKey=test; publish_request; }
- 在Next.js API中兼容GET请求:
export async function POST(req: NextRequest) { /* 现有逻辑 */ } export async function GET(req: NextRequest) { // 复用POST中的处理逻辑 return await POST(req); }
4. 检查Vercel的IP访问限制
确认Nginx服务器的公网IP未被Vercel防火墙拦截,可在Vercel仪表板的安全设置中添加该IP到允许列表。
5. 启用RTMP请求日志排查
修改Nginx配置开启RTMP日志,便于追踪请求发送情况:
rtmp { server { listen 1935; access_log /var/log/nginx/rtmp_access.log; error_log /var/log/nginx/rtmp_error.log; # ... 其他配置 } }
内容的提问来源于stack exchange,提问作者Jarvis Coding
相关产品推荐
相关产品推荐

