几个朋友凑在一起想打 Terraria,第一件要定下来的事往往不是谁当坦克、谁刷装备,而是谁来开服、开哪种服。原版 Terraria 和装了 tModLoader 的模组服,看起来只差一个启动器,实际从下载的文件、生成的世界后缀,到客户端要不要装同样的模组,全是两套逻辑。这篇就把我自己开过的原版服和 tModLoader 服完整走一遍:服务端包怎么下载、serverconfig.txt里每一项是什么意思、控制台敲什么命令、端口怎么放、朋友怎么连进来,以及挂了一两个月之后备份和排错的经验。刚入坑、只想周末和朋友联机的新手能照着抄;已经开过服但总在"连不上""模组不匹配"上翻车的,也能在对应章节里找到原因。
1. 开服前先分清:原版服和 tModLoader 服不是同一件事
很多人第一次开服的顺序是反的——先急着找"开服包",下完才发现客户端版本对不上、朋友装了模组进不来。正确的顺序是先决定玩原版还是玩模组,再决定用哪套服务端,最后才谈网络。因为这两种服的整个生态是分开的:原版客户端能连原版服,装了 tModLoader 的客户端能连 tModLoader 服,而两边混着来基本连不上,连上了也会出现物品消失、地图错位这类更麻烦的问题。
1.1 原版服与模组服的核心差别
原版 Terraria 的多人玩法由官方提供的专用服务端承担,服务端本身不带 UI,只有个控制台窗口,所有配置都靠文本文件。tModLoader 则是一个基于 Terraria 的模组加载器,它自己是一套客户端,同时提供同名的服务端程序;模组服的世界里会有新物品、新 NPC、新 Boss,这些东西客户端必须有对应的模组文件才能显示,否则一进世界就是一堆问号方块和报错。
| 对比项 | 原版服 | tModLoader 服 |
|---|---|---|
| 服务端来源 | 官网下载的专用服务端压缩包 | tModLoader 客户端目录或官方单独发布的服务器包 |
| 世界文件后缀 | .wld | .twld |
| 玩家数据后缀 | .plr | .tplr |
| 客户端要求 | 任意同大版本的原版客户端 | 必须装 tModLoader,且模组列表要对齐 |
| 配置复杂度 | 低,一个文本文件搞定 | 中高,多一层模组版本与依赖 |
| 典型用途 | 稳定长期挂机、轻量联机 | 玩内容包、灾厄之类的大型模组 |
1.2.wld和.twld不能互相通用
这是我见过最多的新手事故:把模组服玩出来的世界文件丢进原版服务端,或者反过来,结果服务端报错读不出来,有的甚至直接把文件里的数据截断。记住后缀就行——原版是.wld,模组版是.twld,同时旁边还会有一个.wld.bak或.twld.bak的自动备份。服务端每次正常保存时,会把上一次的世界写成.bak,这个.bak在存档崩了的时候就是救命稻草,所以备份的时候别只复制主文件,.bak一起带走。
另外,玩家数据也一样:原版是.plr,模组服是.tplr。换服的时候把玩家的.plr直接挪到模组服,人物的模组物品栏会不匹配,轻则物品丢失,重则人物读不出来。跨模式搬人物,最稳的办法是让玩家把装备存进箱子,人物重新建。
1.3 先想清楚挂在哪、能带几个人
家用机器开服最大的错觉是"我这台电脑很强"。Terraria 服务端本身对 CPU 和显卡要求极低,真正的瓶颈是两条:上行带宽和内存。原版服一个玩家占用很小,家用宽带上行三四十兆带七八个人是够的;但模组服尤其是内容量大的整合包,服务端内存吃到 4 到 8 GB 很常见,世界越大、模组越多、掉落的物品堆在地上越多,内存就越紧张。
还有一个很容易忽略的点:Windows 的电源计划。默认的"平衡"或"节能"会让机器在没人操作时进入睡眠,人一睡,服务端进程就被挂起,朋友那边直接掉线。开服之前把电源计划改成"从不睡眠"、关闭硬盘休眠,这一步不花一分钟,能省掉一整晚的排查。
如果家里网络不方便长期开着,用一台云主机也完全可行,Linux 环境跑服务端反而更稳,后面的章节里我会把 Linux 上的做法一起写上。选配置的时候别只看 CPU 核心数,模组服优先看单核性能和内存容量,Terraria 服务端本质上是单线程跑主循环的。
2. 原版 Terraria 服务端:从下载到第一条 MOTD
原版服是最好上手的,全程不用碰命令行以外的任何东西。它没有图形界面,所有操作都在一个黑色窗口里敲命令,第一次看会觉得简陋,但用习惯了会发现这种服务端特别省资源,挂着几个月都不用管。
2.1 服务端程序和游戏本体分开放
服务端压缩包建议解压到一个独立目录,比如D:\TerrariaServer,不要塞进 Steam 的游戏安装目录。原因有两个:一是 Steam 校验文件或更新客户端的时候,可能会碰到你放在里面的服务端文件;二是独立目录方便整体打包迁移,换机器的时候直接把文件夹拷走就行。
解压后你会看到类似这些内容:Windows 下是TerrariaServer.exe,Linux 下是TerrariaServer.bin.x86_64,还有一个serverconfig.txt。Linux 上记得先给它加执行权限,不然双击或者./运行会报权限不够:
chmod +x TerrariaServer.bin.x86_64另外注意,服务端和客户端的大版本号要一致。Terraria 每个大版本更新都会调整网络协议,1.4 的服务端配 1.3 的客户端是连不上的。服务端包里一般会带版本说明,下载时对照一下客户端版本,别下到旧包。
2.2serverconfig.txt逐项拆开看
这个文件是原版服的核心,绝大多数问题都能在这里解决。它是一个纯文本文件,#开头的是注释。用记事本打开,把关键项改一遍再启动,比启动之后在控制台里一项项设要省事得多。
| 配置项 | 作用 | 怎么填更省心 |
|---|---|---|
world | 直接指定要加载的世界文件路径 | 只想挂已有存档时填这里,填了就不会问你新建世界 |
worldname | 自动生成世界时用的名字 | 建议纯英文或拼音,中文名在部分版本上会出乱码 |
worldpath | 世界文件存放目录 | 单独指到一个盘,方便整目录备份 |
autocreate | 没有指定世界时自动生成的大小 | 1 小、2 中、3 大,第一次开服建议先 1 试水 |
seed | 世界种子 | 想和朋友玩同一张图就填;留空则随机 |
difficulty | 世界难度 | 0 普通、1 专家、2 大师、3 旅行,按团队水平选 |
maxplayers | 最大玩家数 | 默认 8,家用机器别贪多,超出上行带宽会集体卡顿 |
port | 监听端口 | 默认 7777,改成别的要同步通知朋友 |
password | 进服密码 | 只要不是纯局域网,一定填一个 |
motd | 进服时显示的欢迎语 | 可以写规则和联系方式,替代公告板 |
secure | 服务端防护相关开关 | 面向不特定人群的公开服建议开启 |
upnp | 自动端口映射 | 路由器支持 UPnP 时填 1,能省掉手动映射 |
npcstream | NPC 同步的刷新范围 | 0 到 60,网络吃紧时调到 30 以下 |
priority | 服务端进程优先级 | 保持默认即可,拉到最高反而可能拖慢整机 |
一个常见的取舍是npcstream。它决定了服务端把多远处的 NPC 和怪物同步给客户端,值高画面流畅但吃带宽,值低省带宽但远处的敌人会"瞬移"出现。家里上行紧张、朋友又分散在不同城市的时候,把它调到 30 左右,观感下降不大,掉线率却明显下降。
还有一点必须说明:不同版本的serverconfig.txt支持的键会有差别,比如某些版本多出世界回滚存档保留数量之类的选项。最好的习惯是打开官方给的那份文件,先把它自带的注释读一遍,上面写的就是这个版本真正认的键。网上抄来的配置如果报"unknown key",别慌,删掉那一行就行。
2.3 第一次生成世界:控制台会问你什么
如果serverconfig.txt里没有写world,服务端启动后会进入交互式提问,流程大概是这样:先让你选世界大小,1 小 2 中 3 大;再选世界难度;然后询问是新建世界还是从列表里挑一个已有的,新建的话给它起个名字。这里有两个细节值得注意。
第一,生成大世界要等一会儿,控制台会停在一行不动,那不是卡死了,是在跑地形生成,小世界几十秒,大世界一两分钟都正常,中途千万别关窗口,关掉会留下一个残缺的世界文件。第二,世界名字带上世界大小和难度,比如SmallClassic01,以后备份目录里堆了十几个文件的时候,你会感谢当初这个命名习惯。
世界跑起来之后,控制台会打印出端口、最大玩家数、MOTD,然后显示"Listening on port 7777"之类的信息,这时候服务端就在等了。想验证的话,在同一台机器上开客户端,多人模式里选通过 IP 连接,输127.0.0.1加端口,能进就说明服务端本身没问题,剩下的就是网络的事。
2.4 控制台命令与关服的正确姿势
原版服务端的控制台命令不多,记住常用的那几个就够日常用了。敲help能看到完整列表,常用的是下面这些:
playing或list:看当前在线的玩家save:立即保存世界say 内容:向所有玩家广播一条消息kick 玩家名:踢人ban 玩家名和ban list:封禁和查看封禁列表password 新密码:中途改密码motd 新欢迎语:中途改 MOTDmaxplayers 数字:中途改人数上限time、dawn、noon、dusk、midnight:查时间、切时间settle:强制液体沉降exit和exit-nosave:保存退出、不保存退出
直接点窗口右上角的叉,是关服里最危险的操作。那样服务端没有走保存流程,世界文件可能停在写入一半的状态,运气不好整个存档读不出来。正确顺序永远是:先在控制台敲一次save,确认提示保存完成,再敲exit。多花五秒钟,省掉一次回档。
settle这个命令值得单独说一句。世界刚生成或者被人挖开大片液体之后,水会一直流动,服务端要不停计算液体扩散,这是原版服卡顿最常见的隐形原因。找个没人的时间敲一次settle,让它把液体一次性算完,之后 TPS 会稳很多。
3. tModLoader 服务端:模组服真正麻烦的地方
模组服的流程和原版相似,但多出来一层"模组",而这一层才是绝大多数事故的来源。原版服只要能连上就能玩,模组服即使连上了,也可能因为某个模组的版本不一致,出现 Boss 打不死、合成表对不上、玩家一靠近某片区域就掉线这类诡异现象。
3.1 三处版本必须对齐
开模组服之前先确认三个版本号一致:客户端 tModLoader 版本、服务端 tModLoader 版本、以及所有模组本身的版本。tModLoader 的服务端和客户端必须是同一版本,这一点和原版一样严格;模组更细,同一个模组的 1.2.0 和 1.2.1 在有网络交互的场景下也可能不兼容。
实操上最省事的办法是:在客户端里把模组全部装好、确认能单人进图不出问题,然后再把整个模组环境复制到服务端,而不是两边分别下载。这样版本天然一致,省掉一轮对版本号的折磨。
顺带提一下运行环境:比较新的 tModLoader 需要机器上装有对应的 .NET 运行时,缺了的话启动脚本会闪一下就退,或者提示找不到框架。这类报错很直白,按提示装对应版本的运行时就行,不用去猜。
3.2 Mods 目录、enabled.json和客户端模组的划分
tModLoader 的模组文件是一个个.tmod文件,放在 Mods 目录里;同目录下还有一个enabled.json,记录着哪些模组处于启用状态。这两样东西要一起搬,只复制.tmod不同步enabled.json,服务端和客户端的启用列表就对不上。
模组要不要装到服务端,可以按这个逻辑判断:
| 模组类型 | 例子方向 | 服务端是否需要 |
|---|---|---|
| 添加物品、NPC、Boss、地形 | 大型内容包 | 必须装,且版本一致 |
| 修改游戏机制、数值 | 平衡类调整 | 必须装,否则判定不一致 |
| 纯客户端界面类 | 信息显示、配方查询 | 一般只需客户端装 |
| 工具类、快捷操作 | 快捷键增强 | 通常客户端装即可 |
这个划分不是拍脑袋定的,原理在于:影响世界数据的模组,服务端必须知道;只影响本机显示和操作的模组,服务端不知道也没关系。但要注意,少数声称"客户端可用"的模组实际会改到玩家数据,这类模组装在客户端而服务端没装,联机时就会出问题。遇到"单人正常、联机异常"的怪现象,第一个排查方向就是模组列表两边不一致。
tModLoader 支持客户端从服务端自动下载缺失的模组,听起来很方便,但实际体验取决于服务端的上行带宽,几个模组还好,几十上百兆的整合包让每个人挨个下载,朋友等到心态爆炸。稳妥做法是把 Mods 目录和enabled.json一起打包发给大家,解压到各自的 Mods 目录,进服前先确认模组列表和服务端一模一样。
3.3 启动脚本、内存参数与日志怎么读
新版 tModLoader 的服务端一般是通过启动脚本拉起,Windows 下是start-tModLoaderServer.bat,Linux 下是start-tModLoaderServer.sh。这些脚本本质上就是设好环境变量再调用服务端主程序,看懂它有助于排查问题——比如某些脚本里会预留内存相关的参数位置,整合包比较大的时候,把内存上限提上去能明显减少卡顿和随机崩溃。
启动过程会打印大量日志,别被吓到,重点看几类信息:加载了多少个模组、有没有模组加载失败、世界加载是否正常、最后有没有出现监听端口的信息。模组加载失败通常会把模组名和错误内容一起打出来,看到某个模组名反复出现,基本可以确定是它的问题,先禁用它再启动,能排除就说明是那个模组的锅,去找它的适配版本或者替代品。
还有个容易被忽略的点:模组加载失败不一定会让服务端退出。有时候服务端照常起来了,但少加载了一个模组,玩家进去发现某些物品变成"未定义",或者某个 BOSS 召唤不出来。所以每次改完模组之后,养成习惯看一眼日志开头那段模组统计,确认数量和你预期一致。
3.4 动模组列表之前,先备份.twld
模组服有一条铁律:只要增删模组,之前先复制一份世界文件。原因很实在——模组在世界数据里留下痕迹,去掉模组之后这些痕迹就成了未知数据,服务端可能直接拒绝加载世界,或者加载了但某些区块异常。加了模组再回去玩原版,基本等于放弃这个存档。
我的做法是给世界文件建一个"版本快照"目录,命名格式是世界名_日期_模组版本,比如CalamityRun_20240518_v1。改模组之前复制一份进去,出问题直接回滚,成本是几十秒的复制时间,收益是不用重开一个玩了两百小时的世界。备份的时候顺手把enabled.json也复制一份,这样连当时的模组列表都能还原。
4. 让外面的朋友连进来:端口、防火墙与连接方式
服务端能在本机进,说明游戏层面已经通了,问题就转移到网络。这一段是新手最容易卡住的地方,因为报错信息往往只有一句"无法连接",具体卡在哪一环全靠自己排查。我习惯按"从内到外"的顺序逐层验证,哪一层断了就修哪一层。
4.1 先在局域网里验证,别一上来就折腾外网
正确的排查顺序是这样的:同一台机器上用127.0.0.1连一次,通了说明服务端本身没问题;然后让同一路由器下的另一台设备用主机的内网地址连一次,比如192.168.1.100:7777,通了说明端口监听和系统防火墙都没问题。只有这两步都通过,再去处理外网映射,否则你会在一个本来就有问题的服务端上反复折腾路由器,纯属浪费时间。
内网这一关最常卡在系统防火墙上。Windows 第一次运行服务端程序时会弹窗问"是否允许访问网络",很多人随手点了取消,之后就一直是内网也连不上的状态。补救办法是去防火墙的"入站规则"里手动加一条:允许该程序通过专用和公用网络,协议按游戏实际使用的来,Terraria 的多人协议以 TCP 为主,端口填你在配置里写的那个,日志里通常会明确提到是 TCP 还是 UDP,以日志为准。
4.2 端口映射与 UPnP:两条路各有什么坑
外网访问的本质是把公网上的某个端口,转到你内网这台机器上的服务端端口。有两条路:手动在路由器后台做端口映射,或者靠 UPnP 自动完成。
手动映射的入口一般在路由器管理页的"端口转发""虚拟服务器"之类的菜单里,需要填四样东西:外部端口、内部 IP、内部端口、协议。外部和内部端口建议填一样的,省得记;内部 IP 要填主机在局域网里的固定地址,这里有个大坑——主机的内网 IP 是靠 DHCP 分配的,重启路由器之后可能变,映射规则就指向了一台不存在的机器。解决办法是在路由器里给主机绑定静态地址,或者在系统里手动设一个局域网内的固定 IP。
UPnP 那条路更省事,serverconfig.txt里把upnp打开,路由器如果支持并且开了这个功能,服务端会自动申请一条映射,日志里会显示映射成功。它的缺点是不同路由器实现差异大,有些家用路由器默认关闭 UPnP,有些映射会在重启后失效。所以我的习惯是:先用 UPnP 试一次,成了就用,不成再老老实实手动配,别把时间耗在猜路由器行为上。
还有一种情况值得说清楚:如果服务端跑在云主机上,你根本不需要做端口映射,只需要在云服务商的安全组里放行对应端口就行。安全组是云平台自己的防火墙,和系统防火墙是两回事,两个都要放行,少一个就连不上。这个坑我踩过,当时在两个地方反复确认了好几遍才反应过来。
4.3 密码、白名单与防破坏
服务端一旦暴露在公网,就会有人扫端口。Terraria 的服务端本身防护手段有限,能做的其实就几件事,但每一件都很有效。
第一,一定要设密码。serverconfig.txt里的password填上,玩家进服需要输入。密码别用"123456"这种,端口扫描的机器人会尝试常见弱口令。
第二,关掉不必要的信息暴露。MOTD 里不要写你的联系方式或者真实信息,服务端的say广播也注意分寸,公开发言所有人都能看到。
第三,用封禁列表管人。控制台的ban命令会把玩家加进封禁列表,列表文件就在世界文件所在的目录旁边,可以手动编辑。对于不请自来的玩家,先踢再封,别犹豫。
第四,定期看日志。注意日志里异常的连接尝试、频繁的进出记录,这些是有人在试探的信号。公开服还可以考虑只在朋友在线的时间段开服,其余时间直接关掉,暴露时间越短越安全。
4.4 想更省事的话,还有别的连接方式
不是所有场景都需要把服务端暴露到公网。如果只是一两个朋友一起玩,用游戏内置的"主机并游玩"模式,通过平台的好友邀请直接进入,完全不用碰端口和映射,这是最省心的方案,代价是主机玩家的电脑必须一直开着游戏,而且自己不能退出。
专用服务端的优势在于可以挂机、可以多人同时在线、主机玩家不玩的时候世界也还在。两者不是替代关系,是两种场景:临时开一晚上,用内置联机;想长期经营一个世界,用专用服务端。想清楚这一点,能省掉很多不必要的折腾。
5. 长期挂服的运维习惯
服务端跑起来只是开始,真正决定体验的是后面这些琐碎习惯。我挂过最长的一个模组服连续开了三个多月,中间经历过停电、内存爆掉、模组更新导致世界加载失败,最后能救回来全靠备份和日志。这部分内容不炫技,但每一条都是花时间换来的。
5.1 备份脚本和一次真实的还原演练
手动复制世界文件这件事,坚持三天容易,坚持三个月很难。用一个脚本定时打包才靠谱。Linux 上可以这样,先让服务端保存一次,再打包整个世界目录,并自动清理两周前的旧备份:
#!/bin/bash # 世界自动备份:建议每天凌晨人少的时候跑一次 STAMP=$(date +%Y%m%d_%H%M) tar -czf /home/terraria/backup/world_$STAMP.tar.gz -C /home/terraria/server Worlds # 只保留最近 14 份,避免把磁盘塞满 find /home/terraria/backup -name "world_*.tar.gz" -mtime +14 -delete关键在于执行时机:打包之前一定要让服务端完成一次保存,否则可能拷到正在写入的文件。最稳的做法是在控制台敲save,确认保存提示出现之后再执行脚本。如果要用计划任务自动跑,就把它安排在凌晨没人的时间段,并且接受"可能拷到上一次自动保存的状态"这个现实——比没有备份好得多。
备份做完之后,至少演练一次还原。很多人备份了一堆文件,真出事的时候才发现不知道文件该放哪、要改哪个配置。还原流程其实很简单:停服务端,把备份的世界文件解压回世界目录,覆盖同名文件,启动服务端加载。整个流程自己走一遍,真出事的时候就不会手忙脚乱。
5.2 定时重启、液体沉降和内存占用
服务端长期运行会遇到内存缓慢增长的问题,尤其是模组服,跑几天之后内存占用比刚启动时高不少,表现是越来越卡、偶尔卡住几秒。这不是玄学,是长时间运行积累的对象没被及时回收。应对办法很朴素:固定时间重启一次,比如每天凌晨重启,重启前先save。
重启之后顺手做两件事:一是敲一次settle,把积累的液体流动一次性算完;二是看一眼日志开头的模组加载信息,确认没有模组加载失败。这两个动作加起来不到一分钟,但能避开很多莫名其妙的卡顿。
如果家里是经常停电的环境,配个不间断电源是最实在的投资。一次突然断电就可能留下损坏的世界文件,而恢复一个几周前的备份,损失的是所有人这几周的进度。
5.3 Linux 上怎么让服务端"关掉终端也不停"
用 SSH 连到云主机启动服务端,有个新手必踩的坑:终端一关,服务端跟着退出。因为服务端进程挂在当前会话下,会话结束进程就被终止了。解决办法是用会话保持工具,比如screen:
# 新建一个叫 terraria 的会话 screen -S terraria # 在会话里启动服务端 cd /home/terraria/server ./start-tModLoaderServer.sh -config serverconfig.txt # 按 Ctrl+A 再按 D,脱离会话,服务端继续在后台跑 # 下次想进控制台,执行: screen -r terraria这套操作的好处是,你既可以让服务端长期在后台运行,又能随时"回到"控制台敲save、say、exit,和坐在机器前面操作是一回事。想再规范一点,可以写成系统服务交给系统管理,开机自启、崩溃自动拉起,云主机重启之后也不用人工干预。
5.4 几个高频故障的对照排查
下面这张表是我自己遇到过的典型问题,按可能性从高到低排,遇到的时候可以直接照着查:
| 现象 | 优先怀疑 | 处理办法 |
|---|---|---|
| 内网都连不上 | 系统防火墙未放行 | 检查入站规则,重新允许程序联网 |
| 内网通、外网不通 | 端口映射未生效或公网 IP 变了 | 确认映射规则指向的 IP 和主机当前内网地址一致 |
| 云主机上内网通、外网不通 | 云平台安全组未放行 | 在平台控制台放行对应端口,和系统防火墙是两回事 |
| 模组客户端进服报错 | 模组列表或版本不一致 | 两边的 Mods 目录和enabled.json完全同步 |
| 世界加载失败 | 世界文件损坏或模组被移除 | 用.bak回滚,或恢复改动前的备份 |
| 玩一会儿集体卡顿 | 液体流动、内存增长 | settle一次,安排定时重启 |
| 深夜突然掉线 | 主机进入睡眠 | 电源计划改为从不睡眠,关闭硬盘休眠 |
| 控制台窗口关掉后世界异常 | 没有走保存流程 | 养成save再exit的习惯 |
排查的核心思路是分层定位:游戏层、系统层、网络层、平台层,一层一层往里收,不要在没验证过前一层的情况下跳到下一层去改配置。绝大多数"连不上",最后都能归到上面这张表里的某一行。
我个人在开服这件事上最深的体会是:能自动的绝不手动,能备份的绝不信运气。世界文件是所有人几个月的进度,值得你多花十分钟写个脚本;模组环境是版本的地雷阵,值得你养成"改之前先备份、改之后先看日志"的条件反射。至于配置参数,不用一开始就追求完美,先把服跑起来,进游戏玩两把,卡了再回来调npcstream、加内存、换世界大小——先跑通,再调优,比对着文档纠结一晚上实在得多。