我面临的问题是,Nginx 的 RTMP on_publish 指令似乎无法触发托管在 Next.js 服务器 (Vercel) 上的 API 端点,尽管端点可以通过 Postman 正确处理手动 POST 请求。 Nginx 服务器配置为在流启动时向 Next.js API 发送 POST 请求,但 Next.js 服务器不会记录或处理这些请求。
问题:
通过 Postman 向端点发送手动 POST 请求成功更新数据库。
使用 on_publish 指令从 Nginx 发出的请求似乎无法到达 Next.js API;他们既没有登录 Vercel 的仪表板,也没有更新数据库。
Nginx 日志不显示相关错误,并且从 Nginx 服务器通过curl 测试端点会返回“正在重定向...”消息。
环境:
带有 libnginx-mod-rtmp 模块的 Nginx ( https://github.com/arut/nginx-rtmp-module/wiki/Directives#on_publish )
Vercel 上托管的 Next.js 应用程序
API端点旨在接收数据后更新MongoDB Atlas
Nginx 配置(/etc/nginx/nginx.conf):
rtmp {
server {
listen 1935;
# ... configs
# ...
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 {
// Connect to database
...
// Receive streamKey to store in database
const streamKey = req.nextUrl.searchParams.get("streamKey");
if (!streamKey) {
return NextResponse.json({
msg: "Streamkey is not defined",
data: false,
});
}
// Store streamKey in database
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 日志中可见)。
使用curl测试了来自Nginx服务器的直接请求。
检查网络问题、SSL/TLS 错误配置和重定向行为。
我也被这个问题困扰了很久。最后我发现我的 Nginx RTMP 从主机名解析 IP 地址时遇到一些问题。当我用
localhost
替换 127.0.0.1
后,一切都变得很好。