我的世界Paper服务器搭建实战:从云主机选型到调优备份
《我的世界》服务器搭建听起来像是老玩家才玩得转的黑科技但拆开看不过是选一台合适的机器、装好Java、挑一个服务端、配好参数再守好备份和安全这几道底线。这篇指南是我这几年从零搭过好几种生存服的完整复盘从云服务器选型到日常排错都会写到适合想给朋友开一个长期Java版服务器、又不想被各种教程绕晕的人看完可以直接照着操作。1. 开服前的关键决策主机形态、人数与内容方向很多新手开服第一步就错了不是卡在技术上而是压根没想清楚要开一个什么样的服。是先买服务器还是先选服务端是用面板服还是自己折腾云主机是开原版生存还是插件服这些问题如果不提前定下来后面全是返工。1.1 云服务器、家用主机、面板服怎么选我见过几种典型方案直接说结论想认真稳定地长期开服首选云服务器只想局域网几个人玩用自己电脑就行完全不想碰Linux、预算又宽裕才建议面板服。部署形态优点缺点适合场景云服务器有固定公网IP、带宽可控、7x24小时在线每月有成本、系统运维要自己学正式长期服、社区服家用主机硬件免费、配置随意、局域网延迟极低需要公网IP、停电断网就翻车熟人小服、试验服面板服网页点点就能开、不用懂系统性能背书不透明、调优余地小、长期偏贵不想折腾且预算充足家用主机方案有一个很现实的问题就算你有公网IP光猫和路由器里的端口映射也够折腾一阵。而且家里宽带的上行带宽通常不大七八个玩家同时在线上传流量很容易把整条宽带拖垮家人看视频都会卡。云服务器没有这些破事。它在机房里有固定公网IP安全组、防火墙都是可控的半夜没人拔你网线。成本方面一台能带10人左右开Paper服的4核8G云主机一个月几十块到一百多块平摊下来比去奶茶店点一杯都便宜。面板服反而是我不太推荐的。它把开服门槛压得很低但云厂商通常把JVM参数、核心配置、插件目录都限制死了。你后续想换Paper、调GC参数、装Chunky预生成地图全都受制于面板功能。等玩熟了再迁云服务器迁移存档又是一顿折腾不如前面这一段路自己走。1.2 内存、CPU与带宽的真实需求估算MC服务器的需求跟同时在线人数强相关但也跟玩法强相关。纯原版生存和装了几十个插件的空岛服对硬件的要求完全不是一个量级。我给大家一个比较务实的参考5人以下、原版或轻量插件2核4G够跑但建议直接4G内存因为世界生成和区块加载最吃内存5~20人、Paper基础插件4核8G是舒服的起点预算够可以上16G20人以上、含模组或大型小游戏建议8核16G起步磁盘一定要SSD机械盘在多人加载区块时会明显拖后腿。这里有个反直觉的点MC服务器的性能瓶颈往往不在CPU核心数而在单核性能和内存延迟。因为游戏的主逻辑Tick是在单线程里跑的主世界实体运算、红石更新、区块调度都挤在那一个线程里。你买8核16线程对MC来说最多也就是“系统层面更宽松”真正跑存档的还是那一两个核心。所以选云服务器时与其买一堆低频核心不如找一款CPU主频更高的机型这个策略在Paper服上尤其明显。带宽不用太焦虑。MC的数据包不像视频流那么夸张一个玩家每分钟通常只有几十KB级别的流量。5Mbps公网带宽带10~20人问题不大但如果超过20人且频繁加载区块建议升到10Mbps同时注意厂商带宽是下行还是双向。2. 干净Ubuntu上的环境搭建Java安装与账号隔离热词里很多人搜“ubuntu2204安装教程详细服务器”说明大家都卡在系统部署这一步。我对新手只有一个建议系统装好、SSH能连上之后先执行一次系统更新把时区设对然后立刻开始装Java不要在桌面环境里浪费内存。2.1 为什么我推荐Linux而不是WindowsWindows当然能开服装个JDK双击启动就完事。但你想让服务器一年到头稳定在线Linux的优势就出来了系统本身占用的内存只有几百MB桌面环境删掉后更干净可以用systemd管理进程崩了自动拉起打安全补丁、查日志都比Windows流畅。如果你对Linux完全陌生我也理解那种恐惧感。但实际上你需要的命令不超过十几条cd、mkdir、curl、tar、systemctl、journalctl。这篇文章里所有命令我都会直接给出来你不用懂原理也能先把服务器跑起来再用过程中慢慢理解。2.2 Java 21从哪来Temurin安装与版本验证新版Minecraft服务端1.20.5及以上要求Java 21老教程里让你装Java 8或者Java 17的都是过时信息。装错了启动时会直接报错最常见的提示是UnsupportedClassVersionError翻译过来就是“Java版本不支持当前class文件”。我建议装Eclipse Temurin JDK 21也就是Adoptium社区维护的OpenJDK发行版。这是目前大多数MC服务端作者测试用的环境性能表现稳定。为什么不用系统源里的OpenJDK倒不是不能用而是版本可能偏旧而且Ubuntu默认源里的Java包更新比较慢用Adoptium官方仓库可以保证及时拿到新版本。在Ubuntu 22.04上按下面步骤操作sudo apt update sudo apt -y upgrade sudo apt install -y curl wget apt-transport-https gnupg curl -fsSL https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/adoptium.gpg echo deb https://packages.adoptium.net/artifactory/deb jammy main | sudo tee /etc/apt/sources.list.d/adoptium.list sudo apt update sudo apt install -y temurin-21-jdk安装完成后验证版本java -version如果输出里出现Temurin和21这样的字样环境就通了。顺便提一句如果你开的是1.8.9这种老版本生存服服务端可能只兼容Java 8或Java 11。碰到这种情况别急着一键升级Java先查清楚目标版本对应哪个Java否则新版服务端和旧版服务端会打架。2.3 用专用账号跑服务而不是root我把这条放在环境准备阶段是因为它真的能救命。很多人图省事下载完服务端直接root运行结果某次插件漏洞被人利用整个服务器就被拿下。让Minecraft进程跑在一个独立系统账号下权限被限制在指定目录里风险会小很多。创建专用用户并准备目录sudo mkdir -p /opt/minecraft/server sudo useradd -r -m -d /opt/minecraft minecraft sudo chown -R minecraft:minecraft /opt/minecraft这里把用户目录直接指向/opt/minecraft以后所有服务端文件都放这里面权限清晰备份也方便。后面启动服务端时一律用sudo -u minecraft去执行不要直接切到root操作。另外长期运行的Java进程会遇到一个隐蔽问题文件描述符不够用导致大量文件无法打开日志里出现Too many open files。可以在/etc/security/limits.conf里给minecraft用户单独提高上限minecraft soft nofile 65536 minecraft hard nofile 65536如果是用systemd管理服务直接在service文件里写LimitNOFILE65536更干净下一章讲守护进程时我会把这个也带上。3. 服务端选择与首次启动原版、Paper与Fabric怎么选选服务端是我觉得最有意思的一步因为这一步直接决定了你服能装什么插件、性能天花板在哪。很多新手上来就下载官方原版服务端跑起来也不算错但很快就发现一到晚上加载区块就卡想要的功能都得靠插件这时候再迁移到Paper就麻烦了。3.1 服务端横向对比与选型建议先看一张表这是我在不同阶段用过之后的主观总结服务端适合场景插件/模组支持性能表现备注Vanilla纯原版、朋友局域网联机不支持一般官方出品功能最原始Spigot老服、历史插件依赖Bukkit插件中等Paper的前身新服不推荐Paper插件生存服、小游戏服Bukkit/Spigot/Paper插件好社区主流性能优化明显Fabric轻量模组服Fabric模组好模组启动轻快生态活跃Forge大型模组包Forge模组一般很多经典老模组只支持Forge我的选型逻辑很朴素如果只想开一个高版本插件生存服无脑Paper如果想玩大量模组先查模组支持Fabric还是Forge再倒推服务端如果是自己一个人单机测试原版服务端也无妨但别指望它扛住多人在线压力。Paper能在原版基础上做大量优化包括更聪明的区块调度、更合理的实体激活范围、异步分析工具这些都是Spigot时代不敢想的。而且Paper完全兼容绝大多数Bukkit插件生态根本不用愁。3.2 下载Paper并完成首次启动的完整流程Paper的下载不像原版那样给一个死链接它有一个构建API。这里我直接给一套可以复现的命令用jq从JSON里自动提取最新构建号省得你每次去网页找。先安装jqsudo apt install -y jq然后执行MC_VERSION1.21 LATEST_BUILD$(curl -s https://api.papermc.io/v2/projects/paper/versions/${MC_VERSION}/builds | jq .builds[-1].build) LATEST_NAME$(curl -s https://api.papermc.io/v2/projects/paper/versions/${MC_VERSION}/builds | jq -r .builds[-1].downloads.application.name) cd /opt/minecraft/server sudo -u minecraft curl -o paper.jar https://api.papermc.io/v2/projects/paper/versions/${MC_VERSION}/builds/${LATEST_BUILD}/downloads/${LATEST_NAME}第一次启动直接运行cd /opt/minecraft/server sudo -u minecraft java -Xms4G -Xmx4G -jar paper.jar nogui如果机器只有4G内存把-Xms4G和-Xmx4G改成-Xms2G -Xmx2G再试。第一次启动会创建一堆目录和配置文件然后把EULA协议弹出来要求你同意。在eula.txt里写入echo eulatrue /opt/minecraft/server/eula.txt然后再次启动。这次它会正常加载生成world文件夹、server.properties等文件。看到“Done (xx.xxxs)! For help, type help”这行输出说明服务端已经跑起来了。这里有个新手常犯的错启动后窗口卡住了以为服务器没反应直接把终端关掉然后进程就没了。我建议这一阶段不要用前台启动做正式运行下一章我会专门讲怎么做守护和自启。4. server.properties与JVM参数服务器性能的关键服务端能跑起来只是万里长征第一步。真正决定玩家体验的是配置调优这也是大多数教程语焉不详的地方。这一章我挑最重要的讲不堆一堆用不上的冷门选项。4.1 server.properties里容易被忽略的几项server.properties是整个服务端的核心配置文件每一行都是一个开关。下面这些是开服时必须从头过一遍的server-port25565端口默认就行但如果你的云服务器同时跑多个服想清楚要不要改online-modetrue正版验证必须开除非你想让所有破解端都能混进来max-players20不是设得越高越好它会影响服务器分配实体和区块的预期view-distance8视距建议6~8超过10对CPU和内存的消耗会指数上升simulation-distance6这个选项很多人忽略它决定距离玩家多远的区块还会被模拟红石、实体、生长调低能显著减少CPU负担white-listtrue配合白名单使用后面安全部分细说spawn-protection0生存服建议直接设0不然出生点附近有建筑时保护半径内没法破坏方块很尴尬motd服务器列表里显示的那行字支持颜色代码花几秒钟写个有意思的标语玩家第一印象会好很多。如果你之前听说了哪些“神种子”直接在level-seed后面填数字就行。种子对所有玩家都是一致的你也可以用一个自己验证过的生存种子开荒。4.2 内存不是越大越好Aikars Flags与GC调优这是整篇里我最想让你认真看的部分。很多人的直觉是“服务器卡加内存啊”但Java应用根本不是这么回事。MC服务端跑在JVM上JVM有一个垃圾回收机制当内存堆快满的时候会暂停整个应用去清理无用对象这个暂停就是玩家体验到的“卡顿瞬间”。内存给得越多堆积的垃圾越多单次暂停时间反而可能越长。所以正确的做法是给服务端分配合理的内存同时调好垃圾回收参数。MC社区里有一份经过大量开服者验证的JVM参数叫Aikars Flags我每次开Paper服都会用效果很稳。这是我在4G内存小服上的完整启动命令sudo -u minecraft java -Xms4G -Xmx4G -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:PerfDisableSharedMem -XX:MaxTenuringThreshold1 -Dusing.aikars.flagshttps://mcflags.work -jar paper.jar nogui如果你记不住这么多参数至少把这几行抄下来-XX:UseG1GC、-XX:MaxGCPauseMillis200、-XX:ParallelRefProcEnabled、-XX:DisableExplicitGC、-XX:AlwaysPreTouch。这几个是影响最大的核心项。AlwaysPreTouch这个参数值得单独说一句它会在启动时把内存一次性交给JVM并完成物理内存分配代价是启动变慢几十秒好处是运行期间内存分配更均匀不会频繁向操作系统要内存。分配内存的原则是物理内存总量里留给系统20%~30%剩下的再给MC。例如8G内存的云主机服务端设5~6G比较舒服16G内存可以设10~12G。千万不要把-Xms和-Xmx设成不一样最好固定相同值避免运行中动态扩缩容造成额外停顿。4.3 预生成地图让探索不再成为卡顿源头原版世界里玩家走到哪区块才会实时生成到哪。生成区块是非常消耗CPU的操作尤其是同时有三四个人朝不同方向探索时服务器主线程会明显吃力这就是很多服“人一多走两步就开始卡”的真相。解决办法是提前把地图区块生成好玩家探索时直接读取不现场算。我用的是Chunky插件它专门干这件事。把Chunky放进plugins文件夹后在游戏里执行/chunky radius 5000 /chunky start这会在以出生点为中心5000格半径内预生成区块。你可以先设小点比如2000观察一下服务器TPS和磁盘占用再考虑要不要扩大。预生成是很吃CPU的建议在玩家少的时间段跑也可以把服务器暂停命令和预生成配合起来。我是这样安排的新服开服前先跑一轮5000半径预生成跑完再对外开放。这一步看着耗时但能换来之后几周甚至几个月的安稳运行绝对值。5. 守护进程、备份与安全基线跑一年不翻车搭建服务器就像养鱼真正费心的是日常维护。一个没有守护、备份和安全策略的服务器随时可能因为崩溃、误操作或攻击而全盘皆输。这一章讲的是长期运行的底线。5.1 用systemd让服务器崩溃后自动拉起很多人习惯用screen或tmux挂着Java进程方便在前台看控制台日志。但screen有个致命问题服务器崩溃了没人知道也不会自动重启。我后来改用systemd托管崩溃后自动拉起、开机自启、日志统一管理体验好太多。在/etc/systemd/system/minecraft.service里写入[Unit] DescriptionMinecraft Paper Server Afternetwork.target [Service] Userminecraft Groupminecraft WorkingDirectory/opt/minecraft/server ExecStart/usr/bin/java -Xms4G -Xmx4G -XX:UseG1GC -XX:ParallelRefProcEnabled -XX:MaxGCPauseMillis200 -XX:DisableExplicitGC -XX:AlwaysPreTouch -jar paper.jar nogui Restarton-failure RestartSec15 LimitNOFILE65536 [Install] WantedBymulti-user.target然后执行sudo systemctl daemon-reload sudo systemctl enable --now minecraft以后用systemctl status minecraft看状态用journalctl -u minecraft -f看实时日志比screen方便十倍。用systemd之后获取服务器控制台的方式变了。你可以给server.properties加RCON这是官方自带的远程控制协议enable-rcontrue rcon.port25575 rcon.password你的强密码注意RCON端口绝对不能暴露到公网只在服务器本机访问。安装一个mcrcon客户端git clone https://github.com/Tiiffi/mcrcon.git cd mcrcon make sudo install -m 755 mcrcon /usr/local/bin/然后发送命令mcrcon -H 127.0.0.1 -p 你的强密码 save-allRCON密码不要用弱密码也不要在配置文件里出现明文时就随便丢给别人。5.2 备份策略正经的备份要能随时回滚这个观点我说过很多次没有验证过恢复流程的备份不算备份。你辛辛苦苦tar了一份存档结果哪天要恢复时发现少打包了world_nether或者压缩包损坏那这份备份就是废的。我现在的备份方案分两层。第一层是每天凌晨用RCON让存档落盘然后打包三个世界文件夹world、world_nether、world_the_end。第二层是每周一次停机维护时做完整冷备份。写一个备份脚本存到/usr/local/bin/backup-mc.sh#!/bin/bash BACKUP_DIR/opt/minecraft/backups TIMESTAMP$(date %Y%m%d-%H%M%S) KEEP_DAYS7 mkdir -p $BACKUP_DIR mcrcon -H 127.0.0.1 -p 你的强密码 save-off mcrcon -H 127.0.0.1 -p 你的强密码 save-all sleep 5 tar -czf $BACKUP_DIR/mc-$TIMESTAMP.tar.gz -C /opt/minecraft server/world server/world_nether server/world_the_end mcrcon -H 127.0.0.1 -p 你的强密码 save-on find $BACKUP_DIR -name mc-*.tar.gz -mtime $KEEP_DAYS -delete加上执行权限然后用crontab设置每天凌晨执行chmod x /usr/local/bin/backup-mc.sh sudo crontab -e加入一行30 4 * * * /usr/local/bin/backup-mc.sh /var/log/mc-backup.log 21这套流程里save-off和save-on是关键。save-off暂停自动保存save-all强制把所有待写入数据落盘等几秒让文件系统稳定后再打包最后save-on恢复自动保存。这样可以在不打断玩家的情况下尽量保证存档一致性。5.3 防火墙、白名单与正版验证安全没有银弹但有几个基本动作能挡掉绝大多数麻烦。首先是防火墙。Ubuntu上用ufw先默认禁止入站再放行必要端口sudo ufw default deny incoming sudo ufw allow 22/tcp sudo ufw allow 25565/tcp sudo ufw enable这里只放行了SSH和游戏端口。不要因为要用RCON就把25575暴露到公网RCON只需要本机访问就够了。然后确认online-modetrue已经开启。正版验证意味着只有拥有正版账号的玩家才能进服这能直接过滤掉一大串恶意机器人。很多人开朋友服时怕朋友没正版就关了online-mode但那样也会把服务器暴露在所有离线伪造玩家面前风险很大。如果朋友都是正版一定要开。最后打开白名单white-listtrue然后在游戏控制台里添加玩家whitelist add 玩家名白名单配合正版验证基本就是MC服务器最有效的两道门禁了。最后还有一条容易被忽略的OP权限不要乱给。OP就是服务器里的超级管理员给多了等于把服务器钥匙交出去。我的习惯是先白名单进服熟悉一段时间后再考虑给OP而且OP数量能少一个就少一个。6. 联机失败和服务器卡顿的排查链路跑到这一步你的服务器应该能稳定运行了。但运维工作里有一大半时间是在处理“玩家连不上”和“服务器突然卡了”这两类问题。这一章我写一下自己的排查顺序这些问题大概率你们也会遇到。6.1 “玩家连不上”的排查顺序先说现象玩家输入IP后出现“连接超时”、“connection refused”或者卡在“登录中”。我建议你按下面这个顺序查不要一上来就重装服务端。第一步确认服务端进程还活着systemctl status minecraft如果进程死了看日志定位原因journalctl -u minecraft -n 100 --no-pager第二步确认端口在监听sudo ss -tlnp | grep 25565如果没有任何输出说明Java进程没有绑定到这个端口服务端可能没启动成功。第三步本地尝试连接nc -vz 127.0.0.1 25565能连上说明服务端正常问题出在外网链路。连不上则大概率是服务端配置或Java版本问题。第四步检查云服务器安全组。这一步是新手最容易漏的。很多云厂商的安全组默认只放行22端口你的游戏端口根本没开就算系统防火墙放行了也没用。去云控制台把TCP 25565的入方向加进安全组规则。第五步检查系统防火墙sudo ufw status如果ufw是开启状态且没有放行25565执行sudo ufw allow 25565/tcp完成上面五步绝大多数“连不上”的问题都能解决。还有一类情况是“能进去但很卡”那就不是连不连得上的问题而是性能问题看下一节。6.2 TPS下降问题在红石、实体还是区块写入MC服务器有一个核心性能指标叫TPS全称Ticks Per Second。正常情况下服务器每秒应该跑20个游戏刻TPS稳定在19.5以上算健康。低于15玩家就会明显感觉到方块延迟、生物瞬移。查看TPS最简单的方式是在游戏里执行/tps如果TPS偏低我会直接装spark插件做性能分析/spark profiler --timeout 30运行半分钟后spark会生成一份报告里面每个区块、每个实体类型消耗的时间都标得清清楚楚。我这几年排查下来卡顿元凶基本逃不出这四类第一是实体过多。比如某个玩家圈了一大堆动物不杀或者地下基地刷了大量史莱姆。解决方法是限制实体数量和激活范围在spigot.yml里可以调entity-activation-range: animals: 32 monsters: 32 raiders: 48 misc: 16 mob-spawn-range: 4这是减少无效实体运算的经典手段对TPS改善非常明显。第二是大型红石机器。高频红石或活塞虫机制会持续请求方块更新把整个主线程拖垮。这种问题用spark报告很容易定位出区块坐标然后跟玩家协商改造。第三是新区块生成。前面我提过预生成如果服务器没做这一步玩家一探索新方向区块就会现场生成CPU直接飙高。解决办法就是Chunky把周边区块都预生成好。第四是GC停顿。如果玩家遇到的是“每隔几分钟整服卡几秒”很可能是JVM在垃圾回收。看日志里的GC输出或者用spark报告里的GC分析。这种情况通常是你内存分配太大或者参数没调对回看一下第4章。还有一次很奇葩的案例服务器TPS稳定在20但玩家一直抱怨延迟高。最后我用脚本统计了带宽流量发现是云服务器带宽太小玩家多的时候上行带宽被打满。所以如果TPS正常但体验还是差别忘了看一眼带宽使用曲线。最后说一个我自己的习惯。开服时间长了我会定期去翻日志里的warning和error尤其是区块加载异常、实体数量异常这种非致命错误。MC服务器很少会突然暴毙更多是这些小问题积少成多最后在某一次玩家大量上线时彻底崩溃。备份、白名单、再看一眼日志这三个习惯看着不起眼但能让你一个服务器安安稳稳跑完一整年。