You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:41:07