Ubuntu VPS 搭建 Minecraft Paper 服务器教程
在 Ubuntu 24.04 VPS 上运行 Paper Minecraft 服务器:了解 2、4、8 GB 内存选择,安装 Java 21,配置 systemd、白名单和双层 25565 防火墙,并安全备份世界。
您要构建的内容
一个能够持续运行的 Minecraft Java Edition 服务器:在 Ubuntu 24.04 上运行 Paper,由专用的 minecraft 用户通过 systemd 管理,并配置 Restart=on-failure;启用白名单,在连接玩家与 JVM 之间的两层防火墙中都开放 25565 端口;备份采用不会损坏其所保护世界的方式执行。服务器本身只有一个 jar 文件和一条 java 命令;一个能让朋友连续游玩一年的服务器,与第一个周末就停止运行的服务器之间,所有差异都围绕这条命令展开。本指南将介绍这些内容。
在花钱之前,先了解两点需要正视的情况。第一,Minecraft 很耗内存,而且主要依赖单线程:1 GB 的 VPS 无法运行可正常游玩的服务器;一个高速核心通常优于四个低速核心。第二,这是 Java Edition。Bedrock 玩家、游戏主机、手机和 Windows Bedrock 应用都无法加入 Java 服务器;Bedrock 需要使用不同的服务器软件并监听 UDP 19132 端口,或者使用 Geyser 插件,这些内容不在本指南范围内。
您需要一台全新的 Ubuntu 24.04 KVM VPS,并拥有 root 或 sudo 权限;准备约三十分钟即可。
配置:朋友服务器实际需要什么
内存是关键指标,实际需要的容量低于模组包论坛通常建议的数值:
- 2 GB 可在较低视距下运行原版,支持 2–5 名玩家。可以游玩,但没有余量。
- 4 GB 是较为舒适的朋友服务器配置:使用 Paper 和少量插件时,可支持约 10 名同时在线的玩家,并为操作系统留出足够内存。
- 8 GB 及以上 适合模组包和 20 名以上玩家。此时还应关注单核 CPU 速度,因为游戏主循环在一个线程上运行。
玩家探索区域后,世界也会持续占用更多磁盘空间。经过充分探索的生存世界可能达到数 GB,因此应为世界文件和备份预留余量。
原版还是 Paper? Paper 是官方 jar 的即插即用替代品:世界文件和客户端保持不变,也不需要客户端安装模组。它重写了性能最差的服务器处理路径,包括区块加载、实体 tick 和漏斗处理,并提供插件 API。只有在需要完全匹配原版机制,以运行可能受 Paper 优化影响的技术型红石农场时,才应使用原版;对于其他情况,Paper 可在相同内存下支持更多玩家。以下内容同时适用于两者。
第 1 步:安装 Java 21
Minecraft 1.20.5 及之后的所有版本(包括全部 1.21.x 版本)都需要 Java 21。Ubuntu 24.04 已在默认软件仓库中提供该版本,headless 构建不会安装服务器不会使用的桌面库:
sudo apt update && sudo apt install -y openjdk-21-jre-headless
java -version正确结果是第一行显示 openjdk version "21.0.x"。如果显示 17 或 11,说明系统安装了其他 JRE,并且当前优先使用该版本;使用 sudo update-alternatives --config java 修复,然后选择包含 java-21 的条目。
跳过此检查,之后很可能会遇到 Minecraft 服务器中最常见的搜索结果对应的错误。使用 Java 17 时,服务器 jar 会立即退出,并显示:
Error: LinkageError occurred while loading main class net.minecraft.bundler.Main
java.lang.UnsupportedClassVersionError: net/minecraft/bundler/Main has been
compiled by a more recent version of the Java Runtime (class file version 65.0),
this version of the Java Runtime only recognizes class file versions up to 61.0这些数字表示版本不匹配:类文件版本 65.0 对应 Java 21,61.0 对应 Java 17,60.0 对应 Java 16。无论看到哪一组版本号,修复方法都相同:安装更新的 JRE,然后重新运行 update-alternatives。
第 2 步:使用专用用户,禁止使用 root
服务器会执行插件代码,并解析所有能够访问该端口的用户发送的网络输入。如果出现问题,以 root 身份运行的入侵程序将完全控制您的 VPS;以 minecraft 身份运行的入侵程序则只能控制一个游戏世界。
sudo adduser --system --group --home /opt/minecraft minecraft--system 会创建一个无密码账户。该账户无法通过 SSH 登录,并将 /opt/minecraft 设为其主目录和工作目录。后续所有操作服务器的命令都以该用户身份运行。
第 3 步:从官方来源下载服务器 JAR
服务器 JAR 只能从以下两个来源获取:原版服务器应从 minecraft.net 的官方服务器下载页面获取,Paper 应从 papermc.io 的下载页面获取。第三方“下载站”重新打包服务器 JAR,是长期存在的恶意软件传播渠道。服务器 JAR 包含即将在面向互联网的主机上全天候运行的任意代码。
从官方页面复制当前构建的下载链接(每个版本和构建的 URL 都会变化,因此不应在此处硬编码),然后执行:
cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'正确结果:一个大小约为 50 MB、所有者为 minecraft 的 server.jar,并通过 ls -lh /opt/minecraft/server.jar 完成验证。
第 4 步:首次运行、EULA 和将自己设为管理员
在配置 systemd 之前,先以交互方式运行一次服务器。首次运行只有两个任务适合通过实时控制台完成。
cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar nogui服务器会在几秒内退出。Paper 会先花费一些额外时间应用补丁,随后日志会以所有人都会看到的这行结束:
[ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.这不是错误,而是许可验证步骤。此次运行已在 jar 文件旁写入 eula.txt。如果您尚未阅读链接中的 EULA,请先阅读,然后修改该标志:
sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txt再次运行相同的 java 命令。这次服务器会生成世界。首次启动可能需要一到两分钟,随后会进入以下状态:
[Server thread/INFO]: Done (9.204s)! For help, type "help"现在您已进入实时控制台。使用它完成第二个任务:输入 op YourMinecraftName(您的确切游戏用户名),服务器会将您写入 ops.json。这样,之后即使没有连接控制台,您也可以在游戏内执行所有管理命令。然后输入 stop,以保存数据并正常退出。
第 5 步:server.properties,以及为什么 online-mode 应保持为 true
首次运行还写入了 server.properties。大多数默认值都可以直接使用;以下配置项值得明确决定:
online-mode=true
white-list=true
enforce-whitelist=true
view-distance=8
max-players=10
motd=A private server for people I actually knowonline-mode=true 会让服务器向 Mojang 的会话服务器验证每个加入游戏的用户名,以确认玩家拥有该账户。将其设置为 false(即“非正版服务器”开关)后,服务器会接受客户端对其身份的自报:任何人都可以使用任意名称加入,包括您的名称。由于 op 和白名单都按名称关联,冒名者可以直接获得您的 operator 权限。唯一合理的关闭场景,是服务器位于 Velocity 等经过身份验证的代理之后,由代理自行验证玩家身份。在普通服务器上,该项必须保持为 true。
view-distance 是此文件中影响性能最大的配置项,CPU 和 RAM 开销大致按其平方增长。8 是适合 VPS 的默认值;10 是原版默认值,开销明显更高。
white-list=true 加上 enforce-whitelist=true 可以禁止陌生人加入服务器,下面的安全部分会说明这不是可选项。以 op 身份在游戏中使用 /whitelist add TheirName 添加玩家。
第 6 步:内存参数,为什么 -Xms 和 -Xmx 应保持一致
JVM 会将堆大小设置在 -Xms(初始大小)和 -Xmx(上限)之间。在专用游戏服务器上,应将二者设置为相同值:堆最终都会达到上限,运行期间逐步扩容只会增加垃圾回收开销。在 4 GB VPS 上,正确的配置是:
/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui-Xmx并不是进程使用的全部内存。JVM 还会使用堆外内存、线程栈、JIT 缓存和直接缓冲区等内存,通常至少还需要约半个 GB;Ubuntu 本身也需要预留内存。经验规则是:-Xmx最多设置为 VPS 内存减去 1 GB。超出此范围会导致两种故障之一。如果内存分配在启动前失败,服务器会拒绝启动,并显示:
Error: Could not reserve enough space for object heap这种情况会立即报告错误。更严重的情况是服务器可以正常启动,但数小时后在高负载下堆被填满,内核的 OOM killer 会终止服务器上占用内存最多的进程,也就是 JVM。服务器日志中不会出现任何信息;证据位于 sudo dmesg | grep -i oom,其中会有类似 Out of memory: Killed process 1234 (java) 的一行。如果服务“随机”重启,请先检查这里,并减小 -Xmx。
对于 Paper,项目文档提供了 Aikar 的参数。这是一组经过调优的 G1GC 参数(-XX:+UseG1GC -XX:MaxGCPauseMillis=200 以及其他十多个参数),可减少较大堆内存的垃圾回收暂停。请根据 Paper 文档生成完整参数行;对于 2–4 GB 堆,收益有限,但这些参数不会造成问题。
第 7 步:使用 Restart=on-failure 的 systemd 单元
手动启动的服务器会随着 SSH 会话结束而停止,并且重启后不会自动运行。编写 /etc/systemd/system/minecraft.service:
[Unit]
Description=Minecraft server (Paper)
After=network-online.target
Wants=network-online.target
[Service]
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft
ExecStart=/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui
Restart=on-failure
RestartSec=10
TimeoutStopSec=120
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -f正确结果是:status显示 active (running),而现在包含服务器控制台输出的 journal 再次结束于 Done 行。
该单元有两个经过刻意设置的选项。Restart=on-failure会在服务器崩溃后重新启动,但不会在正常 stop 后重新启动,因此仍可执行维护操作。TimeoutStopSec=120的重要性也超出表面看起来的程度:systemctl stop会发送 SIGTERM,Minecraft 服务器会捕获该信号,并在退出前保存所有世界;对于大型世界,这个保存过程需要一定时间。systemd 的默认超时可能会在保存过程中向 JVM 发送 SIGKILL,这正是导致区域文件损坏的原因。将超时时间设为两分钟。
如果服务反复启动和停止,并且 journal 显示:
[Server thread/WARN]: **** FAILED TO BIND TO PORT!
[Server thread/WARN]: The exception was: io.netty.channel.unix.Errors$NativeIoException: bind(..) failed: Address already in use
[Server thread/WARN]: Perhaps a server is already running on that port?则说明已有进程占用 25565 端口。几乎总是因为之前在前台运行的实例仍在另一个 SSH 会话中运行。使用 sudo ss -tlnp | grep 25565 找到该进程,并停止该实例;不要让两个服务器使用同一个端口。
步骤 8:在两层防火墙上开放 25565
Minecraft Java 仅使用 TCP 25565(UDP 只是可选的查询协议,默认关闭)。在 VPS 上执行:
sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enable这只是第一层防火墙。大多数 VPS 提供商还会在控制面板中运行第二层网络防火墙,用户经常会忘记配置它。也要在那里开放 TCP 25565。只开放其中一层时,表现通常很难判断:客户端停留在“正在连接到服务器……”并以 Connection timed out: no further information 失败,没有拒绝连接,没有服务器错误,日志中也没有任何记录,因为数据包根本没有到达。使用 VPS 外部的计算机,通过 nc -vz your.server.ip 25565 进行验证;succeeded 表示两层防火墙都已开放,连接卡住则表示至少有一层尚未开放。
既然你正在配置 ufw,请注意这台主机还通过公网 IP 运行 SSH,几小时内就会出现大量暴力破解日志。趁还没有忘记,先在 Ubuntu 24.04 上为 SSH 配置 Fail2ban。
现在连接服务器:选择 Multiplayer、Direct Connection,然后输入服务器 IP。由于你已在步骤 4 中授予自己管理员权限,游戏内命令会立即生效;每位玩家使用 /whitelist add FriendName,如果计划如此,则使用 /gamemode creative。
第 9 步:配置白名单,因为互联网会扫描 25565 端口
将 Minecraft 服务器直接暴露在互联网上并非理论风险:批量扫描器会持续扫描整个 IPv4 地址空间中的 25565 端口;业余破坏项目已经借此发现了数十万个开放服务器;未配置白名单的服务器通常会在几天内,有时甚至几小时内,迎来未经邀请的访问者。第 5 步配置的白名单就是解决方案:online-mode=true用于验证身份,白名单将进入权限限制为您选择的身份。这两者构成完整的安全模型,足以保护供朋友使用的服务器。
如果需要在不启动游戏的情况下访问控制台、执行脚本备份或运行 cron 任务,请在 server.properties 中启用 RCON(enable-rcon=true、强 rcon.password、端口 25575),然后直接在 VPS 上从其 GitHub 源代码构建这个小型 mcrcon 客户端;Ubuntu 的软件仓库中不提供该客户端。不要在任何防火墙中开放 25575:RCON 会以明文发送密码,因此只能绑定到 loopback。
第 10 步:不会损坏世界的备份
只有一条规则:服务器正在写入世界目录时,绝对不要复制该目录。 游戏过程中,区域文件会持续重写;如果 tar 与写入操作并发执行,生成的归档中就会包含只写入了一半的区块。将来恢复备份时,正是在备份必须可用的时刻,日志会充满区块加载错误,地形也会出现空洞。遵循以下两项操作规范即可避免此问题。
停止-复制-启动最简单,但需要承担约 1 分钟的停机时间:
sudo systemctl stop minecraft
sudo mkdir -p /opt/backups
sudo tar czf /opt/backups/world-$(date +%F-%H%M).tgz \
-C /opt/minecraft world world_nether world_the_end
sudo systemctl start minecraft(Paper 会将不同维度拆分到 world、world_nether 和 world_the_end;原版服务器会将所有内容保存在 world 中,因此只需在此处删除另外两个目录。)
Save-off 可在服务器运行期间备份:通过 RCON 执行 save-off(停止自动保存),然后执行 save-all flush(强制将所有内容写入磁盘并等待),创建 tar 归档,最后执行 save-on。适合将此版本放入 cron,在凌晨 5 点运行。
无论采用哪种方式,将备份保存在与服务器相同的 VPS 上都不算备份。scp 或 rclone 将归档复制到服务器之外,并保留多个备份。由于发生故障时您不会一直盯着控制台,因此还应对端口配置外部检查:使用 另一台主机上的 Uptime Kuma 对 25565 执行 TCP 检查,这样服务器宕机后,玩家发现之前您就能收到通知。
插件和升级
从原理上看,插件就是放入 /opt/minecraft/plugins/ 的 jar 文件,随后重启服务器,整个安装过程仅此而已。插件只能从其官方项目页面(Hangar、Modrinth、SpigotMC)获取,原因与服务器 jar 相同:每个插件都是以 minecraft 用户身份运行的任意代码。
升级服务器的步骤是:停止服务、备份数据、将 server.jar 替换为适用于新 Minecraft 版本的构建版本,然后启动服务。需要注意两点。世界升级是单向的:使用较新版本打开过的世界无法在较旧版本中打开,因此备份仍然必不可少。插件通常会比新的 Minecraft 版本晚数天或数周适配,因此在新版本发布当天升级前,应先确认兼容性。
如果您更希望通过容器管理这些内容,可以将版本固定、EULA 接受状态和内存参数设置为环境变量。广泛使用的 itzg/minecraft-server 镜像可在您的 VPS 上通过 Docker Compose 部署在 VPS 上 运行相同的 Paper 服务器,同时遵循相同的防火墙和备份规范。
FAQ
Minecraft 服务器需要多少 RAM?
2 GB 可运行原版服务器,支持 2–5 名玩家;4 GB 适合在 Paper 上运行、约 10 名好友游玩的服务器,并可安装少量插件;模组包和 20 名以上玩家需要 8 GB 或更多。无论 VPS 规格如何,都应将 -Xmx 设置为不超过总 RAM 减去 1 GB,因为 JVM 还会使用堆之外的内存,设置过高最终会导致 Error: Could not reserve enough space for object heap 或被 OOM 静默终止。
为什么我的朋友无法连接到 Minecraft 服务器?
客户端连接停滞并最终出现 Connection timed out: no further information,几乎总是防火墙问题,而且这里有两层防火墙:VPS 上的 ufw,以及服务商控制面板中的网络防火墙。两者都必须放行 TCP 25565。先在服务器上使用 sudo ss -tlnp | grep 25565 确认服务确实在监听,然后从外部使用 nc -vz your.server.ip 25565 进行测试。
我应该在 server.properties 中设置 online-mode=false 吗?
不应该。设置 online-mode=false 后,服务器会完全跳过 Mojang 身份验证,因此任何人都可以使用任意用户名加入,包括使用管理员用户名加入并继承其权限;玩家皮肤和稳定 UUID 也会失效。唯一合理的用途是将服务器置于 Velocity 等身份验证代理之后,由代理自行验证玩家身份。对于普通服务器,应保持 true。
Paper 比原版 Minecraft 服务器更好吗?
对几乎所有用户来说,是的。Paper 是可直接替换使用的 jar,可加载原版世界,接受未修改的客户端,并以高得多的效率处理实体和加载区块,同时提供插件生态。例外是需要逐位匹配原版行为的技术型红石社区,因为某些 Paper 优化会改变这些行为。在小型 VPS 上,Paper 的高效率相当于免费获得了更多可用 RAM。
如何备份 Minecraft 世界而不破坏数据?
不要在服务器写入世界目录时直接归档该目录,因为复制操作与区域文件写入并发执行会生成损坏的区块,而这类问题通常要到恢复时才会发现。可以先停止服务器,使用 tar 归档世界目录,再重新启动服务器;也可以通过 RCON,配合 save-off、save-all flush、tar 和 save-on,在服务器运行期间完成备份。随后将归档文件移出 VPS。