服务器配置

页面摘要: /config/server 管理主机、端口、URL、代理、cron 等;修改后需要重新构建管理面板。

/config/server.js 文件用于定义 Strapi 应用程序的服务器配置。

WARNING

对 server.js 文件的修改需要重新构建管理面板。保存修改后的文件后,在终端中运行 yarn build 或 npm run build 以使更改生效。

可用选项

/config/server.js 文件可以包含以下参数:

ParameterDescriptionTypeDefault
host

❗️ 必填 | 主机名 | string | localhost | | port

❗️ 必填 | 服务器应运行的端口。 | integer | 1337 | | app.keys

❗️ 必填 | 声明会话密钥(基于 Koa session),被 session 中间件用于用户与权限插件和文档插件。 | array of strings | undefined | | socket | 监听 socket。提供此选项时,host 和 port 仅作装饰用,同样使用 url 来生成正确的 url。此选项对于在不暴露端口的情况下运行服务器并使用同一台机器上的代理服务器很有用(例如 Heroku nginx buildpack) | string | integer | /tmp/nginx.socket | | emitErrors | (在 Strapi 5 中已移除) 以前用于将错误发送到 koa,以便你可以附加自定义逻辑或使用错误报告服务。该选项不再被读取,没有任何效果,因此你可以安全地从 /config/server 中删除它。有关受支持的方法,请参阅错误处理。 | boolean | | | url | 服务器的公开 url。许多不同的功能都需要它(例如:重置密码、第三方登录提供方等),以及当 Strapi 运行在 Apache 或 Nginx 等代理后面时用于构建绝对 URL 的地址,例如:https://mywebsite.com/api。信任代理添加的请求头是一个单独的设置 proxy.koa。url 可以是相对的,如果是这样,它将以 http://${host}:${port} 作为基础 url 使用。不过建议使用绝对 url。 | string | '' | | proxy | 代理配置 | object | | | proxy.global | 为所有外部请求定义代理代理(proxy agent)。如果 Strapi 项目位于正向代理之后,则使用此选项。 | string | | | proxy.fetch | 在 strapi.fetch 内发起的所有请求的代理(用于许可证检查、遥测和 Webhook) | string | ProxyAgent.Options | | | proxy.http | 所有(非 fetch)http 请求的代理 | string | | | proxy.https | 所有(非 fetch)https 请求的代理 | string | | | proxy.koa | 设置 koa 变量 app.proxy。当为 true 时,代理请求头字段将被信任。 | boolean | false | | proxy.ipHeader | (v5.52.0+) 在识别客户端真实 IP 地址时信任的代理 IP 请求头名称。当位于反向代理(例如 Nginx、Apache、负载均衡器)之后时设置。出于安全考虑,始终与 proxy.maxIpsCount 配合使用以防止请求头欺骗。示例:'X-Forwarded-For'、'CF-Connecting-IP'。 | string | 'X-Forwarded-For' | | proxy.maxIpsCount | (v5.52.0+) 从代理 IP 请求头中读取的最大 IP 地址数量。使用反向代理时必须设置,以防止 IP 欺骗攻击。单个代理设为 1,代理链设为 2,依此类推。设为 0(Koa 默认值)表示无限制,这在代理后面是不安全的。 | integer | 0 | | cron | Cron 配置(由 node-schedule 提供支持) | object | | | cron.enabled | 启用或禁用定时任务(CRON jobs) 以在特定日期调度任务。 | boolean | false | | cron.tasks | 声明要在特定日期运行的定时任务(CRON jobs)。 | object | | | dirs | Strapi 使用的不同目录的路径配置。 | object | | | dirs.public | 自定义 public 文件夹的路径。 | string | ./public | | http | Strapi 使用的 http 服务器配置 | object | | | http.serverOptions | 传递给 http createServer 的选项 | http.serverOptions | {} | | transfer.remote.enabled | 切换使用传输功能 的能力 | boolean | true | | transfer.remote.assetIdleTimeoutMs | 在使用 strapi transfer --from 从远程实例拉取时,在没有传入数据的情况下,资源流被视为停滞的超时时间(毫秒)。在传输大文件或在慢速连接上工作时增大此值。 | integer | 300000 (5 minutes) | | logger.startup.enabled | 切换终端中的启动消息 | boolean | true | | logger.updates.enabled | 切换终端中关于更新 strapi 的通知消息 | boolean | true | | openapi | OpenAPI 端点配置。两个端点默认都使用 access: 'disabled',并且不会被注册。 | object | | | openapi['content-api'].access | 访问模式:disabled(不注册)或 public(无需身份验证)。 | string | disabled | | openapi['content-api'].route.path | Content API 端点的子路径,在 REST API 前缀 下解析。 | string | /openapi.json | | openapi['content-api'].cache.enabled | 启用所生成规范的基于文件的缓存。 | boolean | true | | openapi['content-api'].cache.maxAgeMs | 缓存有效期(毫秒)。 | integer | 60000 | | openapi['content-api'].cache.filePath | 缓存规范的文件路径。相对路径从应用根目录解析。 | string | .strapi/openapi/content-api.json | | openapi.admin.access | 访问模式:disabled(不注册)或 authenticated(需要管理员会话)。 | string | disabled | | openapi.admin.route.path | Admin 端点的子路径,在管理面板路径 下解析。 | string | /openapi.json | | openapi.admin.cache.enabled | 启用所生成规范的基于文件的缓存。 | boolean | true | | openapi.admin.cache.maxAgeMs | 缓存有效期(毫秒)。 | integer | 60000 | | openapi.admin.cache.filePath | 缓存规范的文件路径。相对路径从应用根目录解析。 | string | .strapi/openapi/admin.json | | webhooks.defaultHeaders | 随每个 Webhook 请求发送的默认请求头。在单个 Webhook 上设置的请求头优先。参见 Webhooks。 | object | {} | | webhooks.populateRelations | (在 Strapi 5 中已移除) 该选项不再被读取,没有效果。如果该键仍存在于你的 /config/server 文件中,你可以安全地删除它。参见 webhooks.populateRelations 服务器配置已移除。 | boolean | |

