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秒)
- PostgreSQL:修改
- 在Strapi的
config/database.ts中配置连接池参数,避免连接被轻易回收:export default ({ env }) => ({ connection: { // ... 原有数据库配置 pool: { min: 2, max: 10, idleTimeoutMillis: 30000, createTimeoutMillis: 3000, acquireTimeoutMillis: 3000, }, }, });
2. Strapi会话与权限缓存问题
Strapi默认使用内存存储会话和权限缓存,长时间无请求时,内存缓存可能被系统回收,导致权限验证失效;刷新请求后缓存重建,恢复正常。
- 改用Redis存储会话与权限缓存(推荐生产环境使用):
- 安装Redis依赖:
npm install ioredis - 修改
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", }, }, }, // ... 其他中间件 ]; - 配置权限缓存使用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", ""), }, }, }, }, });
- 安装Redis依赖:
- 临时禁用权限缓存用于排查(不推荐生产):
在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
相关产品推荐
相关产品推荐

