尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

腾讯云Linux搭建Minecraft Forge模组服务器全攻略

腾讯云Linux搭建Minecraft Forge模组服务器全攻略 网上开服务器的人多但真正把“开服”这件事理清楚的教程不多。大部分教程要么只讲点击几个按钮要么上来就丢一堆代码让小白照抄中间的原理和坑完全不提。我自己用腾讯云搭 Minecraft Forge 服务端时踩过不少雷从镜像选择到 JVM 参数调优都折腾过一遍这篇就把完整过程写出来包括为什么这样做、命令是什么意思、报错怎么排查照着走基本能一次跑通。这篇内容面向想自己和朋友一起玩 Forge 模组服的玩家也适合刚接触 Linux 运维、想拿 Minecraft 当练手项目的开发者。涉及的服务器环境是腾讯云 CVM重装系统后的通用流程对轻量应用服务器同样适用服务端框架是 Forge 47.x对应 Minecraft 1.20.1Java 17这些都是目前兼容性最稳的组合。1. 方案选型为什么是腾讯云、Forge 和 Linux1.1 云服务器和家用机到底差在哪很多人第一反应是用自己电脑开服省一笔服务器钱。短期玩三五个人确实没问题但连续开机几天后CPU 温度、内存占用、家庭宽带的动态 IP 都会成为问题更不用说上传带宽通常只有几十 Mbps外网朋友一多延迟立刻飙升。用云服务器的核心优势是稳定和可控。腾讯云的 CVM 实例可以按需升级配置数据盘独立于系统盘重装系统不怕存档丢失安全组规则可以从端口层面直接挡住扫描流量。而且云厂商的机房带宽质量比家庭宽带上行稳定得多这对多人同时在线很关键。至于为什么选腾讯云而不是其他平台主要是个人习惯CVM 控制台的防火墙和安全组策略比较直观镜像市场里的纯净系统镜像多轻量应用服务器价格也友好。示例中用到的核心配置如下表仅作参考实际按预算和人数调整。项目示例配置说明实例规格4核 8G支持 8~12 人同时在线、约 80 个模组系统盘40G SSD系统 Minecraft 本体足够数据盘50G SSD存放世界存档、备份、日志带宽5Mbps 按流量轻量应用服务器选“流量包”更省心镜像Ubuntu 22.04 LTS干净、兼容性好、资料多1.2 Forge 比 Fabric 更省心的原因模组加载框架现在主流就是 Forge 和 Fabric 两套。Fabric 更轻量、更新快很多新版本模组优先适配它但如果你是奔着“经典整合包”去的比如科技、魔法、冒险类的大型模组包Forge 的生态明显更成熟兼容性也更好。Forge 的安装器本身就是个自解压程序一条命令就能生成服务端目录、启动脚本和依赖库不需要手动配置 classpath。这个设计对第一次开服的人很友好不容易把启动参数写错。它的 mods 目录也符合 Java 开发的直觉丢进去就加载删掉就卸载没有额外的初始化步骤。从长期维护角度看Forge 服务端的崩溃日志里会直接标注是哪个模组的哪个类报错定位问题比 Fabric 方便一些。社区里“某某整合包用的什么版本 Forge”这类问题答案基本都默认为 Forge资源密度决定了你遇到问题时更容易搜到解决方案。1.3 实例规格和带宽的具体选择思路选配置的核心指标是同时在线人数和模组数量。模组数量影响的是内存在线人数影响的是 CPU 和内存的双重压力。1~3 人模组少于 30 个2核 4G 够用但我会建议把-Xmx设为 3G留 1G 给系统。4~8 人模组 30~60 个4核 8G 是舒服线-Xmx设 5G~6G。8~15 人模组 80 个以上4核 16G 更稳或者直接上 8核16G。带宽上Minecraft 的协议并不算吃带宽但区块加载、玩家移动、箱子物品列表同步都会产生流量。5Mbps 带宽能应付 10 人左右的中小型服务器如果你打算开放公网给陌生玩家流量包模式会比固定带宽更划算。地域选择上离你和你的朋友最近的城市节点最好。腾讯云国内地域之间的延迟差异不大华南选广州、华北选北京华东选上海不用太纠结。2. 购买与登录准备从零开始拿到可操作的 Ubuntu 环境2.1 系统镜像选择的细节腾讯云购买实例时系统镜像默认可能是 CentOS 或者 Windows Server。我的建议是如果你不熟悉 Windows 服务器运维就选 Ubuntu 22.04 LTS。原因有几个Java 相关的依赖 apt 直接装最省事Forge 服务端开箱即用的run.sh在 Ubuntu 上没有任何路径问题社区里搜 “Ubuntu minecraft server” 资料也最多。如果你有 Windows 服务器运维基础用 Windows Server 也能跑但要注意一点不要在服务器上装完整版 Java for Windows 时勾选捆绑的“Ask Toolbar”之类的插件环境变量JAVA_HOME也必须手动配好这比 Linux 上多一步。确定 Ubuntu 22.04 LTS 后登录方式建议用密钥而不是密码。密钥登录比密码安全得多也能避免因为弱密码被爆破。腾讯云控制台在创建实例时可以直接生成密钥对下载的私钥文件要保存好丢了就只能重置密码。2.2 远程登录和文件上传CRT、WinSCP、scp 三件套我在实际操作中最顺手的方式是配一个 SecureCRT 会话用 SSH 私钥登录。配置过程比较复杂一把梭有问题的话推荐先在腾讯云控制台使用“OrcaTerm”网页终端确认系统状态再回到本地配置客户端。SecureCRT 配置密钥登录的关键步骤记住一个原则私钥格式要明确。腾讯云生成的私钥是.pem格式SecureCRT 需要把它转换成 OpenSSH 格式或者直接用 PuTTY 转换器转成.ppk。在会话的 Properties - Connection - SSH2 - Authentication 里选择 PublicKey并导入你的私钥文件。用户名是ubuntu腾讯云 Ubuntu 镜像的默认用户不是 root。如果你不喜欢 CRT用系统自带的 OpenSSH 客户端在终端里直接执行也可以chmod 400 my-key.pem ssh -i my-key.pem ubuntu你的公网IP文件上传是开服过程中几乎每天都在用的事。上传 mod、替换配置、下载存档备份我用 WinSCP 或scp命令的方式比较多。scp -i my-key.pem -r ./mods ubuntu你的公网IP:/home/ubuntu/minecraft/mods这条命令把本地的整个mods目录递归上传到服务器指定路径。-r参数不能少不用-r就只能传单个文件。2.3 安全组与防火墙端口规划Minecraft Java 版默认端口是25565/TCP局域网联机时一般是25565Forge 服务端默认也是这个。如果开了 Query 端口则额外需要25565/UDP但大多数场景只需要 TCP 就够了。腾讯云 CVM 的安全组规则要放行TCP:25565。轻量应用服务器则是在“防火墙”页面添加一条“端口 25565协议 TCP”的规则。两个平台的操作入口不一样但目标一致让外网能够访问到 Minecraft 的监听端口。除了 25565我强烈建议把 SSH 端口默认 22的访问来源限制到你自己的 IP 网段。安全组允许“来源 IP”配置填你的公网IP/32作为来源别人就扫不到你的 SSH 端口了。到了 Ubuntu 内部如果启用了 ufw 防火墙还要额外放行sudo ufw allow 25565/tcp sudo ufw allow 22/tcp sudo ufw enableufw enable前务必确认 22 端口已放行不然你会把自己锁在外面。轻量应用服务器如果已经在控制台开放了端口且系统镜像默认没启用 ufw可以跳过这一步。3. 安装 Java 与 Forge多数人在这里翻车3.1 JDK 版本别装错Java 17 还是 21Minecraft 1.20.1 对应的 Forge 47.x 官方要求 Java 17这是硬性版本要求。高版本的 Java 21 不是不能用部分模组会因为使用了旧字节码而报UnsupportedClassVersionError我建议直接安装 OpenJDK 17别折腾。sudo apt update sudo apt install openjdk-17-jdk-headless -y java -version最后一条命令必须看到类似openjdk version 17.0.x的输出。如果系统里之前装过别的 Java 版本可以用update-alternatives --config java切换默认版本。我再补充一个小经验如果你打算以后玩 1.21 之类的更新版本服务器的 JDK 版本可能要升到 21但同一个系统里可以共存多个 JDK。开服脚本里写清楚用哪个java二进制就行不用卸载旧的。3.2 Forge 安装器的运行原理和安装命令从 Forge 官网下载对应版本的 installer文件名大概是forge-1.20.1-47.3.0-installer.jar。很多人以为要双击运行其实在服务器上把它当成普通的 Java 程序执行即可。# 先建一个干净目录不然后面目录结构会很乱 mkdir -p ~/minecraft cd ~/minecraft # 上传 installer 后执行服务端安装 java -jar forge-1.20.1-47.3.0-installer.jar --installServer命令中的--installServer是关键参数。它告诉安装器只为服务端生成文件不弹出图形界面。执行完成后目录里会多出librariesForge 依赖的所有第三方库mods空的模组目录run.shLinux 启动脚本run.batWindows 启动脚本user_jvm_args.txtJVM 参数文件server.properties服务端配置文件安装器全程没有输出一大堆日志是正常的只要命令退出没有ERROR就算成功。如果下载依赖库时网络波动导致下载失败重跑一次--installServer即可它会跳过已完成的文件。3.3 首次启动、EULA 同意与目录文件说明第一次运行run.sh前要改一个文件这也是新手最常见的报错来源You need to agree to the EULA before running the server.Minecraft 服务端默认在eula.txt里写着eulafalse不改成true就会启动失败。改法cd ~/minecraft # 首次启动先运行一次让服务端生成 eula.txt 等文件 ./run.sh # 看到 EULA 报错后修改文件 sed -i s/eulafalse/eulatrue/ eula.txt然后再次./run.sh。首次启动要生成世界地图、加载 Forge 模组注册表通常需要几十秒到几分钟看到Done (X.XXXs)! For help, type help就代表服务端已经正常启动。第一次启动后最好在控制台输个stop正常关服。这样世界数据能安全落盘。直接kill进程虽然也能关但可能导致存档写入不完整。stop这个过程会生成world目录、logs目录、level.dat等文件。之后每次开服world目录就是你要备份的核心。4. 服务端配置与模组管理上线前的必要调整4.1 server.properties 的关键参数Minecraft 服务端几乎所有行为都集中在server.properties里。我用下来最需要改的就是下面几个不是所有参数都要动但改错一个就可能导致连接失败或体验极差。参数推荐值说明server-port25565默认不用动除非你想跑多个实例motd自定义一句话“欢迎来到 xxx 服务器”这类online-modetrue正版服必须 true离线服设 false 但风险自负max-players10根据实例规格调整别大于实际承受能力view-distance8~10越大越吃 CPU8 是平衡点difficultynormal当然也可以 hard看你想怎么玩white-listtrue强烈建议开防止陌生人进服破坏spawn-protection0否则出生点附近无法破坏方块很烦pvptrue按你的服务器规则来level-seed留空有想用种子地图再填如果你之前玩过单机对difficulty、pvp肯定不陌生。这里特别注意online-modetrue时所有玩家账号必须是正版账号如果开的是离线服online-modefalse建议配合白名单使用。# 开启白名单 sed -i s/white-listfalse/white-listtrue/ server.properties之后在游戏控制台输入whitelist add 玩家ID即可添加白名单。添加后立刻生效玩家不用重启游戏这里我实测过很多次确认是即时生效的。4.2 上传和安装模组Forge 模组上传到服务器的mods目录启动时就会加载。但这里有一个最容易忽略的原则客户端和服务端的 mod 必须一致服务端还要额外兼容服务端专用 mod如性能优化类。如果只往服务器丢 mod玩家端没装进服时会被提示缺少某些物品或方块。模组版本冲突是另一个问题。服务端日志里常见的DuplicateModsFoundException就是模组重复或版本不一致导致的。我的排查习惯是# 查看启动日志末尾是否有异常 tail -n 50 logs/latest.log日志里会明确列出哪些模组版本冲突。上传方式我是这样做的先把整合包在本地单人模式跑一遍确认不崩溃再把mods目录用前面提到的scp或者 WinSCP 整体传到服务器覆盖。4.3 开服后的首次联机测试服务器启动且玩家准备就绪后客户端多人游戏地址填你的服务器公网IP:25565例如119.3.x.x:25565端口不是默认时就要显式写。如果填了端口却连不上大概率是安全组或防火墙没放行而不是服务端配置问题。这里有个小技巧先在服务器本机用curl或nc测试端口监听状态。ss -tlnp | grep 25565看到LISTEN状态说明 Minecraft 进程已经绑定端口。如果没有任何输出说明服务端可能还在加载或者启动失败先去logs/latest.log看报错。5. JVM 参数与内存优化让服务器更流畅的关键5.1 为什么默认参数不够用Forge 的run.sh默认 JVM 参数比较保守没有针对 Minecraft 的服务器模型优化。Minecraft 服务端有大量对象创建和持续 GC 压力默认参数下经常出现周期性卡顿表现就是玩家走到新区块时顿一下或者多人同屏时 TPS 掉到十几。TikTok 的 Aikar 团队曾经发布过一版针对 Minecraft 服务端的 JVM Flags社区简称 Aikars Flags。它调整了 G1GC 的新生代比例、GC 暂停时间目标、提前触发内存 Touch 等参数实测能让区块加载和实体运算的卡顿明显减少。这个参数组合对 Forge 同样适用。5.2 实操修改 user_jvm_args.txtForge 推荐把 JVM 参数写在用户级user_jvm_args.txt里run.sh会自动读取不需要改启动脚本本身。文件里一行一个参数举个例子4核8G 实例分配 5G 给 Minecraft-Xms5G -Xmx5G -XX:UseG1GC -XX:ParallelRefProcEnabled -XX:MaxGCPauseMillis200 -XX:UnlockExperimentalVMOptions -XX:DisableExplicitGC -XX:AlwaysPreTouch -XX:G1NewSizePercent30 -XX:G1MaxNewSizePercent40 -XX:G1HeapRegionSize8M -XX:G1ReservePercent20 -XX:G1HeapWastePercent5 -XX:G1MixedGCCountTarget4 -XX:InitiatingHeapOccupancyPercent15 -XX:G1MixedGCLiveThresholdPercent90 -XX:G1RSetUpdatingPauseTimePercent5 -XX:SurvivorRatio32 -XX:MaxTenuringThreshold1 -XX:PerfDisableSharedMem几个关键参数的解释-Xms和-Xmx必须一致避免 JVM 动态伸缩堆大小带来的额外开销。建议设定为服务器可用内存的 60%~70%比如 8G 机器给 5G。-XX:AlwaysPreTouch会在启动时把内存全部映射到物理内存启动变慢但运行期更稳定实测值得。-XX:MaxGCPauseMillis200不能让 GC 一定低于 200ms但为 G1 提供了明确的优化目标。-XX:UnlockExperimentalVMOptions在 JDK 17 里某些 G1 参数仍标记为实验性需要这个开关否则直接退出启动也会报错。改完参数建议重启一次服务端。观察项有两个启动时内存是否平滑上升到设定值玩家集中活动时 TPS 是否长期保持在 20/tps命令可查。如果 TPS 跌到 10 以下说明配置确实不够或某个模组吃性能。5.3 后台运行screen、nohup 与 systemd直接./run.sh运行的话SSH 断开服务端就停了。最简单的办法是用screen让服务端在后台独立会话运行sudo apt install screen -y screen -S minecraft cd ~/minecraft ./run.sh # 退出当前 screen 会话按 CtrlA 然后按 D之后想回到控制台执行screen -r minecraft在 screen 会话里可以直接输入服务端命令比如list查看在线玩家、save-all手动存档。如果希望更工程化一点用 systemd 服务托管的体验更好。写一个服务文件[Unit] DescriptionMinecraft Forge Server Afternetwork.target [Service] Userubuntu WorkingDirectory/home/ubuntu/minecraft ExecStart/home/ubuntu/minecraft/run.sh Restarton-failure [Install] WantedBymulti-user.target然后sudo systemctl daemon-reload sudo systemctl enable minecraft sudo systemctl start minecraft好处是开机自启、崩溃自动重启、日志统一走journalctl -u minecraft查看。缺点是想输入服务端命令时系统 API 没有直接支持需要辅助工具。对多数小服来说screen 足够不必上 systemd。5.4 定时备份与存档管理Minecraft 最怕的就是存档损坏。我吃过大亏一次服务器断电world目录里的区块数据写了一半整个世界回滚到几小时前。从那以后我养成了一个习惯每天凌晨自动打包备份。sudo apt install cron -y crontab -e # 添加一行每天凌晨 3 点执行备份 0 3 * * * tar -czf /home/ubuntu/backups/world-$(date \%F-\%H\%M).tar.gz -C /home/ubuntu/minecraft world定期检查备份目录大小及时清理旧备份find /home/ubuntu/backups -name *.tar.gz -mtime 7 -delete这条命令删除 7 天前的备份文件。如果空间不紧张保留 14 天更稳妥。手动恢复时把压缩包解压回world目录前一定要先停服否则文件写冲突容易造成二次损坏。6. 常见问题排查端口、内存、模组冲突记录6.1 客户端连不上服务器这是一个经典问题的排查顺序我建议按下面表格逐项检查别一上来就怀疑服务器配置错了。现象可能原因排查命令/操作连接超时安全组未放行 25565腾讯云控制台安全组入站规则检查连接被拒绝防火墙拦截 / 服务端未启动ss -tlnp | grep 25565一直正在登录online-mode 不一致确认客户端正版登录状态与服务端设置匹配进入后立刻掉线登录服务器超时正版验证正版用户在客户端检查账户状态连接后提示版本不匹配客户端 Forge 版本和服务器不一致客户端和服务端使用相同 Forge 版本本机telnet 你的公网IP 25565是最直接的测试方式但很多系统默认没装 telnet用nc -zv 你的公网IP 25565也行。能通就说明网络链路是通的问题在应用层。6.2 内存使用率持续攀升怎么办Forge 服务器加载大量模组后内存占用本身就会比原版高。如果发现内存稳定上涨最后 OOM 被系统杀掉日志里出现Killed字样最直接的原因要么是-Xmx给得太低要么是某个模组存在内存泄漏。先用 Spark 或观察 GC 日志定位我常用spark这个性能分析模组/spark profiler --timeout 30 /spark heap dumpspark heap dump会生成一个 hprof 文件用 VisualVM 打开可以看到对象占用。这个操作对很多人可能有点重更快的办法是逐个排除mods 目录里一半一半地移动模组重启看内存二分法能很快定位到罪魁祸首。不过大部分情况下单纯是-Xmx设置得太贪心。比如 4G 内存的机器设了-Xmx3.5G系统本身还要吃掉 1G 左右跑去 Swap 之后整个服务器就得卡成幻灯片。给系统至少留 20% 内存是我个人的硬性要求。6.3 服务端启动失败日志看不懂怎么办常见启动失败分为三类JDK 版本错误日志提示UnsupportedClassVersionError确认java -version是 17。模组冲突日志直接列出Modxxxhas been detected as duplicate或Missing dependencies。按提示找到对应模组调整版本即可。端口被占用日志提示BindException: Address already in use。检查有没有重复实例在跑ps aux | grep java把旧的 kill 掉再启动。日志文件路径是logs/latest.log每次启动会覆盖。logs/下还有带时间的旧日志排查历史问题用它们。6.4 TPS 低和区块卡顿的排查思路TPSTicks Per Second满值是 20。如果长时间低于 15玩家会有明显卡顿感。排查优先级看spark profiler结果哪个线程占用 CPU 高。把view-distance降低 2~3 档CPU 负载会立刻下降。检查是否有大型红石机器、大量掉落物实体、村民聚集点在持续计算。考虑安装性能优化模组如FerriteCore、MemoryLeakFix、Canary需确认与你的 Forge 版本兼容。FerriteCore 对内存占用优化明显实测在高模组数量下能减少几百 MB 内存Canary 在 Forge 端的替代方案要看版本支持情况。注意这些本身就是模组要服务端和客户端同时装才能完全生效部分服务端专用的话玩家端可以不用装。一些我最后想说的话从“买服务器”到“朋友能进来玩”整个过程里最让我印象深刻的不是哪条命令多高明而是日志文件里那些明明写了答案、却因为没人解释而卡半天的细节。比如eula.txt那个坑再比如用户ubuntu用 sudo 时需要输入密码却在脚本里被忽略。这些都属于知道一遍就再也不会犯、不知道就相当折磨的小问题。这篇文章把我踩过的这些坑和验证过的解法都摆出来了你照着走一遍应该能比当年的我省下至少一个晚上的折腾。更进一步的话你还可以在备份策略基础上接入对象存储 COS把本地备份自动同步上云防止服务器磁盘故障导致存档全没也可以做一主一备的定时重建方案把world目录定期复制到另一台机器。这些后续扩展都不难但前提是先有一个跑得稳的 Forge 服。如果你按这套流程把服务器跑起来了中途有哪个环节和文章写的不一样多半是系统版本或 Forge 版本差异导致的细节变化优先看日志它永远会告诉你真相。
返回列表