拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Terraria 与 tModLoader 开服联机:配置、模组同步与运维

Terraria 与 tModLoader 开服联机:配置、模组同步与运维

Terraria 开服这事,说穿了就是把一个服务端程序跑起来,然后让别人连进来。但我见过太多人卡在"程序明明跑起来了,朋友就是连不上"这一步,折腾一晚上最后放弃,回去开单机。其实这里面的坑不复杂,无非是版本对不对得上、端口有没有放开、模组是不是两边一致、存档路径写没写对这几件事。这篇就把Terraria和tModLoader两套服务端的完整搭建流程、配置参数、模组同步、联机连通和长期运维一次性说清楚,不管你是第一次开服的萌新,还是想把自己那台旧笔记本改造成长期在线的朋友服务器,都能照着抄。

我自己前前后后开过七八次服,从最开始的 Windows 本机双击 exe,到后来在云主机上用 systemd 长期挂着跑 tModLoader,中间踩的坑足够写一本小册子。下面按"想清楚 → 装原版 → 装模组版 → 让人连进来 → 长期稳定跑 → 出问题怎么查"这个顺序讲,每一步都给出可以直接复制的配置和命令。

1. 开服之前,先把三个问题回答清楚

很多人一上来就问"服务端在哪下",其实下载是最简单的一步,真正决定你后面顺不顺的是开服前的三个决策:开原版还是开模组版、主机放在哪、版本怎么对齐。这三件事想错了,后面全是返工。

1.1 原版服务端和 tModLoader 服务端不是一回事

这两个东西名字只差几个字母,实际是两个完全独立的程序,互相不兼容。原版服务端只能跑原版客户端,用的是 Terraria 官方发布的TerrariaServer.exe(Windows)或者对应的 Linux 二进制文件,特点是体积小、内存占用低、启动快,一个中世界跑 8 个人,内存占用通常在 500MB 上下,随便找台能开机的电脑都能带得动。

tModLoader 服务端则是模组加载器的服务端版本,它本质上是在原版游戏逻辑外面套了一层模组框架,能够加载.tmod格式的模组文件。代价是启动过程复杂不少,需要初始化模组、编译资源,第一次启动可能要好几分钟,内存占用也会随着模组数量水涨船高,装了二十个中型模组的话,4GB 内存是起步价。

判断标准很简单:你和朋友想玩的模组列表里哪怕只有一个非原版内容,就必须走 tModLoader 这条线,没有任何折中方案。原版服务端加载不了任何模组,硬塞进去只会让服务端启动失败。

1.2 主机放哪:三种方案的成本和取舍

主机位置决定了后面"别人怎么连进来"这一段是简单还是麻烦。常见就三条路:

方案成本稳定性适合谁主要代价
本机(自己电脑)零你关机就掉线偶尔和两三个朋友玩必须一直开着游戏窗口外的服务端进程
家里闲置电脑/旧笔记本电费高,可长期在线固定小圈子长期玩需要配端口映射,涉及路由器设置
云主机(Linux)每月几十块最高,7×24人多、长期、模组重需要一点命令行基础

我的建议是:如果你只是周末和朋友玩两三个小时,本机开服就够了,用不着一堆配置;如果是固定五六个人打算玩一两周打通一个档,找台闲置机器或者买台低配云主机,长期在线的体验完全不是一个量级。云主机还有个隐藏好处——它天然有公网地址,省掉了端口映射这一整段麻烦。

1.3 版本一致是底线,客户端和服务端必须对表

Terraria 的版本号是四段式的,比如 1.4.4.9。服务端和客户端的大版本必须一致,小版本差一点点通常还能连,但如果差到 1.4.3 对 1.4.4 这种程度,客户端会在连接阶段直接报"版本不匹配"。

tModLoader 更严格,它有两层版本要对齐:一层是 tModLoader 自身的版本,另一层是每个模组的版本。你的客户端 tModLoader 是 1.4.4 对应的版本,服务端也必须是同一个大版本;模组更是要求两边完全一致,服务端装的是 A 模组的 2.1 版,客户端装了 2.3 版,进服时会提示模组版本不匹配,然后把你踢回主菜单。

实操习惯:开服前先在群里把版本号确认一遍,服务端定下来之后不要随便更新,尤其是不要单方面更新 tModLoader。更新前先备份整个存档目录,这一步养成习惯能省掉很多眼泪。

2. 原版 Terraria 服务端:从下载到跑起来

