frp升级后启动报错unmarshaling JSON,配置文件要怎么改
服务器上的 frp 用了挺久,一直拿老版本 frps 配一份 ini 在跑。最近升级到新版,启动命令还是老样子,结果服务起不来,屏幕上甩出一长串报错:error unmarshaling JSON: while decoding JSON……后头还跟着 json: cannot unmarshal string 之类的字样。配置一个字没动,怎么升完级就看不懂报错了?
原因分析
这个报错出在配置文件的解析环节:frp 从 0.52.0 版本起对配置体系做了一次大切换——默认配置格式从 ini 换成 toml,同时支持 yaml 和 json,ini 进入弃用状态。新版程序启动时按新格式的结构去"读"配置:该是数字的字段就得是数字、代理服务要求是结构化的段落节点。而旧 ini 是平铺的键值对写法,迁移时手工照搬、随手改名,很容易出现类型对不上的情况——比如端口写成了带引号的字符串、代理段没有按新格式组织——解析器按新结构解码失败,就抛出 unmarshaling JSON 这串报错。换句话说,不是服务器坏了,是"配置的写法"和"程序的读法"没对上版本。
分步解决
- 先确认版本:在 frp 所在目录执行
./frps -v(客户端是./frpc -v),看清当前是不是 0.52.0 及以上;从老版本一路沿用 ini 上来的,九成是格式迁移问题。 - 备份旧配置再动手:把现有 ini 复制一份留底再改。过渡期新版仍可用
-c参数显式指定 ini 启动,但每次都会提示 ini 已弃用、后续版本会移除——这只是过渡手段,不能当长期方案。 - 按新结构重写配置:ini 里的
[common]段对应 toml 顶层的serverAddr、serverPort这类字段;原来一个一个的代理段(如[ssh])改写成[[proxies]]数组节点,name、type、localIP、localPort 逐项填进去,每个代理自成一段,不再往公共段里塞。 - 盯住类型细节:新格式对类型敏感——端口号、数字参数不加引号;布尔值写 true/false;字段名对照新版文档核一遍拼写。报错里 cannot unmarshal string 提示的正是"把字符串塞给了要数字的字段"这类错位。
- 小步验证再上生产:先用极简配置(只留一个代理)启动一次,
./frps -c frps.toml,确认能正常监听再逐步补齐其余代理项;服务端客户端两边同步改、版本保持一致,避免一头新一头旧。
预防
把 frp 的版本号和配置格式写进变更记录,升级前先读一遍官方发布说明里关于配置的部分;配置文件纳入版本管理,改格式这类动作留下前后对比,回退有据。诚鑫致达科技给客户交付远程访问链路时,习惯把 frp 版本与配置格式一并写进变更单再动手升级,窗口期内新旧配置各留一份,正是为了把这类看不懂的报错拦在变更环节。