NextJS SSR部署Vercel遇504超时,如何排查API响应耗时?
解决Vercel上Next.js SSR应用的504 FUNCTION_INVOCATION_TIMEOUT问题
1. 本地复现与基础调试
- 用
vercel dev启动本地开发环境,模拟生产请求流程尝试复现超时问题。本地可借助浏览器DevTools的Network面板查看请求各阶段耗时,或在SSR页面的getServerSideProps、API路由中手动埋点:
通过这些日志定位哪个环节耗时过长。export async function getServerSideProps(context) { console.time('fetch-data'); const data = await fetchExternalData(); console.timeEnd('fetch-data'); console.time('render-page'); // 页面渲染相关逻辑 console.timeEnd('render-page'); return { props: { data } }; } - 检查
getServerSideProps中的数据依赖:排查外部API是否响应缓慢、数据库查询是否未加索引或存在N+1查询问题,优先优化慢数据请求。
2. 补全Vercel函数日志细节
- 在Vercel控制台的函数设置中开启Enhanced Logging,获取函数执行的细粒度日志,包括启动时间、执行阶段节点等信息。
- 在代码关键节点添加自定义日志,比如数据请求开始/结束、渲染完成等阶段,带上时间戳标识:
部署后在Vercel函数日志中筛选这些自定义日志,快速定位超时环节。console.log(`[${new Date().toISOString()}] SSR: 开始获取用户数据`);
3. 优化函数执行效率
- 缓存策略调整:对于非实时数据,改用
getStaticProps生成静态页面;若必须用SSR,可在getServerSideProps中对重复请求的数据做内存缓存(利用Vercel函数实例复用特性),或配置Vercel Edge Cache。 - 并行化数据请求:如果
getServerSideProps中有多个独立的API调用,用Promise.all()并行发起,避免串行等待:const [userData, productData] = await Promise.all([ fetchUser(), fetchProducts() ]); - 减少冷启动耗时:清理不必要的依赖包,替换大体积库为轻量替代品;对非核心模块使用动态导入(
import()),延迟加载仅在需要时执行的代码。
4. 调整Vercel平台配置
- 延长函数超时时间:Vercel默认函数超时为10秒,最长可设置至60秒。在
vercel.json中配置:{ "functions": { "pages/**/*.js": { "maxDuration": 60 }, "pages/api/**/*.js": { "maxDuration": 60 } } } - 切换部署区域:若用户群体与当前部署区域距离较远,切换到更近的区域以降低网络延迟。
5. 进阶调试与重构
- 尝试用Edge Functions替代部分SSR逻辑:Edge Functions冷启动更快,执行环境更轻量,适合处理部分计算密集或高频请求的逻辑。
- 本地性能分析:用
vercel dev --inspect启动调试模式,通过Chrome DevTools的Performance面板分析函数执行流程,定位性能瓶颈。
内容的提问来源于stack exchange,提问作者Horkos
相关产品推荐
相关产品推荐