NOTE

Strapi 没有特定的 keep alive 配置选项,因为 Strapi 对传入的 HTTP 请求使用 Node 的默认 keep alive 配置,默认保持连接存活。

对于传出的 HTTP 调用,你可以向你的 HTTP 客户端传递一个 keep-alive 代理。 使用 agentkeepalive 和 Axios 的示例:

const { HttpsAgent } = require('agentkeepalive');
const axios = require('axios');

const agent = new HttpsAgent();
axios.get('https://example.com', { httpsAgent: agent });
TIP

Strapi 暴露了一个专用的健康检查路由用于存活探针。对 /_health 的任何请求都会返回一个空响应,状态为 204,并带有一个 strapi: You are so French! 响应头,这适用于只需要简单存活指示器的负载均衡器或监控工具。

配置

/config/server.js 的最小配置在开发时需要 host 和 port 参数。可以包含额外的参数以构成完整配置。

NOTE

环境配置(即使用 env() 辅助函数)无需包含所有值,只要它们存在于默认的 ./config/server.js 中即可。

使用任何新项目创建的默认配置应至少包含以下内容:

Minimal configuration

JavaScript

module.exports = ({ env }) => ({
  host: env('HOST', '0.0.0.0'),
  port: env.int('PORT', 1337),
  app: {
    keys: env.array('APP_KEYS'),
  },
});

TypeScript

export default ({ env }) => ({
  host: env('HOST', '0.0.0.0'),
  port: env.int('PORT', 1337),
  app: {
    keys: env.array('APP_KEYS'),
  },
});

Full configuration

以下是完整配置文件的一个示例。并非所有这些键都是必需的(参见可用选项)。

JavaScript

module.exports = ({ env }) => ({
  host: env('HOST', '0.0.0.0'),
  port: env.int('PORT', 1337),
  app: {
    keys: env.array('APP_KEYS'),
  },
  socket: '/tmp/nginx.socket', // 仅在绝对必要时使用
  url: env('PUBLIC_URL', 'https://api.example.com'),
  proxy: {
    koa: env.bool('IS_PROXIED', true),
    ipHeader: env('PROXY_IP_HEADER', 'X-Forwarded-For'),
    maxIpsCount: env.int('MAX_IPS_COUNT', 1),
  },
  cron: {
    enabled: env.bool('CRON_ENABLED', false),
  },
  transfer: {
    remote: {
      enabled: false,
    },
  },
  logger: {
    updates: {
      enabled: false,
    },
    startup: {
      enabled: false,
    },
  },
  // highlight-start
  openapi: {
    'content-api': {
      access: 'public',
    },
  },
  // highlight-end
});

TypeScript

export default ({ env }) => ({
  host: env('HOST', '0.0.0.0'),
  port: env.int('PORT', 1337),
  app: {
    keys: env.array('APP_KEYS'),
  },
  socket: '/tmp/nginx.socket', // 仅在绝对必要时使用
  url: env('PUBLIC_URL', 'https://api.example.com'),
  proxy: {
    koa: env.bool('IS_PROXIED', true),
    ipHeader: env('PROXY_IP_HEADER', 'X-Forwarded-For'),
    maxIpsCount: env.int('MAX_IPS_COUNT', 1),
  },
  cron: {
    enabled: env.bool('CRON_ENABLED', false),
  },
  transfer: {
    remote: {
      enabled: false,
    },
  },
  logger: {
    updates: {
      enabled: false,
    },
    startup: {
      enabled: false,
    },
  },
  // highlight-start
  openapi: {
    'content-api': {
      access: 'public',
    },
  },
  // highlight-end
});