7. 常见问题

常见问题 FAQ

部署

Q1: 启动时提示 8080 端口被占用?

通过环境变量 SERVER_ADDR=:9090config.yaml 中的 http.addr 修改监听端口。

Q2: 独立模式的数据文件在哪里?

默认位于 ./config/sqlite.db。Docker 部署时请确保 ./config/ 目录挂载并有写权限:

mkdir -p config && chmod 666 ./config

Q3: 能否把 SQLite 的数据迁移到 MySQL?

可以,但需要手工操作:导出 SQLite 表 → 在目标 MySQL 创建库 → 导入。建议在低峰期、停机迁移。

Q4: JWT_SECRET 忘记改,已经跑了一段时间怎么办?

修改 JWT_SECRET 后所有已签发的 Token 会立即失效,用户需要重新登录,不会丢失数据。生产环境务必在首次部署前就设置好。

使用

Q5: 自定义短码有什么限制?

字符集为 [a-zA-Z0-9\-_.]+,长度受 shortlink.lengthcustom_length 控制。不能与已存在的短码重复。

Q6: 多实例部署时点击计数重复了怎么办?

请将 CACHE_DRIVERID_GENERATOR_DRIVER 都切换到 redis。local 模式仅适合单实例。

Q7: A/B 测试的流量一致性是怎么保证的?

通过 Cookie / 会话 ID。同一访客在测试期间始终命中同一变体。清除 Cookie 或更换设备会被视为新访客。

Q8: 如何禁用某个短链接而不删除?

调用 PUT /api/v1/short_links/{id}/status 设为 inactive,跳转会回退到错误页。之后可随时改回 active

性能与运维

Q9: 单实例能承载多少 QPS?

参考值:独立模式(SQLite + 内存缓存)约 1000-3000 QPS;生产模式(MySQL + Redis)单实例 10000+ QPS,具体取决于机器配置。

Q10: 点击数据越来越多,怎么做归档?

当前版本没有内置归档,建议通过 MySQL / PG 的分表或外部工具(如 pt-archiver)定期归档历史数据。也可以通过 DAO 自行扩展分区策略。

Q11: 如何开启 HTTPS?

推荐在 dwz-server 前加 Nginx / Caddy / Traefik 做 TLS 终止;dwz-server 本身继续监听 HTTP。

Q12: 日志文件过大怎么处理?

log 配置项支持按大小滚动(max_size)、按天数过期(max_age)、保留份数(max_backups)与压缩(compress)。

开发

Q13: 能否二次开发用于商业项目?

可以,但禁止发布衍生版本。具体见仓库根目录的 LICENSE

Q14: 去哪里提 Bug / 功能建议?