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

Strapi v4.11.3 GraphQL 间歇性401授权错误问题求助

排查思路与解决方案

1. 数据库连接闲置断开问题

日志中出现Connection Error: Connection ended unexpectedly,大概率是Strapi与数据库的闲置连接被数据库端或网络层断开,导致首次请求时权限验证依赖的数据库查询失败,返回401;重新请求时Strapi重建数据库连接,恢复正常。

  • 调整数据库的闲置连接超时参数:
    • PostgreSQL:修改postgresql.conf中的idle_in_transaction_session_timeout(建议设为3600000毫秒即1小时)、tcp_keepalives_idle
    • MySQL:修改my.cnf中的wait_timeout、interactive_timeout(建议设为3600秒)
  • 在Strapi的config/database.ts中配置连接池参数,避免连接被轻易回收:
    export default ({ env }) => ({
      connection: {
        // ... 原有数据库配置
        pool: {
          min: 2,
          max: 10,
          idleTimeoutMillis: 30000,
          createTimeoutMillis: 3000,
          acquireTimeoutMillis: 3000,
        },
      },
    });
    

2. Strapi会话与权限缓存问题

Strapi默认使用内存存储会话和权限缓存,长时间无请求时,内存缓存可能被系统回收,导致权限验证失效;刷新请求后缓存重建,恢复正常。

  • 改用Redis存储会话与权限缓存(推荐生产环境使用):
    1. 安装Redis依赖:npm install ioredis
    2. 修改config/middlewares.ts中的session配置:
      export default [
        // ... 其他中间件
        {
          name: "strapi::session",
          config: {
            store: {
              type: "redis",
              options: {
                host: env("REDIS_HOST", "localhost"),
                port: env.int("REDIS_PORT", 6379),
                password: env("REDIS_PASSWORD", ""),
              },
            },
            cookie: {
              secure: env("NODE_ENV") === "production",
            },
          },
        },
        // ... 其他中间件
      ];
      
    3. 配置权限缓存使用Redis,在config/plugins.ts中添加:
      export default ({ env }) => ({
        // ... 其他插件配置
        "users-permissions": {
          config: {
            cache: {
              enabled: true,
              type: "redis",
              options: {
                host: env("REDIS_HOST", "localhost"),
                port: env.int("REDIS_PORT", 6379),
                password: env("REDIS_PASSWORD", ""),
              },
            },
          },
        },
      });
      
  • 临时禁用权限缓存用于排查(不推荐生产):
    在config/plugins.ts中设置:
    export default {
      "users-permissions": {
        config: {
          cache: { enabled: false },
        },
      },
    };
    

3. CORS与请求头配置检查

虽然无法移除CORS中间件,但可能存在配置不全导致的跨域会话问题:

  • 自定义CORS配置,确保允许前端域名和凭证传递,修改config/middlewares.ts:
    export default [
      // ... 其他中间件
      {
        name: "strapi::cors",
        config: {
          origin: ["https://your-frontend-domain.com"], // 替换为你的前端域名
          credentials: true,
          methods: ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"],
          allowedHeaders: ["Content-Type", "Authorization"],
        },
      },
      // ... 其他中间件
    ];
    
  • 检查Apollo客户端配置,确保带上凭证:
    const client = new ApolloClient({
      uri: "https://your-strapi-domain.com/graphql",
      credentials: "include", // 关键配置
      // ... 其他配置
    });
    

4. 服务器网络层闲置连接断开问题

如果Strapi前面有Nginx等反向代理,可能是代理的闲置连接超时设置过短导致连接被断开:

  • 调整Nginx配置中的keepalive_timeout和keepalive_requests:
    http {
      # ... 其他配置
      keepalive_timeout 65s;
      keepalive_requests 1000;
    }
    
  • 检查服务器防火墙规则,确保没有限制长时间闲置的TCP连接。

内容的提问来源于stack exchange,提问作者Circus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:57:06