原版服务端适合先拿来练手,它的配置结构清晰,搞清楚之后再上 tModLoader 会顺畅很多,因为两者的配置文件格式基本是同一套。

2.1 服务端文件的获取与目录规划

官方服务端在 Terraria 官网的下载页可以拿到,Windows 版是一个压缩包,解压出来包含TerrariaServer.exe、serverconfig.txt、若干.dll文件和几个运行库。别把服务端丢在桌面上跑,桌面路径经常带中文和空格,某些运行库读取路径时容易出问题。

推荐这样规划目录:

D:\TerrariaServer\ ├── TerrariaServer.exe ├── serverconfig.txt ├── banlist.txt ├── Worlds\ (世界存档放这里) └── Logs\ (日志输出)

Worlds和Logs两个文件夹需要自己建,然后在配置文件里指过去。这样做的好处是整份数据都在一个目录下,备份的时候直接打包整个文件夹就行,换机器也是复制走就能用,不用去翻我的文档里那些乱七八糟的路径。

Linux 上通常用tar.gz压缩包,解压后给主程序加执行权限:

tar -xzf terraria-server-*.tar.gz -C /opt/terraria chmod +x /opt/terraria/TerrariaServer.bin.x86_64

Linux 版服务端还需要对应的运行库,老版本依赖 mono,新版本已经改成自带的 .NET 运行时,具体以你下载页的说明为准。跑起来之前先用ldd看一眼依赖有没有缺:

ldd /opt/terraria/TerrariaServer.bin.x86_64 | grep "not found"

有输出就说明缺库,缺什么装什么,这一步不解决,后面启动会直接报错退出。

2.2 serverconfig.txt 逐项拆解

这个文件是开服的核心,每一行都影响服务端的实际行为。新手最容易犯的错是直接拿默认文件跑,结果世界建在默认路径、密码为空、端口被别的程序占了。下面这份是我自己长期用的配置模板,逐项解释:

# 已有世界的路径,第一次开服可以留空,用 autocreate 生成 world=D:\TerrariaServer\Worlds\MyWorld.wld # 世界的名字,会显示在存档列表里 worldname=MyWorld # 存档目录 worldpath=D:\TerrariaServer\Worlds\ # 没有 world 时自动生成世界,1=小 2=中 3=大 autocreate=2 # 随机种子,留空就随机 seed= # 难度 0=经典 1=专家 2=大师 3=旅行 difficulty=1 # 最大玩家数 maxplayers=8 # 监听端口 port=7777 # 进服密码,留空表示不需要 password= # 进服时显示的欢迎语 motd=欢迎,请勿破坏他人建筑 # 保留的世界备份份数 worldrollbackstokeep=3 # 游戏内语言 language=zh-Hans # 自动端口映射(路由器支持 UPnP 时有效) upnp=1 # NPC 同步频率,默认 60,带宽紧张时可以调低 npcstream=60 # 进程优先级,1 表示高优先级 priority=1 # 只允许官方客户端连接 secure=1

几个参数值得单独说。difficulty决定了整个档的走向,专家和大师难度下怪物血量和伤害是翻倍的,服务端一旦创建就不能改,所以开服前一定要和朋友商量好。worldrollbackstokeep是很多人忽略的救命参数,它会让服务端在每次自动保存时留几份历史存档,万一世界文件被写坏,还能回退到十几分钟前的状态。

upnp=1在路由器支持的情况下会自动帮你做端口映射,但实际成功率大概只有一半,很多路由器默认关闭了 UPnP,或者运营商的网关设备不支持。所以别指望它,该手动配端口映射还是得配。

2.3 第一次启动与进服验证

命令行启动指定配置文件:

TerrariaServer.exe -config serverconfig.txt

第一次跑会因为world指定的文件不存在,走autocreate流程生成一个新世界,这个过程视世界大小要等半分钟到两分钟。生成完之后会进入交互式控制台,看到类似下面的提示就说明服务端已经在监听:

Listening on port 7777 Type 'help' for a list of commands.

这时候先在本机自己连一次,客户端里选"加入多人游戏",地址填127.0.0.1,端口7777。本机能进说明服务端本身没问题,再去解决别人连不上的问题,这样排查范围就缩小了一半。

常见误区:很多人跳过本机自测,直接让朋友连,结果朋友连不上,自己也不知道是服务端的锅还是网络的锅。永远先用127.0.0.1验证一次,这是最省时间的做法。

2.4 控制台常用指令速查

服务端跑起来之后是一个纯文本控制台,所有管理操作都靠敲指令。这几个是必须记住的:

