Terraria 开服这事说穿了就是把一个服务端程序跑起来然后让别人连进来。但我见过太多人卡在程序明明跑起来了朋友就是连不上这一步折腾一晚上最后放弃回去开单机。其实这里面的坑不复杂无非是版本对不对得上、端口有没有放开、模组是不是两边一致、存档路径写没写对这几件事。这篇就把Terraria和tModLoader两套服务端的完整搭建流程、配置参数、模组同步、联机连通和长期运维一次性说清楚不管你是第一次开服的萌新还是想把自己那台旧笔记本改造成长期在线的朋友服务器都能照着抄。我自己前前后后开过七八次服从最开始的 Windows 本机双击 exe到后来在云主机上用 systemd 长期挂着跑 tModLoader中间踩的坑足够写一本小册子。下面按想清楚 → 装原版 → 装模组版 → 让人连进来 → 长期稳定跑 → 出问题怎么查这个顺序讲每一步都给出可以直接复制的配置和命令。1. 开服之前先把三个问题回答清楚很多人一上来就问服务端在哪下其实下载是最简单的一步真正决定你后面顺不顺的是开服前的三个决策开原版还是开模组版、主机放在哪、版本怎么对齐。这三件事想错了后面全是返工。1.1 原版服务端和 tModLoader 服务端不是一回事这两个东西名字只差几个字母实际是两个完全独立的程序互相不兼容。原版服务端只能跑原版客户端用的是 Terraria 官方发布的TerrariaServer.exeWindows或者对应的 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_64Linux 版服务端还需要对应的运行库老版本依赖 mono新版本已经改成自带的 .NET 运行时具体以你下载页的说明为准。跑起来之前先用ldd看一眼依赖有没有缺ldd /opt/terraria/TerrariaServer.bin.x86_64 | grep not found有输出就说明缺库缺什么装什么这一步不解决后面启动会直接报错退出。2.2 serverconfig.txt 逐项拆解这个文件是开服的核心每一行都影响服务端的实际行为。新手最容易犯的错是直接拿默认文件跑结果世界建在默认路径、密码为空、端口被别的程序占了。下面这份是我自己长期用的配置模板逐项解释# 已有世界的路径第一次开服可以留空用 autocreate 生成 worldD:\TerrariaServer\Worlds\MyWorld.wld # 世界的名字会显示在存档列表里 worldnameMyWorld # 存档目录 worldpathD:\TerrariaServer\Worlds\ # 没有 world 时自动生成世界1小 2中 3大 autocreate2 # 随机种子留空就随机 seed # 难度 0经典 1专家 2大师 3旅行 difficulty1 # 最大玩家数 maxplayers8 # 监听端口 port7777 # 进服密码留空表示不需要 password # 进服时显示的欢迎语 motd欢迎请勿破坏他人建筑 # 保留的世界备份份数 worldrollbackstokeep3 # 游戏内语言 languagezh-Hans # 自动端口映射路由器支持 UPnP 时有效 upnp1 # NPC 同步频率默认 60带宽紧张时可以调低 npcstream60 # 进程优先级1 表示高优先级 priority1 # 只允许官方客户端连接 secure1几个参数值得单独说。difficulty决定了整个档的走向专家和大师难度下怪物血量和伤害是翻倍的服务端一旦创建就不能改所以开服前一定要和朋友商量好。worldrollbackstokeep是很多人忽略的救命参数它会让服务端在每次自动保存时留几份历史存档万一世界文件被写坏还能回退到十几分钟前的状态。upnp1在路由器支持的情况下会自动帮你做端口映射但实际成功率大概只有一半很多路由器默认关闭了 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.batWindows或start-tModLoaderServer.shLinux这份就是完整的服务端。第二种是通过 steamcmd 在 Linux 云主机上拉取这种方式适合没有图形界面的服务器steamcmd force_install_dir /home/terraria/tmodloader \ login anonymous \ app_update 1281930 validate quit1281930是 tModLoader 的应用编号Linux 上匿名登录就能下载。下载完之后进入目录给脚本加执行权限。第一次运行脚本时会提示你输入 Steam 凭据这一步是为了让服务器能够以 Steam 账号身份进行联机验证按提示操作即可。版本对应关系必须卡死tModLoader 有多个分支版本分别对应 Terraria 的不同大版本。你的客户端是哪个分支服务端就必须是哪个分支不能混。客户端和服务端的模组列表也要完全一致细节下一节展开。3.2 服务端启动参数与目录结构tModLoader 服务端的配置文件和原版几乎一样但多了几个专属参数world/home/terraria/tmodloader/Worlds/TMLWorld.wld worldpath/home/terraria/tmodloader/Worlds/ worldnameTMLWorld autocreate2 difficulty1 maxplayers8 port7777 passwordyourpassword motd模组服进服前确认模组列表 worldrollbackstokeep3 upnp1 npcstream60 languagezh-Hans启动命令在配置文件之外还能追加参数常用的是这几个./start-tModLoaderServer.sh -config serverconfig.txt其中-config指定配置文件路径-modpath指定模组目录-tmlsavedirectory指定 tModLoader 的数据目录存档、配置、模组都在这个目录下。数据目录默认在用户主目录的Documents/My Games/Terraria/tModLoader下Linux 服务器上一般是~/.local/share/Terraria/tModLoader。如果你想把这些数据统一放到服务端目录里用-tmlsavedirectory指过去备份的时候更清爽。第一次启动会比较慢因为服务端要初始化模组框架、生成资源缓存。如果控制台停在某一行很久不动不用急着 CtrlC给它三五分钟。真正卡死的情况是提示了错误信息那才需要处理。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 nameTerraria 7777 dirin actionallow protocolTCP localport7777Linux 上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不确定就选 TCPUDP第三步查你的公网地址。在搜索引擎里搜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是个偷懒但有效的做法CtrlA然后按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_DAYS7 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 21保留 7 天覆盖了绝大多数误操作场景。注意备份前最好先让服务端保存一次虽然直接打包世界文件通常也没事但正在写入的文件打包出来可能是坏的所以更稳妥的做法是备份脚本里先调用一次保存。5.3 systemd 守护进程配置用 screen 跑虽然方便但机器重启后不会自动拉起服务端崩溃了也不会自动恢复。用 systemd 托管就没这些问题[Unit] DescriptiontModLoader Dedicated Server Afternetwork.target [Service] Typesimple Userterraria WorkingDirectory/home/terraria/tmodloader ExecStart/home/terraria/tmodloader/start-tModLoaderServer.sh -config /home/terraria/tmodloader/serverconfig.txt Restarton-failure RestartSec15 KillSignalSIGINT StandardInputtty-force TTYPath/dev/tty20 TTYResetyes TTYVHangupyes [Install] WantedBymulti-user.target几个关键点KillSignalSIGINT很重