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

Next.js 14服务器端redirect函数耗时过长问题求助

Next.js 14 服务器端重定向延迟5分钟问题排查与解决

问题详情

  • 部署环境:Namecheap VPS,搭载WHM + cPanel,通过Passenger在Apache上运行Next.js 14应用
  • 异常现象:服务器端调用redirect函数重定向耗时约5分钟,本地构建运行则立即生效;此前3个月运行正常,近期突然出现该问题
  • 已排查:移除PWA配置后问题依旧

相关代码

登录组件

"use client";
const Login = ({ url, pageType }: { url: string; pageType: string }) => {
    const handleSubmit = (data: { email: string; password: string }) => {
        setError(false);
        return POST<AuthResponse>(url, data).then((res: any) => {
          if (res.code == 401) {
            setError(true);
            return res;
          } else {
            return res;
          }
        });
      };
    const handleSuccess = (data: ApiResponse<AuthResponse>) => {
        setCookieClient("token", data?.data?.token ?? "");
        setCookieClient("refresh_token", data?.data?.refresh_token ?? "");
        setCookieClient("user-type", pageType);
        Navigate("/admin");
      };
    <Form
              handleSubmit={handleSubmit}
              onSuccess={handleSuccess}
              buttonText="Login"
            >
        {/*form fields*/}
    
    </Form>
"use server";
import { redirect } from "next/navigation";

export async function Navigate(url: string) {
  redirect(url);
}

表单组件

"use client";
import React from "react";
import { FormProvider, useForm } from "react-hook-form";
import { ApiResponse } from "@/Http/Response";
import LoadingSpin from "@/components/icons/LoadingSpin";
import PrimaryButton from "./PrimaryButton";
import { toast } from "react-toastify";

const Form = ({
  children,
  handleSubmit,
  onSuccess,
  defaultValues = {},
  buttonText = "Submit",
}: {
  children: React.ReactNode;
  handleSubmit: (data: any) => Promise<ApiResponse<any>>;
  defaultValues?: object | undefined | null;
  onSuccess?: (res: ApiResponse<any>) => void;
  buttonText?: string;
}) => {
  // @ts-ignore
  const methods = useForm({ defaultValues: defaultValues });

  const onSubmit = async (data: any) => {
    const res = await handleSubmit(data);

    if (!res.hasValidationErrors() && res.code == 200) {
      toast.success((res?.message as string) ?? "success");
      if (onSuccess) onSuccess(res);
    } else {
      res.fillValidationErrors(methods);
    }
    return res;
  };

  return (
    <FormProvider {...methods}>
      <form
        onSubmit={methods.handleSubmit(onSubmit)}
        encType="multipart/form-data"
      >
        {children}
        <div
          className="flex justify-center items-center my-5"
          onClick={() => {
            methods.clearErrors();
          }}
        >
          <PrimaryButton
            type="submit"
            disabled={methods.formState.isSubmitting}
          >
            {buttonText}{" "}
            {methods.formState.isSubmitting ? (
              <span className="mx-1">
                <LoadingSpin className="w-6 h-6 text-white" />
              </span>
            ) : (
              ""
            )}
          </PrimaryButton>
        </div>
      </form>
    </FormProvider>
  );
};

export default Form;

排查与解决方向

  1. Passenger 超时配置检查

    • 查看cPanel/WHM中Passenger的PassengerMaxRequestTime等超时参数,若设置异常可能导致服务器端动作被阻塞,调整参数确保请求能快速响应
    • 重启Passenger服务,排除进程临时异常
  2. Apache 服务配置排查

    • 检查Apache的Timeout、ProxyTimeout值,过大的超时设置会导致请求等待延迟
    • 确认mod_deflate、mod_expires等模块的配置是否正常,避免异常响应头拖慢重定向
  3. Next.js 服务器端动作优化

    • 当前Navigate是服务器端RPC动作,检查服务器端是否存在CPU/内存占用过高、未处理的Promise等情况,导致响应延迟
    • 临时替换为客户端跳转(比如用useRouter的push方法),对比是否还存在延迟,定位问题出在服务器端还是RPC调用环节
  4. 服务器资源状态检查

    • 查看VPS的CPU、内存使用率,排查是否有进程卡死、内存泄漏导致Next.js应用响应缓慢
    • 清理服务器缓存,重启Apache服务,排除临时资源占用问题
  5. Cookie 与响应头验证

    • 检查setCookieClient的path、domain等属性是否正确,错误的Cookie配置可能导致浏览器等待响应完成
    • 确保服务器端重定向时没有未关闭的数据流,避免响应头无法及时发送

内容的提问来源于stack exchange,提问作者Khaldoun Al Halabi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:24:52