指令作用使用场景
help列出全部指令忘了命令时
playing查看当前在线玩家确认谁在服里
save立即保存世界手动备份前
exit保存并退出正常关服
exit-nosave不保存直接退出出了严重问题时
kick 玩家名踢人有人捣乱
ban 玩家名封禁反复捣乱
password 新密码改密码不想让外人进
motd 文本改欢迎语临时通知
dawn/noon/dusk/midnight直接跳到某个时间跳过黑夜
settle让液体停止流动放完一大片水/岩浆后

settle这个指令知道的人不多,但特别实用。你在服里倒了几千格水,服务端要花时间计算液体流动,这段时间会明显卡顿,敲一下settle直接让服务端跳过计算过程,瞬间安静下来。

关服一定要用exit而不是直接关窗口,直接关窗口可能让世界文件处于写入状态,下次打开有概率损坏。这个坑我踩过一次,一晚上的建筑全没了。

3. tModLoader 服务端:让模组多人联机跑起来

原版服务端能跑通,tModLoader 就只是多了"模组"这一层。但它多出来的这一层,恰恰是绝大多数开服失败的根源。

3.1 版本对应关系与安装方式选择

tModLoader 在 Steam 上是独立免费的应用,和你已经拥有的 Terraria 本体是分开的两个库。服务端有两种获取方式:

第一种是直接在 Steam 库里找到 tModLoader,右键属性,在"已安装文件"里就能看到安装目录,里面自带start-tModLoaderServer.bat(Windows)或start-tModLoaderServer.sh(Linux),这份就是完整的服务端。

第二种是通过 steamcmd 在 Linux 云主机上拉取,这种方式适合没有图形界面的服务器:

steamcmd +force_install_dir /home/terraria/tmodloader \ +login anonymous \ +app_update 1281930 validate +quit

1281930是 tModLoader 的应用编号,Linux 上匿名登录就能下载。下载完之后进入目录,给脚本加执行权限。第一次运行脚本时会提示你输入 Steam 凭据,这一步是为了让服务器能够以 Steam 账号身份进行联机验证,按提示操作即可。

版本对应关系必须卡死:tModLoader 有多个分支版本,分别对应 Terraria 的不同大版本。你的客户端是哪个分支,服务端就必须是哪个分支,不能混。客户端和服务端的模组列表也要完全一致,细节下一节展开。

3.2 服务端启动参数与目录结构

tModLoader 服务端的配置文件和原版几乎一样,但多了几个专属参数:

world=/home/terraria/tmodloader/Worlds/TMLWorld.wld worldpath=/home/terraria/tmodloader/Worlds/ worldname=TMLWorld autocreate=2 difficulty=1 maxplayers=8 port=7777 password=yourpassword motd=模组服,进服前确认模组列表 worldrollbackstokeep=3 upnp=1 npcstream=60 language=zh-Hans

启动命令在配置文件之外还能追加参数,常用的是这几个:

./start-tModLoaderServer.sh -config serverconfig.txt

其中-config指定配置文件路径,-modpath指定模组目录,-tmlsavedirectory指定 tModLoader 的数据目录(存档、配置、模组都在这个目录下)。数据目录默认在用户主目录的Documents/My Games/Terraria/tModLoader下,Linux 服务器上一般是~/.local/share/Terraria/tModLoader。如果你想把这些数据统一放到服务端目录里,用-tmlsavedirectory指过去,备份的时候更清爽。

第一次启动会比较慢,因为服务端要初始化模组框架、生成资源缓存。如果控制台停在某一行很久不动,不用急着 Ctrl+C,给它三五分钟。真正卡死的情况是提示了错误信息,那才需要处理。

3.3 模组安装、启用与 enabled.json

模组要放在服务端的模组目录里,路径通常是数据目录下的Mods文件夹。有两种装法:

一是让服务端自己下载。启动之后服务端会进入交互式界面,有一个"从 Steam 创意工坊下载模组"的选项,输入模组名就能拉取,这是最省事的方式,因为它会自动处理依赖关系。

二是手动放置.tmod文件。客户端在创意工坊订阅的模组,本地会有一份打包好的文件,把它复制到服务端的Mods目录即可。但手动放有个坑:如果模组有前置依赖,你得把依赖也一起复制过去,少一个服务端就加载失败。

模组的启用状态记录在Mods/enabled.json文件里。这个文件是一个 JSON 数组,列出了所有被启用的模组名。你可以直接编辑它来批量启用或禁用:

