资讯详情

CentOS上从零搭建Minecraft服务器:Java环境、核心选型与性能调优实战

📅 2026/10/23 11:45:47 | 华诺云谱 👁 阅读
CentOS上从零搭建Minecraft服务器:Java环境、核心选型与性能调优实战
1. 为什么选择在CentOS上搭建Minecraft服务器1.1 自建服务器的核心动机很多人第一次接触Minecraft联机都是直接用游戏里那个对局域网开放的功能或者花点小钱租个现成的面板服。但玩着玩着就会发现几个问题面板服限制多想装个自定义模组、调个服务端参数处处掣肘人数一多就卡配置还不透明存档数据在别人手里总感觉不踏实。我自己也是从面板服一路走过来的后来实在受不了那种想改点东西还得看服务商脸色的感觉索性把家里一台闲置的旧机器装上了CentOS自己从头搭了一套。CentOS这套系统在企业级服务器领域摸爬滚打这么多年最大的特点就是稳。它的软件源成熟、社区文档多、长期支持周期长对于一台需要7x24小时挂着跑的服务端来说稳定压倒一切。相比之下一些滚动更新的发行版虽然软件新但偶尔一个内核更新就可能让你的Java环境出点幺蛾子半夜掉线还得爬起来排查那种体验真的不想再来第二次。这篇文章要讲的东西很具体怎么在一台CentOS机器上从零把一个能长期稳定运行的Minecraft服务器搭起来。包括Java环境怎么选、服务端核心怎么挑、内存参数怎么算、防火墙怎么放行、怎么让它开机自启、出问题了怎么排查。适合有一定Linux基础、想自己动手折腾的玩家也适合完全没接触过服务端、但愿意照着步骤一步步来的新手。我会把每一步背后的为什么讲清楚这样你遇到变体情况时也能自己判断而不是死记命令。1.2 自建方案与常见替代方案的取舍在动手之前先想清楚你到底需要哪种方案这决定了后面所有的技术选型。市面上常见的联机方式大致有这么几类我列个表对比一下你对着自己的需求看。方案类型成本可控性维护难度适合人群游戏内置局域网联机零成本极低极低临时两三人同屏第三方面板服按月付费低低不想折腾的休闲玩家云主机自建按配置付费高中有基础、要长期稳定本地物理机自建一次性硬件成本最高中高追求极致可控、有闲置设备选本地物理机自建核心优势是数据完全在自己手里性能上限取决于你的硬件而且没有月租。代价是你得自己负责网络、电力、散热和系统维护。如果你的宽带没有公网地址那还得额外考虑内网穿透的问题——这部分内容涉及网络配置本文只聚焦在服务器本身的搭建上网络接入方式请根据自身合规条件另行处理。我个人的建议是如果你只是想和朋友偶尔玩玩面板服其实挺省心但如果你打算长期开一个几十人的生存服或者要跑大量模组、插件那自建是唯一能让你睡得着觉的选择。下面所有内容都基于本地物理机 CentOS这个前提展开。2. 搭建前的环境准备与核心选型2.1 CentOS版本与系统基础配置先说系统版本。CentOS 7 和 CentOS 8 是两个绕不开的选项但它们的命运不太一样。CentOS 7 的支持周期到2024年6月已经结束CentOS 8 更早就转向了Stream模式。这意味着如果你现在新装系统用原版CentOS可能会遇到软件源失效的问题。我的实际做法是要么用CentOS 7并手动把软件源指向归档地址要么直接选用与CentOS同源、但支持周期更长的替代发行版比如某些企业级下游版本。本文的命令以CentOS 7的语法为准其他同源系统基本通用。系统装好后的第一件事是更新基础组件并装几个后面必用的工具。这里有个坑要提前说不要一上来就yum update全量升级尤其是内核。生产环境里内核升级有时候会导致网卡驱动或某些硬件兼容性问题服务器直接失联。我的习惯是先只更新安全补丁和必要组件。# 查看当前系统版本 cat /etc/redhat-release # 安装常用工具后面排查问题会用到 yum install -y wget curl vim net-tools lsof screen tarscreen这个工具特别重要后面会专门讲它的用法。net-tools里的netstat虽然被标记为过时但排查端口占用时比ss更直观两个都留着不亏。接下来创建一个专用的系统用户来跑Minecraft服务端。为什么不直接用root跑因为服务端本身是个第三方程序万一有漏洞被利用root权限意味着整台机器沦陷。用一个普通用户跑即使出问题影响范围也被限制在这个用户的家目录里。这是最基本的安全隔离思路。# 创建专用用户 useradd -m -s /bin/bash mcserver # 设置密码 passwd mcserver # 切换到该用户 su - mcserver2.2 Java环境的选择与安装Minecraft服务端是Java写的Java版本选错服务端要么起不来要么跑着跑着内存溢出。这里的关键是Java版本必须和服务端核心要求的版本匹配。不同版本的Minecraft对Java的要求不一样。大致规律是1.16及以下用Java 81.17到1.20.4用Java 171.20.5及以上用Java 21。这个对应关系不是绝对的具体要看你选的服务端核心的官方说明。装错版本的典型症状是启动时报UnsupportedClassVersionError一看错误信息里的版本号就知道装错了。在CentOS上装Java我推荐用包管理器装OpenJDK而不是去官网下tar包手动配环境变量。原因很简单包管理器装的版本系统能统一管理升级和卸载都干净不会出现环境变量指向了一个已经不存在的目录这种破事。# 查看可用的Java版本 yum search openjdk # 以Java 17为例1.17-1.20.4服务端适用 yum install -y java-17-openjdk java-17-openjdk-devel # 验证安装 java -version如果你需要同时装多个Java版本比如同时开1.12和1.20两个服可以用alternatives命令来切换默认版本或者干脆在启动脚本里写死Java的绝对路径。后者更稳妥因为不受系统默认版本切换的影响。# 查看Java安装路径 which java # 通常输出 /usr/bin/java这是软链接真实路径在 /usr/lib/jvm/ 下 ls /usr/lib/jvm/提示启动脚本里用Java的绝对路径比如/usr/lib/jvm/java-17-openjdk-xxx/bin/java这样即使系统默认Java被改了你的服务端也不受影响。2.3 服务端核心的选型逻辑服务端核心这个词新手可能有点懵。简单说Minecraft官方只提供了一个叫Vanilla原版的服务端功能最基础性能也最一般。社区基于它开发了很多优化版和增强版核心各有侧重。选哪个取决于你要玩什么。核心名称类型特点适用场景Vanilla原版官方出品无插件支持纯净原版体验Paper优化版性能好插件生态成熟大多数生存服首选Purpur优化版在Paper基础上增加更多可调项想要精细控制的服主Forge模组端支持模组加载模组整合包Fabric模组端轻量加载快新式模组、性能模组Spigot优化版Paper的前身插件兼容好老牌选择我的建议很直接如果你不玩模组就用Paper或者Purpur性能和稳定性都经过大量服务器验证。如果你要玩模组那就Forge或Fabric二选一具体看你的整合包基于哪个。注意插件和模组是两套体系Paper装不了Forge模组Forge也装不了Bukkit插件别搞混了。下载核心文件时一定要从官方渠道获取。Paper可以从其官方构建站点下载对应版本的jar包Forge和Fabric也都有官方安装器。不要从乱七八糟的网盘下那些文件被植入后门的案例不是没有。# 以Paper为例先建目录 mkdir -p ~/mc-server cd ~/mc-server # 下载对应版本的Paper核心版本号请以官方最新为准 wget -O paper.jar 官方下载地址下载完先别急着启动还有个重要的东西要配EULA。Minecraft服务端首次启动会生成一个eula.txt里面默认是eulafalse你必须改成true才能启动。这是 Mojang 的用户协议要求表示你同意其条款。改这个文件是启动前的必要步骤。# 首次启动会生成eula.txt或者手动创建 echo eulatrue eula.txt3. 服务端配置与性能调优实操3.1 内存分配的计算方法内存给多少是新手最容易拍脑袋决定的事。给少了服务端频繁GC垃圾回收玩家感觉一顿一顿的给多了浪费系统资源而且JVM在堆内存过大时一次Full GC的停顿时间反而更长。这里给一个我常用的估算方法。首先明确给Minecraft服务端的内存不等于整台机器的内存。操作系统本身要占一部分如果你还在这台机器上跑别的服务也要留出来。一般建议服务端占用不超过物理内存的70%。然后看玩家数量和玩法原版生存10人以内2-4GB原版生存10-30人4-8GB大量插件20人以上8-16GB模组整合包通常8GB起步大型整合包16GB以上启动参数里-Xms和-Xmx建议设成一样的值。为什么因为如果初始堆小、最大堆大JVM会随着使用逐渐扩容这个扩容过程本身有开销而且容易在扩容时产生卡顿。设成一样JVM一开始就申请到位运行更平稳。# 一个典型的启动命令 java -Xms4G -Xmx4G -XX:UseG1GC -XX:ParallelRefProcEnabled \ -XX:MaxGCPauseMillis200 -XX:UnlockExperimentalVMOptions \ -XX:DisableExplicitGC -XX:AlwaysPreTouch \ -jar paper.jar nogui这里面的参数值得解释一下。-XX:UseG1GC是启用G1垃圾回收器它在处理大堆内存时比默认的回收器停顿更短是现在Minecraft服务端的标配。-XX:MaxGCPauseMillis200是告诉JVM尽量把每次GC停顿控制在200毫秒内。-XX:AlwaysPreTouch是在启动时就把内存全部预分配并触碰一遍避免运行中才分配导致的延迟代价是启动慢一点但换来运行时的稳定很值。注意-Xmx后面的单位G表示GBM表示MB。写4G没问题写4096M也行但别写成4GB那是无效的。3.2 server.properties关键参数解读server.properties是服务端的核心配置文件里面几十个参数大部分保持默认就行但有几个必须根据你的情况调整。# 服务器监听端口默认25565 server-port25565 # 最大玩家数 max-players20 # 正版验证true表示只允许正版账号进入 online-modetrue # 视距影响玩家能看到多远数值越大越吃性能 view-distance8 # 模拟距离影响怪物和方块更新的范围 simulation-distance6 # 是否开启白名单 white-listfalse # 服务器描述显示在多人游戏列表里 motd欢迎来到我的服务器online-mode这个参数要重点说。设成true时服务端会向Mojang的验证服务器确认每个登录玩家的账号合法性只有正版账号能进。设成false则关闭验证任何客户端都能进但这也意味着别人可以随便冒用你的ID。如果你的服务器是公开的强烈建议保持true。如果是纯朋友之间玩且都用的正版也保持true最省心。view-distance和simulation-distance是性能大户。视距每增加1服务端需要加载和发送的区块数量是平方级增长的。很多服主抱怨卡顿一查视距设了12甚至16调回8立马流畅。模拟距离影响的是怪物活动、作物生长这些逻辑的更新范围一般比视距小一点6到8之间比较平衡。3.3 用screen实现后台常驻运行服务端不能一直挂在前台你SSH一断开进程就跟着结束了。解决办法是用screen或者tmux这类终端复用工具让服务端跑在一个虚拟终端里你随时可以切进去看日志、敲命令断开SSH也不影响它。# 创建一个名为mc的screen会话 screen -S mc # 在会话里启动服务端 cd ~/mc-server java -Xms4G -Xmx4G -XX:UseG1GC -jar paper.jar nogui # 按 CtrlA 然后按 D即可分离会话服务端继续在后台跑 # 想重新进入会话 screen -r mc # 查看所有会话 screen -lsscreen的快捷键是CtrlA作为前缀然后按其他键。分离是CtrlA再按D。在会话里想正常停止服务端不要直接关终端而是在服务端控制台输入stop命令让它保存存档后优雅退出。直接杀进程可能导致存档损坏这个坑我踩过一个玩了两周的存档因为直接kill而区块错乱心疼了好久。提示如果screen -r提示会话被占用Attached用screen -d -r mc强制分离并重新连接。4. 网络放行、开机自启与日常维护4.1 防火墙端口放行CentOS 7 默认用的是firewalld服务端监听的端口如果不放行外面根本连不进来。这一步很多人会忘然后对着Connection refused抓耳挠腮。# 查看防火墙状态 systemctl status firewalld # 放行Minecraft默认端口 firewall-cmd --permanent --add-port25565/tcp firewall-cmd --permanent --add-port25565/udp # 重新加载防火墙规则 firewall-cmd --reload # 确认端口已放行 firewall-cmd --list-portsMinecraft主要走TCP但某些查询功能会用到UDP两个都放行省事。如果你改了server-port记得这里也要改成对应的端口号。另外如果你用的是云主机除了系统防火墙云服务商的控制台里通常还有一层安全组或网络ACL也要在那里放行同样的端口。两层防火墙都放行缺一不可。我见过有人系统防火墙配了半天最后发现是云控制台的安全组没开白白折腾一小时。4.2 配置systemd实现开机自启用screen手动启动机器一重启服务端就没了还得手动登进去开。要让它开机自动运行用systemd写一个服务单元是最规范的做法。# 创建服务文件 /etc/systemd/system/minecraft.service [Unit] DescriptionMinecraft Server Afternetwork.target [Service] Typesimple Usermcserver WorkingDirectory/home/mcserver/mc-server ExecStart/usr/lib/jvm/java-17-openjdk-xxx/bin/java -Xms4G -Xmx4G -XX:UseG1GC -jar paper.jar nogui Restarton-failure RestartSec10 [Install] WantedBymulti-user.target几个关键点User指定用哪个用户跑这里填前面创建的mcserverWorkingDirectory是服务端所在目录必须是绝对路径ExecStart里Java用绝对路径避免PATH问题Restarton-failure表示进程异常退出时自动重启RestartSec10是重启前等10秒避免疯狂重启刷屏。# 重新加载systemd配置 systemctl daemon-reload # 启动服务 systemctl start minecraft # 设置开机自启 systemctl enable minecraft # 查看状态 systemctl status minecraft # 查看日志 journalctl -u minecraft -f用了systemd之后服务端的标准输入输出会被systemd接管你没法像screen那样直接敲命令。想给服务端发指令比如stop、say可以通过RCON或者把服务端控制台重定向到命名管道。对于大多数场景直接systemctl restart minecraft也能达到重启目的只是不是优雅停止。追求优雅的话建议开启RCON用mcrcon这类工具发指令。4.3 存档备份与日志监控服务端跑起来只是开始日常维护才是长久之计。最重要的两件事备份和看日志。备份的核心原则是定期、异地、可恢复。只在一台机器上备份硬盘一坏全完。我的做法是写个脚本每天凌晨把存档目录打包压缩保留最近7天的然后同步到另一块盘或者另一台机器。#!/bin/bash # backup.sh DATE$(date %Y%m%d) BACKUP_DIR/home/mcserver/backups WORLD_DIR/home/mcserver/mc-server/world mkdir -p $BACKUP_DIR tar -czf $BACKUP_DIR/world-$DATE.tar.gz $WORLD_DIR # 删除7天前的备份 find $BACKUP_DIR -name world-*.tar.gz -mtime 7 -delete配合crontab定时执行# 编辑当前用户的定时任务 crontab -e # 添加一行每天凌晨3点执行 0 3 * * * /bin/bash /home/mcserver/backup.sh看日志主要是盯logs/latest.log里面记录了玩家登录、报错、警告等信息。如果服务端突然卡顿或者崩溃日志里通常有线索。常见的报错比如Cant keep up! Is the server overloaded?说明服务端处理不过来通常是视距太高或者实体太多java.lang.OutOfMemoryError则是内存不够需要调大-Xmx。5. 常见问题排查与避坑经验5.1 启动失败类问题速查服务端起不来是最让人抓狂的。下面这张表覆盖了我遇到过的绝大多数启动问题按症状对号入座。症状可能原因解决方法UnsupportedClassVersionErrorJava版本不匹配换对应版本的Java提示eula未同意eula.txt未改改成eulatrueAddress already in use端口被占用换端口或杀掉占用进程启动后立即退出无报错内存参数过大调小-Xmx检查物理内存找不到主类jar文件名或路径错检查jar包名和启动命令权限拒绝用户对目录无权限chown改目录属主排查端口占用用这条命令# 查看25565端口被谁占了 netstat -tlnp | grep 25565 # 或者 lsof -i:25565找到PID后确认是不是之前的服务端残留进程是的话kill掉再启动。5.2 运行中卡顿与掉线的排查思路服务端跑起来之后玩家反馈卡、掉线排查要分清楚是服务端的问题还是网络的问题。先看服务端日志有没有Cant keep up的警告。有的话说明服务端主线程处理不过来属于性能问题。解决方向降低view-distance和simulation-distance、减少实体数量比如清理掉落物、检查是不是有插件在疯狂刷任务。可以用/tps命令Paper自带看服务器的TPS正常应该是20低于18就明显卡了。如果没有性能警告但玩家还是掉线那大概率是网络问题。检查服务器的上行带宽够不够玩家越多、视距越大需要的上行带宽越高。一个20人的服视距8上行带宽建议至少10Mbps独享。家用宽带的上行通常比较小这是自建服的一个硬伤人多了确实扛不住。还有一个隐蔽的坑GC停顿。如果内存给得不合理JVM频繁Full GC每次停顿几秒玩家就会感觉突然卡一下然后恢复。这种卡顿在日志里不一定有明显报错但用jstat能看到GC频率异常。解决办法就是前面说的-Xms和-Xmx设成一样用G1GC加上AlwaysPreTouch。5.3 几个我踩过的坑和独家心得第一个坑别在服务端运行时直接改核心jar包。有次我想升级Paper版本直接把新的jar覆盖了旧的然后systemctl restart。结果因为新旧版本配置文件格式有差异服务端起不来回滚又忘了备份旧jar折腾半天。正确做法是停服、备份旧jar和配置、换新jar、启动测试、确认没问题再删备份。第二个坑世界边界和预生成。新服开荒时玩家到处跑服务端要实时生成新区块非常吃性能表现为跑图的时候特别卡。解决办法是用Chunky这类插件预先把你想要的范围生成好玩家再跑就不卡了。这个操作在开服前做能省掉后期很多抱怨。第三个坑时区和时间。CentOS默认可能是UTC时区导致服务端日志的时间和你本地时间对不上排查问题时很迷惑。用timedatectl set-timezone Asia/Shanghai改成东八区日志时间就直观了。第四个心得给服务端单独留一个SSD。Minecraft的存档读写非常频繁机械硬盘在多人同时在线时IO会成为瓶颈。把服务端目录放在SSD上区块加载速度明显提升。如果预算有限至少把world目录放到SSD其他文件放机械盘。第五个心得定期重启。即使没有内存泄漏长时间运行后JVM的堆碎片和插件的各种缓存也会累积。我习惯每周固定时间重启一次服务端配合自动备份重启前发个公告玩家也能接受。重启能解决很多说不清道不明的偶发卡顿。5.4 性能监控的简易方案不需要上复杂的监控系统几个简单命令就能掌握服务器状态。# 看CPU和内存总体使用 top # 看Java进程的详细内存和GC情况 jstat -gc pid 1000 # 看磁盘IO iostat -x 1 # 看网络流量 iftopjstat -gc每秒输出一次GC统计重点看FGCFull GC次数和FGCTFull GC总耗时。如果FGC增长很快说明内存不够或者有内存泄漏需要调大内存或排查插件。iftop能实时看到网络流量判断带宽是否跑满。我个人习惯在服务端目录放一个monitor.sh脚本定时把TPS、在线人数、内存使用写到一个日志文件里出问题时翻这个日志比事后回忆靠谱得多。最后分享一个关于插件选择的小经验插件不是越多越好。每装一个插件就多一份性能开销和潜在的冲突风险。装之前先问自己这个功能真的需要吗能用原版命令解决的就不装插件。我见过一个服装了80多个插件TPS常年15以下删到20个之后直接回到20玩家体验天差地别。保持精简是长期稳定运行的关键。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