折腾了这么多年的Minecraft服务器,我最早也是拿Windows Server开的,每天看着内存飙到90%多,CPU动不动就满载,后台开个远程桌面都能卡成PPT。后来彻底迁到Linux上,尤其是CentOS 7.9这种老牌稳定系统,才发现MC开服这件事可以这么省心。这篇文章就把我从零开始,在CentOS 7.9上完整搭建MC服务器、处理各种版本坑、配置计分板、解决联机掉线的过程和踩坑记录全部分享出来。不管你是想开个三五好友的小服,还是打算跑整合包长期运营,照着这个路子走基本不会跑偏。
1. 内容整体设计与思路拆解
先聊清楚整体思路。MC服务器说白了就三层:系统环境、Java运行时代、服务端核心,剩下所有东西都是往这三层上面加配置、加插件、加玩法。很多人一上来就急着装面板、配插件,结果环境都是乱的,出了问题都不知道从哪查起。我个人的习惯是:先在干净的CentOS 7.9上把Java跑通,再把服务端跑起来,确认原版能进服,最后再谈整合包、插件、计分板这些锦上添花的东西。
为什么选CentOS 7.9而不是更新的系统?原因很实际:CentOS 7.9的yum源里就有OpenJDK,不用折腾编译安装;网上关于CentOS 7开MC服的教程存量极多,遇到问题搜一下基本都能找到解决方案;而且系统本身非常稳定,做MC服务器不需要花里胡哨的桌面环境,一个精简的Linux系统就是最好的“游戏运行底座”。当然,CentOS 7已经停止维护了,如果你非常看重系统安全补丁,也可以用Rocky Linux或者AlmaLinux替代,但命令和操作习惯跟CentOS 7几乎一致,不影响这篇文章的流程。
整体架构上,我建议按照“系统层—运行层—服务端层—玩法层”四个维度来规划,不要一开始就贪多。系统层负责网络端口和防火墙;运行层就是JDK和启动参数;服务端层负责世界生成和玩家交互逻辑;玩法层是插件、数据包、计分板、权限组这些。把每一层的职责分清楚,排查问题的时候就不会像无头苍蝇一样瞎试。这套思路尤其适合那种“8G内存条也能玩的MC整合包”需求,先保证底子干净,再逐步往上加东西。
2. 核心细节解析与实操要点
2.1 JDK版本和服务端版本的对应关系
这个坑几乎是每个开服的人都踩过的。MC不同版本对Java的版本要求完全不一样,装错了直接启动报错,或者启动没报错但进服就闪退。我整理了一张对应表,你直接对着看就行:
| MC服务端版本 | 需要JDK版本 | 备注 |
|---|---|---|
| 1.8 ~ 1.16.5 | Java 8 | 老版本整合包基本都用这个 |
| 1.17 ~ 1.17.1 | Java 16 | 这版很特殊,用17也能跑但有时报错 |
| 1.18 ~ 1.20.4 | Java 17 | 目前大多数服务器的主力版本 |
| 1.20.5及以上 | Java 21 | 新版本强制要求,装17会直接拒绝启动 |
| 1.21.x | Java 21 | 当前最新正式版本 |
在CentOS 7.9上我推荐装headless版本的OpenJDK,也就是没有图形界面支持的版本,因为服务器根本不需要GUI,能省不少内存。装完记得验证一下版本,避免后期排查启动问题时找不到方向。
2.2 服务端核心怎么选
服务端核心是MC开服最关键的选型。网上说的那些词—原版、Spigot、Paper、Forge、Fabric—到底什么意思?打个比方,原版服务端就是“官方毛坯房”,什么装饰都没有但最稳定;Spigot和Paper是“精装房”,支持插件(比如传送、经济、领地),其中Paper在性能上比Spigot更好,我强烈推荐;Forge是“改装房”,专门跑各种大型Mod整合包;Fabric则更轻量,适合追求加载速度和模组自由度的玩家。如果你是开插件服,直接选Paper;如果是跑“自然之需”这种整合包,就得选Forge或者Fabric对应的版本。选错核心轻则插件加载失败,重则整个服务器起不来,这个决定值得你多花十分钟想清楚。
2.3 跑整合包要注意的“对齐”问题
很多人拿到一个整合包(比如“自然之需”),第一反应就是直接扔到服务器上跑,结果各种崩。整合包开服最核心的原则是:服务器端跟客户端要“对齐”。客户端整合包里通常包含服务端启动脚本、mods配置、配置文件,但也有很多只给客户端用的模组。你在服务器上装的时候,要把客户端专属模组剔除,同时确保核心模组版本跟客户端完全一致,否则进服时就会出现“模组不匹配”的报错。我一般会在本地先用客户端启动一次整合包,确认能正常进入单人世界,再把mods文件夹和服务端配置原封不动传到服务器上,这样能排除掉一半以上的兼容性问题。内存只有8G的话,别硬上大型整合包,选轻量整合包或者砍掉一些吃内存的模组,比如大型地图模组和堆叠类模组,至少能省2到3G内存。
3. 实操过程与核心环节实现
3.1 系统初始化和基础环境配置
我尽量把每一步命令都列出来,你照着敲就行。首先确保系统是干净的CentOS 7.9,然后执行更新:
yum update -y接着安装一些必备工具,像unzip、wget、screen这些,后面都会用到:
yum install -y unzip wget screen which这里有个细节我必须强调:为什么要装screen?因为MC服务器必须持续运行在后台,如果你直接在前台启动,SSH断开服务器就停了。screen可以在服务器上开一个虚拟终端,把MC进程挂进去,这样你退出SSH、断网都没关系,服务器该跑还是跑。
3.2 安装JDK
以现在主流的MC 1.20.4为例,需要JDK 17。CentOS 7.9自带的yum源里就有OpenJDK 17,安装命令很简单:
yum install -y java-17-openjdk-headless装完查看版本:
java -version如果输出里显示openjdk version "17.0.x",说明环境OK。如果你要跑的是1.8的老版本整合包,就换成:
yum install -y java-1.8.0-openjdk-headless注意一个很常见的坑:如果同一台机器装了多个Java版本,务必用alternatives --config java命令手动指定默认版本,否则启动脚本可能调用到错误的Java。我排查过好多次“明明装了JDK17却提示找不到Java”的问题,最后都是多版本环境搞混了。
3.3 下载服务端核心
确定好版本和核心类型之后,创建一个专用目录,我习惯放在/opt/mc下:
mkdir -p /opt/mc && cd /opt/mc以Paper 1.20.4为例,去PaperMC官网能拿到对应版本的下载直链。用wget拉下来:
wget https://api.papermc.io/v2/projects/paper/versions/1.20.4/builds/最新构建号/downloads/paper-1.20.4-最新构建号.jar下载完成后,最好把文件重命名成好记的名字,比如paper.jar:
mv paper-1.20.4-*.jar paper.jar如果你跑的是整合包,通常整合包文件夹里已经带了server.jar或者forge-xxx-installer.jar这种文件,直接进目录执行安装即可。如果遇到的是mc源代码或者自己写的python可复制MC代码这类非标准服务端,那就不能用这个流程了,得先看清楚它是不是基于NMS的服务端实现,是的话还需要额外配置依赖库。
3.4 首次启动和eula协议
第一次启动需要先接受Mojang的EULA协议。直接先跑一次:
cd /opt/mc java -Xmx2048M -Xms2048M -jar paper.jar nogui跑的过程中你会发现它很快停止,并提示你去看eula.txt。打开文件:
vi eula.txt把eula=false改成eula=true保存。这一步没有技术含量,但漏掉的人真不少。改完再启动,服务器就会正常生成server.properties、world目录等核心文件了。
3.5 核心配置参数全解析
server.properties是整个MC服务端的中枢配置,里面的每个参数都有实际影响。我只挑几个必调的讲,其他保持默认即可。
| 参数 | 建议值 | 说明 |
|---|---|---|
| server-port | 25565 | 游戏端口,云服务器安全组和系统防火墙都要放行 |
| max-players | 20 | 在线玩家上限,不建议超过内存和带宽承受范围 |
| view-distance | 6-8 | 视距,调大很吃CPU和带宽,小服建议6 |
| motd | 你的服务器名称 | 玩家列表里显示的服务器标语 |
| spawn-protection | 16 | 出生点保护范围,不开领地插件时可以调成0方便建筑 |
| difficulty | 2 | 难度:0和平、1简单、2普通、3困难 |
| online-mode | true | 正版验证。离线服改成false,但小心破解玩家捣乱 |
| enable-command-block | true | 想用命令方块就开,不然数据包玩法受限 |
配置文件改完建议重启一次服务端,确保所有参数都生效。这里有个经验:改配置文件之前一定要备份,比如cp server.properties server.properties.bak,MC的世界数据很宝贵,但配置写错导致启动失败的事我也见过不少。
3.6 编写启动脚本并用screen后台运行
我不建议每次都用一大段java命令启动服务器,时间长了谁都记不住具体参数。写一个start.sh脚本,统一管理:
vi start.sh填入以下内容:
#!/bin/bash cd /opt/mc java -Xms4G -Xmx4G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar paper.jar nogui这段参数是社区里非常知名的“Aikar's Flags”,专门为MC服务器调优的G1GC配置,核心思路是让垃圾回收更频繁但每次停顿时间更短,减少那种“突然卡一下”的现象。如果你内存只有8G,Xms和Xmx改成3G即可,千万别让系统内存全部被Java吃掉,系统本身最少要留2G给操作系统和数据库等进程。
然后赋予执行权限并启动:
chmod +x start.sh screen -S mc ./start.sh启动后会进入一个虚拟终端,能看到服务器日志。这时候按Ctrl+A然后按D键,就可以退出screen但服务器继续跑。以后想回到服务器控制台,就用screen -r mc,这是整个开服过程中最实用的命令之一。
3.7 防火墙和安全组设置
CentOS 7.9默认用firewalld管理防火墙。开放MC端口:
firewall-cmd --permanent --add-port=25565/tcp firewall-cmd --reload如果你用的是云服务器,还得去云控制台的安全组里同样放行TCP 25565端口。这两个地方缺一个都进不去游戏。我见过太多人配置完防火墙,忘了安全组,然后怀疑自己的服务端有问题,排查到最后发现只是没放行端口。
4. 进阶配置:计分板、常用指令与监控运维
4.1 玩家击杀数量计分板配置
MC原版本身就支持计分板功能,不需要额外插件就能统计击杀数。这是很多搞服务器活动的服主会用到的东西,我把它提前配置进去。
先进游戏或者服务器控制台执行以下命令:
scoreboard objectives add kills totalKillCount "击杀数"这条命令的意思是新建一个名为kills的计分项,统计类型是totalKillCount,也就是玩家全部击杀总数,包含PVE和PVP。然后在右侧边栏显示出来:
scoreboard objectives setdisplay sidebar kills执行完,所有在线玩家屏幕右侧就能看到实时击杀排行榜了。如果只想统计玩家对玩家的击杀,应该把统计类型换成playerKillCount。如果你用的是Paper服务端,还可以用插件做更复杂的计分板,比如按周重置、按击杀数发奖励,但原生计分板零依赖、稳定性最高,小服完全够用。想清空计分板数据,执行scoreboard objectives reset kills即可。计分板是存在世界存档里的,你重启服务器不会丢数据,这一点很省心。
4.2 MC服务端常用指令大全
原版指令是开服的必修课。最常用的几个:
/op 玩家名给予管理员权限/deop 玩家名取消管理员权限/gamemode survival|creative|spectator 玩家名切换游戏模式/give 玩家名 物品ID 数量发放物品/tp 玩家名 目标名传送/ban 玩家名 原因封禁玩家/kick 玩家名 原因踢出玩家/whitelist add 玩家名白名单加人/save-all强制保存世界/stop安全关闭服务器
但原版指令有个很尴尬的短板:没有/home、/tpa这种基础功能,玩家想要传送还得靠OP手动操作。所以插件服基本都会装EssentialsX插件。装好之后,玩家自己就能用/tpa、/home、/warp,管理员的负担能减轻一大半。这些“mc服务器插件一般指令”理解起来并不难,装EssentialsX之后它的默认配置已经够用,不需要过度改动,等玩家有需求再说。
4.3 用Zabbix监控MC服务器状态
服务器跑起来之后,你不能天天登录后台看日志。我建议装一个Zabbix agent,把系统指标和MC端口状态纳入监控。虽然Zabbix最新版安装对CentOS 7.9来说要处理一些依赖,但用官方源直接装agent的部分其实很简单:
rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-4.el7.noarch.rpm yum install -y zabbix-agent然后修改/etc/zabbix/zabbix_agentd.conf,填上你的Zabbix Server地址:
Server=你的监控服务器IP ServerActive=你的监控服务器IP Hostname=MC-Server-01启动agent:
systemctl enable zabbix-agent systemctl start zabbix-agent在Zabbix Server端添加主机后,你就可以设置触发器了。比如当Java进程内存使用率超过90%、TCP 25565端口断开连接、系统负载超过CPU核心数时自动告警。这一套配置对长期运营的服务器来说价值巨大,你不能总指望玩家卡掉线了再告诉你“服务器挂了”,主动监控才是正经运维手段。如果你觉得Zabbix太重,最小方案是写一个crontab定时任务每分钟探测一次25565端口,挂了就自动重启MC进程,但这种方式看不到趋势数据,出了问题不好复盘。
4.4 联机老掉线怎么治
“mc联机老掉线”这个问题的成因五花八门,但排在最前面的三个原因是:网络延迟太高、服务端卡顿、防火墙超时断开。
先做基础优化:修改系统的TCP keepalive参数,让服务器主动保持连接而不是等客户端超时:
sysctl -w net.ipv4.tcp_keepalive_time=120 sysctl -w net.ipv4.tcp_keepalive_intvl=30 sysctl -w net.ipv4.tcp_keepalive_probes=5然后把玩家数量控制在合理范围,view-distance别调太高,否则带宽一堵,所有人都会“Connection timed out”。如果你发现只有某些地区的玩家掉线,多半是线路问题,这种只能换更好的网络链路,服务器端能做的有限。
另一个比较隐蔽的原因:服务器的ulimit文件描述符限制太低。玩家连接也算文件描述符,如果系统默认1024,人数一多就拒绝新连接。建议调高:
echo "* soft nofile 65535" >> /etc/security/limits.conf echo "* hard nofile 65535" >> /etc/security/limits.conf改完需要重新登录SSH或重启服务器生效。我实测过,这个调整对连接数有明显的改善。你还可以看一下服务端的.yml配置文件里connection-throttle的值,默认4000毫秒,如果玩家频繁重新连接,把它调低到1000毫秒能减少“连不上”的错觉,不过这个参数的副作用是更容易被恶意频繁重连骚扰,小服建议保持默认。
4.5 自定义玩法:木棍防御系统这类数据包
你可能在网上见过“木棍防御系统mc”这种玩法,简单说就是用木棍点击特定方块触发防御机制。实现方式一般分两种:一种是直接用数据包做在world/datapacks目录下,纯原版命令实现,优点是不装插件就能跑;另一种是写插件,逻辑更灵活,但需要掌握Java开发。
数据包的方式很简单,把下载下来的数据包文件夹丢到服务器的/opt/mc/world/datapacks/目录,然后执行/reload,服务端就会自动加载。如果你自己会写函数,甚至可以定义“木棍右键发射箭矢”“木棍右键打开传送GUI”这些花活。我自己试过用数据包给服务器加自定义合成配方和小游戏,维护成本比插件低很多,而且版本升级时不容易崩。
5. 常见问题与排查技巧实录
5.1 版本错误:“mc阿尔法1.2.7错误版本”
这个报错我特别拿出来说,因为几乎每周都能在开服群里看到有人问。玩家客户端提示“阿尔法1.2.7错误版本”本质上是客户端与服务端的版本不一致,服务器认为客户端的协议版本太老或者太新。解决办法分两种:
- 如果两边版本差距不大,直接把客户端升级或降级到服务端一致即可。
- 如果服务器装的是Paper这类支持跨版本的插件核心,可以装ViaVersion插件,让旧版本客户端也能进新版服务器。比如1.20.4的服务端,装了ViaVersion之后,1.16、1.17、1.18、1.19的客户端都能进服,但1.12及以下的老版本客户端需要额外装ViaBackwards和ViaRewind,协议差距太大会出现方块显示错乱、刷不出怪这些怪问题。
我个人的建议:不要过度追求跨版本兼容,最好的体验永远是客户端跟服务端版本一致。跨版本插件适合那种必须照顾老玩家的公益服,新开的服不如直接用统一版本。
5.2 启动报错“Cannot allocate memory”
启动脚本报这个错,绝大多数情况是因为-Xmx设得太高,超出了物理内存。比如你机器只有4G内存,-Xmx4G加上系统本身占用,明显不够。我的建议是:物理内存8G的机器,Java堆最大给4G;物理内存16G的机器,Java堆最大给10-12G,留一些给系统页缓存和网络栈。另外要注意-Xms和-Xmx最好设成一样,让JVM启动时就一次性申请到位,避免运行中动态扩堆导致卡顿。如果整合包本身要求内存就高,比如某些大型整合包启动就提示“需要分配6G内存”,那只能升配置或精简模组,硬扛是没有用的。
5.3 进不了服:排查顺序很重要
玩家反馈“连不上服务器”,不要上来就重启服务端,按顺序排查:
- 先在服务器本机执行
ss -lnt,看25565端口有没有监听。 - 再执行
curl ifconfig.me确认公网IP。 - 然后检查系统防火墙
firewall-cmd --list-all。 - 最后检查云安全组有没有放行端口。
- 如果以上都对,用另一台电脑手动
telnet IP 25565测试连通性。
这个顺序能定位90%的“进不了服”问题。我自己踩过的坑是:装了两张虚拟网卡,公网IP绑定错误,导致玩家流量进了另一块网卡直接丢弃,最后用ip addr看清网卡再改绑才解决。
5.4 服务端卡顿、TPS下降
TPS(每秒游戏刻数)是MC服务器的健康指标,正常是20。如果你感觉服务器“一卡一卡”的,执行/tps或者用/paper timings分析。最常导致TPS骤降的原因:一是大型红石机器不停运算,二是有大量实体卡在某个角落,三是区块加载太频繁。我运营时遇到过一次严重卡顿,排查半天发现是某个玩家在地底下造了100个漏斗加100个箱子构成的刷物品装置,每次漏斗检测都拖慢整个服务端。解决办法是限定传送范围或者加插件限制单个区块的实体数量。平时也要定期执行/save-off再/save-on和重启服务端,给世界来一次“大扫除”。
5.5 crash-report看不懂怎么办
服务端崩溃后,目录下会出现crash-reports/文件夹和hs_err_pid*.log。很多小白一看英文日志就懵了。其实你不需要全部读懂,只需要搜几个关键词:java.lang.OutOfMemoryError代表内存不足;java.lang.NoSuchMethodError通常代表核心版本和插件不兼容;Caused by:后面跟着的部分往往是崩溃的直接根源。把Caused by:那一行复制到搜索引擎里,基本都能找到解决方案。还有一个技巧:在启动脚本里加上-Dlog4j2.formatMsgNoLookups=true这样的安全日志选项,能规避一部分日志注入类漏洞,也减少因为日志特性触发的诡异崩溃。
最后分享一点心得
我在CentOS 7.9上从原版服一路折腾到插件服,最大的体会是:MC开服不怕出问题,怕的是出问题之后瞎改。改任何配置之前先备份,做任何调整只动一个变量,测试无误再改下一个。很多时候服务器突然“变卡了”或者“启动失败”,回想一下你上次改了什么设置,大部分问题都能回溯到某一次操作上。还有一个习惯我强烈推荐:每次安装新插件或者新数据包之前,先在测试机或者本机开一个临时服试运行两天,确认没有爆内存、没有后台报错,再正式上线。很多人觉得麻烦,但等到正式服崩了再抢救,那才是真麻烦。毕竟对于玩家来说,一个稳定在线、不温不火的服务器,永远比一个天天维护、随时重启的服务器更值得留下。