[ "CalamityMod", "CalamityModMusic", "BossChecklist", "RecipeBrowser" ]

编辑完后重启服务端生效。注意数组里的顺序会影响加载顺序,前置模组要放在依赖它的模组前面,否则会加载报错。服务端的交互界面里也有启用/禁用的菜单,不确定顺序的时候建议用界面操作,它会自动帮你排序。

一个非常实用的技巧:服务端启动成功之后,控制台会打印出完整的已加载模组列表和版本号。把这段输出复制发到群里,让每个人对照自己的模组列表检查一遍,能提前解决掉九成的版本不一致问题。

3.4 客户端一致性检查与"进不去"的排查

tModLoader 客户端连接服务端时,会先做一次模组握手:双方交换各自的模组列表和版本,任何一项对不上都会拒绝连接。报错信息一般会明确告诉你哪个模组有问题,看到这种提示直接按名字去对版本,别去折腾网络。

常见的三种不一致:

第一种是模组数量不同。服务端装了 20 个,客户端只装了 18 个,缺的那两个客户端会报"服务端有客户端未安装的模组"。解决办法是把缺的模组装上,或者让服务端禁用掉。

第二种是模组版本不同。同一个模组,服务端是 2.1,客户端是 2.3。这种情况要么升级服务端,要么降级客户端,两边必须一致。创意工坊的模组会自动更新,所以长期开服的话,建议关掉客户端和 steamcmd 的自动更新,或者约定好更新窗口期,大家一起更新。

第三种是模组名相同但实际内容不同。有些模组有多个分支版本,名字前缀一样,这种情况下只能靠版本号区分,看仔细一点。

4. 让朋友连进来:从局域网到公网

服务端跑起来只是第一步,真正的分水岭在这里。同样是"连不上",局域网和公网的原因完全不同,先判断环境再动手。

4.1 局域网直连的最短路径

如果你们在一个路由器下面,比如都在宿舍或者同一个家里,那事情非常简单,完全不需要任何端口映射。

先在跑服务端的那台机器上查本机的内网地址:

ipconfig # Windows,看 IPv4 地址 ip addr # Linux

假设查出来是192.168.1.100,那其他人直接在游戏里输入这个地址加端口7777就能进。前提是服务端那台机器的防火墙放行了 7777 端口。

Windows 上加一条入站规则:

netsh advfirewall firewall add rule name="Terraria 7777" dir=in action=allow protocol=TCP localport=7777

Linux 上:

sudo ufw allow 7777/tcp

这一步做完还没通,先检查是不是服务端压根没起来,用netstat确认端口处于监听状态:

netstat -an | grep 7777

看到LISTEN才算真的在监听。

4.2 路由器端口映射怎么配

要让外网的朋友连进来,就得在路由器上做端口转发,把外部对 7777 端口的访问转给内网那台机器。

第一步,给跑服务端的机器设置固定内网地址。在路由器的 DHCP 设置里找到地址保留(有的叫静态分配),把机器的 MAC 地址和192.168.1.100绑定。这一步不做的话,机器重启后 IP 变了,之前配的转发就失效了。

第二步,登录路由器管理页面,一般是浏览器打开192.168.1.1或者192.168.0.1,账号密码通常在路由器背面。找到"端口转发""虚拟服务器""NAT 转发"这类名字的菜单,新建一条规则:

项目填写内容
名称Terraria
外部端口7777
内部端口7777
内部地址192.168.1.100
协议TCP(不确定就选 TCP+UDP)

第三步,查你的公网地址。在搜索引擎里搜"IP 地址"就能看到,或者在服务端机器的浏览器里访问任意显示 IP 的页面。把这个地址发给朋友,他们用这个地址加端口连接。

现实提醒:现在很多家庭宽带拿到的是运营商的大内网地址,不是真正的公网地址。这种情况下你配了端口转发也没用,因为外网根本访问不到你的路由器。判断方法很简单,把查到的公网地址和路由器 WAN 口显示的地址对一下,如果不一样,基本就是这种情况。解决办法是联系宽带服务商申请公网地址,或者干脆改用云主机。

4.3 云主机部署的实操流程

云主机方案省掉了端口映射,代价是要在命令行里操作。完整流程大概是这样:

