Centrifugo 6.10 配置参数详解
Centrifugo v6.10.1 配置参数详解:defaultconfig/defaultenv/configdoc 四种参数查看方式、四层覆盖优先级实测、37 个顶层配置段总览与核心参数分类解析,附生产配置模板。
Centrifugo 6.10 配置参数详解
目标:系统梳理 Centrifugo v6.10.1 的配置体系——参数查看工具、四层覆盖优先级、顶层参数段总览与核心参数逐段详解,并给出可直接落地的生产配置模板。已在 Ubuntu 22.04.5 LTS(x86_64)+ Centrifugo v6.10.1 服务器实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- Centrifugo 版本:v6.10.1(Go version: go1.27.3),二进制路径 /usr/bin/centrifugo
- 配置文件:/etc/centrifugo/config.json(v6 嵌套 JSON 格式)
- 服务监听:0.0.0.0:8130(默认 8000,本机 8000 被占用改为 8130,下文所有示例一致)
- 引擎:memory(单机内置);扩展引擎为 Redis
- 参数文档生成:centrifugo configdoc(源自官方源码内置定义)
二、前置条件
- 已按《Ubuntu 22.04 安装 Centrifugo 指南》完成安装并修复配置文件权限(root:centrifugo 640)。
- 了解 v6 配置格式变化:v5 及更早版本的配置是大量平铺键(如
token_hmac_secret_key、admin_password),v6 改为嵌套 JSON 结构(如client.token.hmac_secret_key、admin.password)。从旧版本升级时配置必须迁移,不能直接沿用。 - 掌握配置校验习惯:每次改动先跑
centrifugo checkconfig,升级版本后跑-s严格模式。
三、参数查看与修改方式
3.1 生成全量默认配置(defaultconfig)
defaultconfig 子命令输出当前版本全部参数的完整默认值,是参数速查的第一手资料。-d 为 dry-run,只打印不落盘:
centrifugo defaultconfig -d | head -50
实测回显(节选):
{
"http_server": {
"address": "",
"port": 8000,
"internal_address": "",
"internal_port": "",
"tls": {
"enabled": false,
"cert_pem": "",
"key_pem": "",
"server_ca_pem": "",
"client_ca_pem": "",
"insecure_skip_verify": false,
"server_name": ""
},
"tls_autocert": {
"enabled": false,
"host_whitelist": null,
"cache_dir": "",
"email": "",
"server_name": "",
"http": false,
"http_addr": ":80"
},
"tls_external": false,
"internal_tls": {
"enabled": false,
"cert_pem": "",
"key_pem": "",
"server_ca_pem": "",
"client_ca_pem": "",
"insecure_skip_verify": false,
"server_name": ""
},
"http3": {
"enabled": false
},
"h2c_external": false
},
"log": {
"level": "info",
"file": ""
},
去掉 -d 并指定 -c 路径则把全量配置写成文件,可在此基础上精简。全量输出共 1095 行,覆盖 37 个顶层段。
3.2 生成环境变量清单(defaultenv)
每个配置参数都有对应的 CENTRIFUGO_* 环境变量。defaultenv 输出全量变量与默认值(共 855 行):
centrifugo defaultenv | head -12
centrifugo defaultenv | wc -l
实测回显:
CENTRIFUGO_ADMIN_ENABLED=false
CENTRIFUGO_ADMIN_EXTERNAL=false
CENTRIFUGO_ADMIN_HANDLER_PREFIX=""
CENTRIFUGO_ADMIN_INSECURE=false
CENTRIFUGO_ADMIN_PASSWORD=""
CENTRIFUGO_ADMIN_SECRET=""
CENTRIFUGO_ADMIN_WEB_PATH=""
CENTRIFUGO_ADMIN_WEB_PROXY_ADDRESS=""
CENTRIFUGO_BROKER_ENABLED=false
CENTRIFUGO_BROKER_NATS_ALLOW_WILDCARDS=false
CENTRIFUGO_BROKER_NATS_DIAL_TIMEOUT=1s
CENTRIFUGO_BROKER_NATS_PREFIX="centrifugo"
...
855
命名规则一目了然:嵌套路径转大写下划线(admin.enabled → CENTRIFUGO_ADMIN_ENABLED)。环境变量适合容器/云平台注入场景,deb 包的 systemd 单元也预留了 EnvironmentFile=/etc/default/centrifugo。
3.3 内置参数文档(configdoc)
configdoc 直接从二进制内嵌的参数定义生成文档,与运行的版本严格一致。带 -m 输出 Markdown(共 10085 行),-s 按顶层段过滤,-p 指定端口起本地网页版:
centrifugo configdoc -m -s admin | head -14
实测回显:
# `admin`
Type: `Admin` object
Configures the admin web UI and its API endpoints.
## `admin.enabled`
Type: `bool`
Env: `CENTRIFUGO_ADMIN_ENABLED`
Enables the admin web UI and admin API endpoints.
每个参数条目固定给出 Type(类型)、Env(环境变量)、默认值与语义说明,这是查参数含义最权威的离线途径。
3.4 四层覆盖优先级与生效方式
Centrifugo 按以下优先级合并配置(高者优先):命令行 flags > 环境变量 > 配置文件 > 内置默认值。实测验证两处覆盖:环境变量 CENTRIFUGO_HTTP_SERVER_PORT=8131 启动(配置文件写的是 8130):
CENTRIFUGO_HTTP_SERVER_PORT=8131 centrifugo -c /etc/centrifugo/config.json
实测回显(启动日志行):
serving websocket, http_stream, sse, emulation, api, admin, prometheus, health, swagger endpoints on 0.0.0.0:8131
命令行 -p 8132(等价 --http_server.port)覆盖启动:
centrifugo -c /etc/centrifugo/config.json -p 8132
实测回显(启动日志行):
serving websocket, http_stream, sse, emulation, api, admin, prometheus, health, swagger endpoints on 0.0.0.0:8132
生效方式三选一:
sudo systemctl restart centrifugo # 重启进程,全部配置生效
sudo systemctl reload centrifugo # SIGHUP 热重载,不断开现有连接
sudo kill -HUP <主进程PID> # 等价 reload 的手工形态
热重载成功时日志出现确认行(实测):
Oct 21 15:25:52 centrifugo-server centrifugo[4746]: {"level":"info","time":"2026-10-21T15:25:52Z","message":"configuration successfully reloaded"}
💡 说明:并非所有参数都支持热重载——监听端口、引擎类型这类启动期参数仍需重启;密钥、频道命名空间、日志级别等运行期参数可热加载。改完不确定时用 reload 看日志确认,行为未变再 restart。
3.5 配置校验(checkconfig 与严格模式)
基础校验对合法配置静默通过;坏 JSON 报解析错误:
echo '{bad json' > /tmp/bad.json
centrifugo checkconfig -c /tmp/bad.json; echo "rc=$?"
实测回显:
error getting config: error reading config file /tmp/bad.json: While parsing config: invalid character 'b' looking for beginning of object key string
rc=1
普通模式忽略未知字段;-s/--strict 严格模式把未知字段当错误,用于跨版本升级兜底:
printf '{"client":{"token":{"hmac_secret_key":"x"}},"typo_key":1}' > /tmp/unk.json
centrifugo checkconfig -c /tmp/unk.json; echo "rc_loose=$?"
centrifugo checkconfig -s -c /tmp/unk.json; echo "rc_strict=$?"
实测回显:
rc_loose=0
unknown keys in config: typo_key
rc_strict=1
四、参数总览(顶层参数段)
执行 centrifugo defaultconfig -d 可见的顶层段共 37 个,按用途归类如下:
| 分组 | 顶层段 | 作用 |
|---|---|---|
| 服务入口 | http_server | 监听地址/端口、TLS、自动证书、内网端口 |
| 日志 | log | 日志级别与文件 |
| 引擎与扩展 | engine、broker、presence_manager、map_broker、consumers | 单机内存/Redis 引擎、消息代理、在线状态管理、消费组 |
| 客户端协议 | client | 连接鉴权(JWT)、Origin、心跳、过期、限额 |
| 频道模型 | channel | 命名空间、频道默认选项、历史/在线状态/恢复 |
| 服务端接口 | http_api、grpc_api | 后端调用服务器的发布/管理 API |
| 传输端点 | websocket、sse、http_stream、webtransport、uni_sse、uni_http_stream、uni_websocket、uni_grpc、emulation | 客户端接入的各传输协议 |
| 扩展代理 | proxies、rpc、client.proxy、channel.proxy | 连接/订阅/发布代理到自研后端 |
| 管理与观测 | admin、prometheus、health、swagger、debug、opentelemetry、graphite | 管理界面与指标/诊断端点 |
| 运维杂项 | node、shutdown、pid_file、usage_stats、enable_unreleased_features | 节点名、优雅关停、遥测开关 |
解读:日常单机部署只涉及 http_server、log、client、channel、http_api、admin 与若干 enabled 开关段;engine/broker/consumers 等大段只在水平扩展或接消息队列时启用。下文第五章按使用频率详解核心段。
五、核心参数分类详解
5.1 http_server:监听与 TLS
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
| http_server.address | string,"" | 监听地址;空=全部网卡。生产建议 0.0.0.0(对外)或内网 IP |
| http_server.port | int,8000 | HTTP 端口;websocket/api/管理端点共用,可改(本文用 8130) |
| http_server.internal_address / internal_port | string,"" | 内网端点(如 internal debug/admin socket)独立监听,便于防火墙区分内外 |
| http_server.tls.enabled | bool,false | 开启 HTTPS/WSS,证书用 cert_pem/key_pem 提供 |
| http_server.tls_autocert.enabled | bool,false | Let's Encrypt 自动证书;需 host_whitelist 域名列表、cache_dir、email,且 80 端口可达 |
| http_server.http3.enabled | bool,false | 实验性 HTTP/3 支持 |
| http_server.h2c_external | bool,false | 明文 HTTP/2(h2c) |
💡 技术拓展:TLS 证书的获取方式不止 autocert 一种。常见方案对比——
方案 原理 适用场景 tls_autocert(内置 ACME) 服务自己向 Let's Encrypt 签发续期 服务器直接暴露 80/443 tls 静态证书 自备 cert_pem/key_pem 已有商业/自签证书 反向代理终结 TLS Nginx/Caddy 挂证书,回源 http 多服务共用网关,Centrifugo 走内网明文 本文方案采用「反向代理终结 TLS」路线(Web 服务普遍已有网关),Centrifugo 监听内网明文端口即可;若 Centrifugo 独占公网入口则 tls_autocert 最省心。
5.2 log:日志
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
| log.level | string,"info" | trace/debug/info/warn/error/fatal/none;排障时临时调 debug 可看到每条 HTTP 请求与断连原因 |
| log.file | string,"" | 空=输出到 stdout(systemd 收进 journal);指定路径则写文件(配合 /etc/logrotate.d/centrifugo 轮转) |
5.3 client:连接鉴权与连接治理(重点)
鉴权令牌(JWT)
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
| client.token.hmac_secret_key | string,"" | HS256/384/512 签名密钥;genconfig 安装时随机生成。签发方(自研后端)与 Centrifugo 必须一致 |
| client.token.rsa_public_key / ecdsa_public_key | string,"" | 改用 RSA/ECDSA 非对称验签(PEM),适合签发方无法共享对称密钥的架构 |
| client.token.jwks_public_endpoint | string,"" | 从 JWKS 端点拉取公钥验签(对接身份服务) |
| client.token.audience / issuer(含 regex 变体) | string,"" | 校验 JWT 的 aud/iss 声明 |
| client.token.hmac_previous_secret_key | string,"" | 密钥轮换期的新旧双密钥并行验证 |
| client.subscription_token.* | 同上 | 订阅令牌(私有频道 $ 前缀)独立一套密钥配置,enabled 默认 false |
💡 技术拓展:JWT 签名算法不止 HMAC 一种。常见对比——
算法族 原理 取舍 HS256/384/512(HMAC) 共享对称密钥 最简单;签发方与验证方需共享密钥 RS256/ES256 系(RSA/ECDSA) 私钥签发、公钥验证 签发方可分散;公钥可公开发放 JWKS 动态拉取验证公钥集合 对接 IdP(如 Keycloak)时免手工同步公钥 本文采用默认 HS256(
gentoken命令默认即 HMAC SHA-256 JWT),单团队后端持有密钥签发最直接。
连接策略
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
| client.allowed_origins | []string,[] | 浏览器 Origin 白名单;[] 全拒(非浏览器客户端不受限);["*"] 全放行(有警告日志)。联调 ["*"],生产写精确域名 |
| client.allow_anonymous_connect_without_token | bool,false | 允许无 token 匿名连接(游客只订阅公开频道时用) |
| client.disallow_anonymous_connection_tokens | bool,false | 禁止 token 中无 sub(匿名)的连接 |
| client.insecure | bool,false | 跳过鉴权(仅开发用,绝不上生产) |
| client.user_id_http_header | string,"" | 信任反向代理注入的用户头(配合网关统一认证) |
连接生命周期
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
| client.ping_interval | duration,25s | 服务端向客户端发 ping 的间隔 |
| client.pong_timeout | duration,8s | 等待 pong 超时即断开 |
| client.expired_close_delay | duration,25s | token 过期后给客户端刷新令牌的宽限期 |
| client.stale_close_delay | duration,10s | 连上却不发 connect 命令的踢除延迟 |
| client.queue_max_size | int,1048576 | 单连接待发消息队列上限(字节),超限断连(防慢客户端拖垮内存) |
| client.connection_limit / user_connection_limit / connection_rate_limit | int,0 | 全局连接数/单用户连接数/建连速率限制;0=不限制 |
客户端能力开关(默认全部收紧)
channel_limit(单连接订阅数,128)、history_max_publication_limit/recovery_max_publication_limit(单次拉历史/恢复上限,300)、presence_update_interval(27s)、concurrency(0=串行处理命令)。这些默认值对多数场景够用,不展开。
5.4 channel:频道模型与命名空间(重点)
全局命名规则
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
| channel.max_length | int,255 | 频道名最大长度 |
| channel.namespace_boundary | string,":" | 命名空间分隔符:chat:main 表示 chat 命名空间的 main 频道 |
| channel.private_prefix | string,"$" | 私有频道前缀,订阅必须携带订阅令牌 |
| channel.user_boundary / user_separator | "#" / "," | 用户个人频道:user#42,多用户 user#42,43 |
| channel.history_meta_ttl | duration,720h(30 天) | 历史元数据(stream/epoch)Redis 侧的存活期 |
频道选项(without_namespace 为无命名空间默认值;namespaces 数组内每个命名空间可独立覆盖同名选项)
| 参数组 | 默认值 | 说明 |
|---|---|---|
| presence / join_leave | false | 在线状态列表/进出通知;需要在线名单时开 |
| history_size / history_ttl | 0 / 0s | 频道历史保留条数与时长;断线恢复(recovery)依赖历史开启 |
| force_positioning / allow_positioning | false | Publication offset 位置追踪/客户端主动按 offset 拉取 |
| force_recovery / allow_recovery | false | 断线重连自动恢复丢失消息(需历史) |
| allowed_delta_types / delta_publish | null / false | PRO 特性:增量压缩发布 |
| allow_subscribe_for_client | false | 客户端可自主订阅;默认 false,开它才允许浏览器直接 subscribe |
| allow_publish_for_client / subscriber | false | 允许客户端发消息(聊天室类场景才开,注意滥用风险) |
| allow_presence_for_* / allow_history_for_* | false | 在线状态/历史对客户端开放;默认服务端 API 专用 |
| channel_regex | "" | 命名空间内频道名正则白名单 |
| anonymous 系列(allow_subscribe_for_anonymous 等) | false | 匿名连接(无用户 ID)的放行粒度 |
命名空间示例(本文实验环境实际使用,已验证):chat 命名空间允许客户端订阅并保留 10 条 1 小时历史:
"channel": {
"namespaces": [
{
"name": "chat",
"allow_subscribe_for_client": true,
"history_size": 10,
"history_ttl": "1h"
}
]
}
⚠️ 注意:开启
history_size后,HTTP API 的 history 方法才能取到消息。实测向chat:main发布两条后查询:{"result":{"publications":[{"data":{"msg":1},"offset":1},{"data":{"msg":2},"offset":2}],"epoch":"aGWjhIal","offset":2}}——offset 单调递增、epoch 标识流纪元,这两个字段正是断线恢复(recovery)的对照依据。
5.5 http_api 与 grpc_api:后端调用入口
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
| http_api.disabled | bool,false | HTTP API 默认开启,路径 /api |
| http_api.key | string,"" | API 凭据;genconfig 随机生成。请求头 X-API-Key;缺失/错误返回 401(实测) |
| http_api.external | bool,false | 是否暴露在外部端口(默认仅内网端点侧;单端口部署下即可用) |
| http_api.insecure | bool,false | 免鉴权(仅内网隔离环境) |
| http_api.error_mode | string,"" | 错误响应格式(proxy 场景透传) |
| grpc_api.enabled / port / key | false / 10000 / "" | gRPC 形态的同一套 API,端口 10000 |
API 方法族(POST {"method":"...","params":{...}}):publish、broadcast、subscribe、unsubscribe、disconnect、presence、presence_stats、history、history_remove、channels、info、refresh 等。info 返回节点列表与运行指标(实测节选):
{"result":{"nodes":[{"uid":"eda3d08d-dc8f-414d-8f9b-2ac5539ae33c","name":"centrifugo-server_8130","version":"6.10.1 OSS","num_clients":0,"num_users":0,"num_channels":0,"uptime":60,"metrics":{...}}]}}
5.6 admin:管理界面
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
| admin.enabled | bool,false | 开启管理 UI 与管理 API;UI 在服务根路径 /(不是 /ui/) |
| admin.external | bool,false | 是否挂在外部端口;内网端口模式时设 false |
| admin.password / secret | string,"" | 登录口令与会话签名密钥;genconfig 随机生成 |
| admin.insecure | bool,false | 免认证管理(绝不建议) |
| admin.web_path | string,"" | UI 挂载路径覆写 |
登录认证实测(表单编码,JSON Content-Type 会 400):
curl -s -X POST -d "password=q1w2e3r4" http://127.0.0.1:8130/admin/auth -w " http:%{http_code}"
实测回显:
{"token":"MTc5MjU5NjE2M3xEUXdBQ21GMWRHaHZjbWw2WldRPXwM9uF9x5Qow2Zc18L9ltHegUzAwwjgmi5MYbyjdk9flg=="} http:200
5.7 传输端点:websocket / sse / http_stream / webtransport
| 段 | 默认 | 说明 |
|---|---|---|
| websocket.disabled | false | WebSocket 端点默认开启,路径 /connection/websocket;message_size_limit 65536 字节;compression 可开 permessage-deflate |
| sse.enabled | false | 双向 SSE(EventSource),路径 /connection/sse,需配合 /emulation 上行 |
| http_stream.enabled | false | 双向 HTTP 流式(fetch streaming),路径 /connection/http_stream |
| webtransport.enabled | false | WebTransport(基于 HTTP/3,需先开 http3) |
| uni_sse / uni_http_stream / uni_websocket | false | 单向变体:只收推送不发命令,适合纯通知展示页 |
| emulation.handler_prefix | /emulation | 双向 SSE/HTTP-stream 的上行命令通道 |
💡 技术拓展:客户端接入传输不止 WebSocket 一种。主要选项对比——
传输 双向 原理/特点 适用场景 WebSocket 是 全双工单连接,主流选择 绝大多数实时应用 SSE(双向版) 是 HTTP 长连接下行+POST 上行,自动重连内建 代理环境对 WS 不友好时 HTTP-stream 是 fetch 流式读取,纯 HTTP 栈 受限网络/老代理 WebTransport 是 HTTP/3 之上,多路复用低延迟 新一代浏览器高要求场景 uni_* 单向 否 只下行,无命令上行 大屏/通知墙等只读页面 本文开启 websocket(默认)+ sse + http_stream 三种做验证;生产按客户端环境选择,SDK(centrifuge-js 等)会在 WebSocket 失败时自动降级到 SSE/HTTP-stream。
5.8 engine 与 broker:单机到集群
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
| engine.type | string,memory | memory 单机;redis 走 Redis 做跨节点 pub/sub、presence、history,多节点水平扩展 |
| engine.redis.prefix | string,centrifugo | Redis key 前缀 |
| engine.redis.address | []string,["redis://127.0.0.1:6379"] | Redis 地址(支持 redis:// 与红括号多地址分片) |
| engine.redis.password / db / tls.* | "" / 0 / 关 | 连接凭据与加密 |
| engine.redis.sentinel_address 等 | null | 哨兵接入(sentinel_master_name 必填) |
| engine.redis.cluster_address | null | Redis Cluster 地址列表 |
| engine.redis.presence_ttl | duration,1m | 在线状态 TTL |
| broker.type | string,memory | 消息代理:memory、redis、nats;与 engine 解耦可组合 |
单机内存引擎零依赖即开即用;节点数 >1 时必须 redis(或 nats)承载跨节点消息分发,多节点部署与故障演练属集群主题,本文不展开。
5.9 可观测性端点
| 段/参数 | 默认 | 说明 |
|---|---|---|
| prometheus.enabled / handler_prefix | false / /metrics | Prometheus 指标(实测开启后 200) |
| health.enabled / handler_prefix | false / /health | 健康检查(负载均衡探针用) |
| swagger.enabled | false | HTTP API 交互文档 /swagger/ |
| debug.enabled | false | pprof 性能剖析 /debug/pprof(排障临时开) |
| opentelemetry.* / graphite.* | 关 | OTel 追踪(api/consuming 分开关)与 Graphite 指标推送 |
5.10 运维杂项
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
| node.name | string,"" | 节点名;空则自动生成 <hostname>_<port>(实测为 centrifugo-server_8130) |
| shutdown.timeout | duration,30s | 优雅关停最长等待 |
| pid_file | string,"" | PID 文件路径(systemd 托管时不需要) |
| usage_stats.disabled | bool,false | 关闭匿名使用统计上报 |
| enable_unreleased_features | bool,false | 启用未正式发布的实验特性 |
六、生产配置模板
6.1 小规模单机模板(2 核 4 GB、NVMe SSD、日活 ≤1 万的站内实时通道)
{
"http_server": {
"address": "0.0.0.0",
"port": 8000
},
"log": {
"level": "info"
},
"client": {
"token": {
"hmac_secret_key": "<与后端共享的随机 64 位密钥,用 openssl rand -base64 48 生成>"
},
"allowed_origins": ["https://app.example.com"]
},
"http_api": {
"key": "<openssl rand -base64 48 生成>"
},
"admin": {
"enabled": true,
"external": false,
"password": "q1w2e3r4",
"secret": "<openssl rand -base64 48 生成>"
},
"health": { "enabled": true },
"prometheus": { "enabled": true },
"channel": {
"namespaces": [
{ "name": "chat", "allow_subscribe_for_client": true, "history_size": 100, "history_ttl": "24h" },
{ "name": "notify", "allow_subscribe_for_client": true }
]
}
}
要点:内存引擎、密钥全部落配置文件(权限 root:centrifugo 640);Origin 收敛到精确域名;admin 不暴露外网端口(配合 SSH 隧道或内网访问);<...> 占位按注释方法生成后替换为实际值。
6.2 Redis 水平扩展变体(2+ 节点)
在 6.1 基础上替换引擎段:
"engine": {
"type": "redis",
"redis": {
"address": ["redis://10.0.0.11:6379", "redis://10.0.0.12:6379"],
"password": "<Redis 密码>"
}
}
要点:多节点共享同一配置与密钥(JWT 任意节点可验);history/presence 数据落到 Redis,节点无状态可水平扩容;node.name 留空自动生成即可,API info 方法可逐节点观测。
七、常见问题
Q1:改了配置不生效?
确认走的是 restart/reload;热重载只覆盖运行期参数(端口、引擎等启动期参数必须 restart)。reload 后看日志是否有 configuration successfully reloaded。
Q2:checkconfig 通过但 -s 严格模式报 unknown keys in config?
配置里存在当前版本不认识的字段——可能是从旧版本/教程抄来的 v5 平铺键,或拼写笔误。严格模式正是升级版本后迁移配置的核对工具(实测:unknown keys in config: typo_key)。
Q3:环境变量和配置文件同时设置时哪个生效? 优先级 flags > 环境变量 > 配置文件(3.4 节实测:配置 8130,env 8131 生效为 8131,flag 8132 再覆盖)。排查「明明改了配置却行为异常」时先查进程环境里有没有 CENTRIFUGO_* 变量。
Q4:客户端订阅被拒 error 103?
见安装篇 FAQ Q5:默认策略拒绝客户端订阅,命名空间需 allow_subscribe_for_client: true,且频道名必须带命名空间前缀(chat:main 而非 chat)。
Q5:allowed_origins 设 ["*"] 有警告?
服务端日志输出 usage of allowed_origins * is discouraged for security reasons, consider setting exact list of origins。生产环境请写精确 Origin 列表。
Q6:配置文件权限要求?
程序以 0600 写出(保护密钥),但服务以 centrifugo 用户运行,需手工调整为 root:centrifugo 640——否则报误导性的 config file not found(安装篇 4.5 节实测)。
八、参考链接
- 官方配置文档总览:https://centrifugal.dev/docs/server/configuration
- 服务器配置指南:https://centrifugal.dev/docs/server/server-configuration
- 频道与命名空间:https://centrifugal.dev/docs/server/channels
- 认证与鉴权:https://centrifugal.dev/docs/server/authentication
- 站内相关:《Ubuntu 22.04 安装 Centrifugo 指南》、《Centrifugo 6.10 常用 CLI 命令详解》、《Centrifugo 6.10 介绍与选型指南》