# 1. 更新系统并安装依赖 sudo apt update && sudo apt install -y screen tar # 2. 创建独立用户,避免用 root 跑服务 sudo useradd -m -s /bin/bash terraria sudo su - terraria # 3. 下载 tModLoader 服务端 steamcmd +force_install_dir ~/tmodloader +login anonymous +app_update 1281930 validate +quit # 4. 放进 screen 会话里跑,断开 SSH 也不会掉 cd ~/tmodloader screen -dmS tml ./start-tModLoaderServer.sh -config serverconfig.txt # 5. 想回来看控制台就 attach 进去 screen -r tml

用screen是个偷懒但有效的做法,Ctrl+A然后按D可以脱离会话,服务端继续在后台跑,SSH 断开也不会影响它。想优雅一点就用 systemd 托管,下一章会给完整配置。

云主机上还要确认安全组放行了 7777 端口,这个在云服务商的控制台里设置,和机器自身的防火墙是两回事,两个都要开。

4.4 连不上时的分层排查法

连不上别瞎试,按层排查。从近到远依次确认:

第一层,服务端本身。本机用127.0.0.1:7777能不能进。进不去说明服务端有问题,看控制台日志。

第二层,内网连通。同一个路由器下的另一台设备能不能用内网地址进。进不去说明是防火墙或者端口监听的问题。

第三层,端口转发。外网设备能不能连。连不上回到路由器检查规则,确认内网地址没变、协议选对、规则处于启用状态。

第四层,公网地址。确认自己的公网地址是不是真的公网地址,方法前面说过。

这四层逐一确认,问题一定能在某一层被定位到。最怕的是一上来就换端口、重装服务端,把变量全改了反而没法排查。

5. 长期稳定运行:性能、备份与自动化

一次性的开服不难,难的是让它连续跑两周不出问题。这一章讲的是运维层面的东西,也是普通教程最容易略过的部分。

5.1 世界大小与内存的关系

世界大小对资源的影响远比想象中大。小世界的地图数据大概几十兆,中世界翻倍,大世界再翻倍,而服务端加载世界时会把地形数据读进内存,模组还会在这基础上再加载自己的内容。

世界大小原版内存占用加 10 个中型模组建议配置
小200MB 左右1GB 左右1 核 2G
中500MB 左右1.5GB 左右2 核 4G
大1GB 以上2.5GB 以上2 核 4G 起

这只是常驻内存,服务端在生成世界、保存世界的时候会有明显的峰值,所以配置要留出余量。我自己的经验是,只要条件允许就按表格的推荐值往上加一档,内存给足了,卡顿问题能少一半。

5.2 自动备份脚本与定时重启

服务端的自动保存不是万能的,硬盘写坏、进程被杀这些情况下,光靠游戏内置的备份机制不够。自己写个定时打包脚本,成本极低收益极高:

#!/usr/bin/env bash set -euo pipefail WORLD_DIR="/home/terraria/.local/share/Terraria/tModLoader/Worlds" BACKUP_DIR="/home/terraria/backups" KEEP_DAYS=7 STAMP=$(date +%Y%m%d-%H%M%S) mkdir -p "$BACKUP_DIR" tar -czf "$BACKUP_DIR/worlds-$STAMP.tar.gz" \ -C "$(dirname "$WORLD_DIR")" "$(basename "$WORLD_DIR")" find "$BACKUP_DIR" -name 'worlds-*.tar.gz' -mtime +$KEEP_DAYS -delete echo "[$(date)] backup done: worlds-$STAMP.tar.gz"

存成backup.sh,加执行权限,然后挂到 crontab 上每小时跑一次:

crontab -e # 添加这一行 0 * * * * /home/terraria/backup.sh >> /home/terraria/backup.log 2>&1

保留 7 天,覆盖了绝大多数误操作场景。注意备份前最好先让服务端保存一次,虽然直接打包世界文件通常也没事,但正在写入的文件打包出来可能是坏的,所以更稳妥的做法是备份脚本里先调用一次保存。

5.3 systemd 守护进程配置

用 screen 跑虽然方便,但机器重启后不会自动拉起,服务端崩溃了也不会自动恢复。用 systemd 托管就没这些问题:

[Unit] Description=tModLoader Dedicated Server After=network.target [Service] Type=simple User=terraria WorkingDirectory=/home/terraria/tmodloader ExecStart=/home/terraria/tmodloader/start-tModLoaderServer.sh -config /home/terraria/tmodloader/serverconfig.txt Restart=on-failure RestartSec=15 KillSignal=SIGINT StandardInput=tty-force TTYPath=/dev/tty20 TTYReset=yes TTYVHangup=yes [Install] WantedBy=multi-user.target

几个关键点:KillSignal=SIGINT很重

返回列表