☰
CentOS 7.9搭建Minecraft服务器完整指南:从环境配置到稳定运行
2026/10/13 10:48:54 网站建设 项目流程

上个月帮朋友在一台CentOS 7.9的服务器上开MC服,前前后后折腾了一周才算稳定下来。服务端本身其实不难跑起来,真正费时间的是环境准备、进程托管、备份、权限这些"外围工作"——网上教程要么太老,要么只丢命令不讲为什么,照着做完了还是一头雾水。这篇文章干脆把我从零到一的完整过程重写一遍,把每个关键选择的理由也讲清楚。目标读者就是手里恰好有一台CentOS 7.9机器、想开一个稳定MC服的人,不管是三五好友纯净生存,还是挂插件搞小社区,这套流程都能直接用。

1. 为什么选CentOS 7.9,以及动手前必须想清楚的三件事

1.1 先搞清楚你的服务器到底是什么定位

很多人开MC服失败,不是技术不行,是压根没想清楚这台机器要承担什么角色。

我这次帮朋友搭的服,定位很明确:8到10个熟人一起玩,以纯净生存为主,后续可能加几个轻量插件。这个定位决定了后面所有选型——不需要上大型模组包,不需要十八个世界的多服架构,一台4G内存的单机就绰绰有余。

先泼一盆冷水:如果你打算开那种几百人同时在线的社区服,CentOS 7.9单机方案从一开始就不合适,你需要的是分布式架构、数据库分离、多节点部署,那完全是另一个话题。这篇文章只解决中小型服务器的问题。

1.2 CentOS 7.9本身还能不能用

说句实在话,CentOS 7系列已经进入维护后期,官方源已经停止更新,默认的yum源需要切到vault镜像才能继续用。如果你手里是生产环境的机器,我建议迁移到替代发行版;但如果只是开MC服,系统层面的安全风险相对可控,而且你大概率不会把其他业务放在同一台机器上。

我的建议是:开服前先把yum源切到可用的镜像源,然后执行一次yum update -y,把能打的补丁都打上。之后这台机器就不要乱装其他东西了,专门跑MC服务。这是性价比最高的做法。

1.3 硬件配置的最低底线

MC服的性能瓶颈顺序是:内存 > 单核CPU性能 > 磁盘IO > 网速。

  • 内存:MC 1.20以上版本,服务端建议至少分配3G到4G,加上系统占用,物理内存8G起步比较舒服。4G内存的机器也能跑,但要严格控制玩家数量和视距。
  • CPU:MC服务端是典型的单线程重负载应用,主频越高越好,核心数反而不是关键。E5这种老服务器CPU主频低,跑MC反而容易被同配置的桌面CPU吊打。
  • 磁盘:能上SSD就上SSD,世界地图加载和区块加载对随机读写要求很高。机械硬盘跑MC,玩家跑图时服务器TPS会明显下滑。

动手之前先执行free -h和nproc看一眼机器资源,心里有个底再开始装东西。

2. 系统初始化和Java安装:这一步决定你能跑哪个MC版本

2.1 CentOS 7.9默认yum源的Java版本陷阱

CentOS 7.9默认yum源里只有OpenJDK 8,执行yum install java-1.8.0-openjdk装的也是Java 8。而Minecraft服务端的Java版本要求和玩家端完全不一样,这里是最容易踩坑的地方。

Java版本和MC版本的对应关系很简单:

MC服务端版本需要的Java版本
1.12及以下Java 8
1.13 - 1.16Java 8或更高
1.17 - 1.20.4Java 17
1.20.5及以上Java 21

如果你像我一样打算跑1.20左右的版本,那必须手动装Java 17。CentOS 7的yum源没有现成的OpenJDK 17包,只能用官方RPM或者解压版二进制。

2.2 安装Java 17的完整过程

我习惯用解压版,因为方便切换版本。Java 8和Java 17都留着,以后想开旧版本服随时能切回来。

# 先装默认的Java 8,部分老工具链还需要它 yum install -y java-1.8.0-openjdk-devel # 下载Java 17的Linux x64压缩包 cd /opt curl -L -o jdk17.tar.gz "https://api.adoptium.net/v3/binary/latest/17/ga/linux/x64/jdk/hotspot/normal/eclipse" # 解压并做软链接 tar xzf jdk17.tar.gz ln -s /opt/jdk-17* /opt/jdk17 # 注册到alternatives,让系统默认使用Java 17 update-alternatives --install /usr/bin/java java /opt/jdk17/bin/java 1 update-alternatives --install /usr/bin/javac javac /opt/jdk17/bin/javac 1 update-alternatives --config java # 验证版本 java -version

注意Adoptium的下载链接每次跳转的是最新17版构建号,所以解压后目录名是带版本号的,软链接ln -s /opt/jdk-17* /opt/jdk17用的是通配符,能自动匹配到实际目录。如果后面报错说找不到/opt/jdk17,多半是解压后目录名格式变了,ls /opt看一眼实际目录名改一下软链接就行。

2.3 目录规划和运行用户:拒绝root直接跑

这是我从一个老运维那学来的习惯:任何长期运行的服务都不要直接挂在root用户下跑。MC服一旦被入侵,root权限意味着整个机器沦陷。

# 创建独立用户和主目录 useradd -r -m -s /bin/bash mcserver # 创建服务目录 mkdir -p /opt/mc/server chown -R mcserver:mcserver /opt/mc # 用mcserver用户开始操作 su - mcserver

目录规划我建议固定为/opt/mc/server,所有服务端文件、插件、存档都放这里。不要把存档放到root家目录或者/tmp,一是权限混乱容易出问题,二是备份脚本写起来麻烦。

3. 服务端核心选型:原版、Paper还是Forge

3.1 不同服务端的本质区别

MC服务端有很多选择,但核心其实就针对一个问题:你是要原版体验、插件扩展,还是模组玩法?

服务端适用场景性能表现扩展方式
官方vanilla.jar纯净生存、人数少一般无
Spigot老牌插件端尚可Bukkit插件
Paper插件端首选好Bukkit/Paper插件
Fabric轻量模组好Fabric模组
Forge大型模组包偏差Forge模组

我的选择是Paper。原因很简单:兼容绝大多数Bukkit插件,性能优化做得比原版好很多,同时保持了原版玩法的感觉。Paper官方对自己的定位就是"提高性能、修复漏洞、保持兼容",实测下来同样的机器和视距,TPS确实比原版稳定。

如果你要玩的是大型模组包(比如各种整合包),那必须用Forge或Fabric,这时候插件那套就不适用了。本文后面的配置以Paper为例,但大部分内容对原版和Spigot同样有效。

3.2 下载Paper并校验完整性

去Paper官网的下载页面选择对应MC版本的构建包。注意Paper每个版本有多个build号,选最新的稳定build就行。

# 以1.20.4为例,实际下载链接以官网为准 cd /opt/mc/server curl -o paper.jar "https://api.papermc.io/v2/projects/paper/versions/1.20.4/builds/496/downloads/paper-1.20.4-496.jar" # 下载完先看文件大小,再对比官网的SHA256校验值 sha256sum paper.jar

校验这一步很多人跳过,但Paper的下载页会同时给出当前构建的SHA256,养成对比校验值的习惯能避免下载到损坏文件。之前我在某个镜像站下过一次过期的paper.jar,启动直接报内部错误,排查半天才发现是包的问题。

4. 首次启动和server.properties逐项拆解

4.1 eula.txt:新手翻车的第一个坑

第一次启动服务端会直接闪退,原因是MC要求你同意最终用户协议,服务端目录下会生成一个eula.txt文件。把里面的eula=false改成eula=true,然后重新启动。

# 首次启动 java -Xms1G -Xmx1G -jar paper.jar nogui # 修改eula sed -i 's/eula=false/eula=true/' eula.txt

这里顺便解释一下nogui参数:服务端默认会在有图形界面的环境里弹窗,纯命令行服务器必须加nogui,不然会启动失败。

4.2 server.properties关键配置项

服务端启动后会生成server.properties,这个文件几乎决定了服务器的所有基础行为。我用vim改完后是下面这样的核心配置:

server-port=25565 server-ip= online-mode=true max-players=20 view-distance=10 simulation-distance=8 spawn-protection=0 enable-command-block=true white-list=true motd=欢迎来到我们的MC服务器 difficulty=normal gamemode=survival pvp=true

逐个说下为什么这么配:

  • server-ip保持空,监听所有网卡。如果填了内网IP,外网玩家就进不来了;填了公网IP在某些NAT环境下反而有问题。默认空值最省心。
  • online-mode=true开启正版验证。打算开私服、只想让熟人玩的话,强烈建议配合下面white-list=true白名单。正版验证防止别人拿盗版客户端随便进你的服。
  • view-distance=10是客户端能加载的地图距离,simulation-distance=8是服务器真正模拟游戏逻辑的范围。这两个值是性能的大头,调到12以上对CPU和内存压力会明显增加。8到10是比较平衡的区间。
  • spawn-protection=0关闭出生点保护。很多服务器出生点圈了一块地别人动不了,如果你不是特别在意出生点安全,设成0免得玩家互相干扰。
  • white-list=true开白名单。这是私服防熊孩子最关键的一道闸门,配合whitelist add 玩家名命令使用。

4.3 JVM启动参数:内存怎么分才不浪费

服务端的启动命令看着简单,但JVM参数配不配好,直接决定服务器能稳多久。我的启动参数如下:

java -Xms4G -Xmx4G \ -XX:+UseG1GC \ -XX:+ParallelRefProcEnabled \ -XX:MaxGCPauseMillis=200 \ -XX:+UnlockExperimentalVMOptions \ -XX:+DisableExplicitGC \ -XX:+AlwaysPreTouch \ -XX:MaxTenuringThreshold=1 \ -XX:SurvivorRatio=32 \ -jar paper.jar nogui

核心思路就两点:

  1. -Xms和-Xmx一致。有些人习惯-Xms1G -Xmx4G,想让JVM按需扩容,但MC服在扩容瞬间会有明显的卡顿,实测一致性设置对TPS更友好。
  2. 用G1GC垃圾收集器。MC服务端会产生大量短生命周期对象,G1GC在多核机器上比默认的Parallel GC表现更好,停顿更短。

内存分配别贪心。物理内存8G的机器,给JVM分4G,留4G给操作系统做文件缓存和IO缓冲,反而更流畅。分到6G以上,系统内存吃紧开始用swap交换,那才是真正的死局。

5. 用systemd托管MC进程:开机自启、崩溃重启、自动备份

5.1 创建systemd服务文件

很多人开MC服都是手动敲java -jar,窗口一关服务器就没了,机器重启还得重新拉起来。用systemd托管,所有问题一次解决。

sudo vim /etc/systemd/system/mcserver.service

内容如下:

[Unit] Description=Minecraft Paper Server After=network.target [Service] User=mcserver Group=mcserver WorkingDirectory=/opt/mc/server ExecStart=/usr/bin/java -Xms4G -Xmx4G -XX:+UseG1GC -jar paper.jar nogui Restart=on-failure RestartSec=10 TimeoutStopSec=30 KillSignal=SIGINT [Install] WantedBy=multi-user.target

几个关键点:

  • User=mcserver保证服务以独立用户身份运行,不碰root。
  • Restart=on-failure让服务崩溃后自动拉起,但注意要配合RestartSec=10,避免频繁崩溃导致无限重启循环。
  • KillSignal=SIGINT很重要。systemd默认停服务是发SIGTERM,但MC服务端收到SIGTERM会直接强制终止,可能导致存档损坏。改成SIGINT就等价于在控制台执行了stop命令,会触发正常的存档保存流程。

启动并设置开机自启:

sudo systemctl daemon-reload sudo systemctl enable --now mcserver systemctl status mcserver

5.2 日常管理命令

# 看服务状态和最近日志 systemctl status mcserver journalctl -u mcserver -f # 重启服务 sudo systemctl restart mcserver # 完全停止 sudo systemctl stop mcserver

journalctl -u mcserver -f相当于实时看服务端控制台输出,玩家报错、插件报错都能在这里看到,比整天守着游戏客户端强多了。

5.3 定时备份:服务器可以崩,存档不能丢

MC服的存档是最宝贵的东西,一个熊孩子点燃一块林地,没有备份你就只能拍大腿。我在cron里放了一个备份脚本,每天凌晨3点自动执行。

# /usr/local/bin/mc_backup.sh #!/bin/bash # 先把当前世界写入磁盘 sudo systemctl stop mcserver sleep 3 # 打包存档 BACKUP_DIR=/backup/mc WORLD_DIR=/opt/mc/server/world DATE=$(date +%Y%m%d_%H%M%S) mkdir -p "$BACKUP_DIR" tar czf "$BACKUP_DIR/world_$DATE.tar.gz" -C /opt/mc/server world # 重新启动服务 sudo systemctl start mcserver # 只保留最近7天的备份 find "$BACKUP_DIR" -name "world_*.tar.gz" -mtime +7 -delete
# 加入crontab crontab -e # 每天3点执行 0 3 * * * /usr/local/bin/mc_backup.sh

这个脚本的思路是"停机备份最稳妥"。对于小服务器来说,每天一次凌晨3点的短暂停机完全没影响,但换来的存档安全是实打实的。如果你不想停机,可以用RCON工具远程执行save-all之后再做热备份,但复杂度会高不少,小服没必要。

6. 插件安装与LuckPerms权限配置

6.1 插件安装其实只有三件事

Paper服加插件,流程非常简单:把插件jar包放到/opt/mc/server/plugins目录,重启服务器。但实际使用时要注意三件事:

  1. 插件依赖关系。很多插件不是独立的,比如经济系统通常需要Vault,PlaceholderAPI被一大堆插件依赖。装之前去插件页面看清楚它依赖什么,缺了依赖插件会加载失败。
  2. 版本匹配。Paper版本分得很细,1.19的插件未必能在1.20上跑。插件的构建页面一般会标明支持的MC版本,别想当然。
  3. 配置目录。首次加载插件后,plugins目录下会生成对应的配置文件夹,改配置后热加载不一定生效,直接重启最省事。

我这次装的不多,EssentialsX管基础指令,LuckPerms管权限,WorldEdit和WorldGuard管建筑和领地保护,CoreProtect做方块操作日志。对熟人小服来说,这几件足够覆盖大部分需求了。

6.2 LuckPerms快速配置思路

LuckPerms是目前最主流的权限插件,但新手往往被它的概念绕晕。其实核心就两个概念:用户和组。用户是玩家,组是一组权限的集合。

我的配置思路分三步:

  1. 先建组:/lp creategroup builder
  2. 给组加权限:/lp group builder permission set essentials.fly
  3. 把玩家放进组:/lp user 玩家名 parent set builder

还有一个容易忽略的点:default组是每个玩家默认加入的组,给所有玩家发基础权限就加在这个组里。比如让所有玩家都能用回家指令,就用/lp group default permission set essentials.home。

别一上来就op 自己。OP权限绕过所有插件权限检查,一旦不小心给别人OP,服务器就彻底失控了。权限管理宁可先收紧再放开,也别图省事全给OP。

7. 服务器变卡了怎么办:TPS、mspt与profiler排查思路

7.1 先量化问题,再谈优化

服务器卡顿很多时候是"感觉卡",但说不清是网络卡还是服务端卡。你得先量化才能定位。

Paper服务端在游戏内执行:

  • /tps:查看服务器20秒内的TPS。TPS是每秒游戏刻数,正常是20.0,低于18就说明服务端在持续吃紧。
  • /mspt:查看每个游戏刻的平均运算毫秒数。Paper 1.18以后才有这个指令,数值在50以下表示每一刻计算能在50毫秒内完成,服务器很健康;长期超过200就得处理了。

如果TPS正常,但玩家感觉动作延迟,那问题多半在网络链路,而不是服务端,排查方向就完全不同。这一步能帮你少走无数弯路。

7.2 六个最常见的卡顿原因

根据我的排查经验,小服务器的卡顿原因集中在下面几类:

  1. 视距太高。view-distance调得越高,每个玩家周围的区块计算量越大。8到10已经是很宽裕的设置,追求极致流畅可以降到6。
  2. 实体堆积。小动物圈养区、刷怪塔里几百上千个实体会把CPU吃满。用/spark profiler抓一段性能数据,能直接看到哪个区块、哪些实体占了最多计算时间。
  3. 红石机器。高频红石装置(比如大型刷物品机)是卡顿大户。服务器主线程的大量时间都耗在红石逻辑更新上,如果你不想限制红石,就只能祈祷机器别太疯狂。
  4. 区块生成。玩家快速跑图时,服务端需要实时生成新区块,非常吃CPU。遇到这种情况,等区块生成完,或使用预生成世界地图插件,能大幅改善。
  5. 内存分配不足。观察journalctl里有没有频繁的老年代GC日志,如果有,说明堆内存不够,适当调高-Xmx,但前提是物理内存还剩足够。
  6. 磁盘IO瓶颈。机械硬盘在存档写入和区块加载时拖后腿,查看iostat确认磁盘繁忙度,如果一直很高,换SSD是唯一解。

Spark这个工具我强烈推荐安装。它是一个性能分析插件,遇到卡顿只需要在游戏内执行/spark profiler,等几分钟再/spark profiler --stop,它会生成一份在线分析报告,详细到每个区块、每个实体的耗时。比靠猜强一百倍。

8. 安全加固与上线前检查清单

8.1 防火墙只放行必要端口

CentOS 7.9默认用firewalld。配置只需要放行MC端口,其他的一律不开。

sudo systemctl start firewalld sudo systemctl enable firewalld sudo firewall-cmd --permanent --add-port=25565/tcp sudo firewall-cmd --reload firewall-cmd --list-all

如果你用的是云服务商的机器,别忘了同时去控制台的安全组规则里放行端口。这是个非常隐蔽的坑:本地防火墙开了,云厂商安全组没放行,外网照样连不进来。反过来也一样,两边都得放行。

8.2 文件权限和SELinux

确认服务端目录的所有权是mcserver用户:

sudo chown -R mcserver:mcserver /opt/mc

另外CentOS 7默认SELinux是Enforcing模式,如果服务启动时报权限错误但文件权限看起来没问题,多半是SELinux上下文的问题。检查办法是getenforce看状态。对于MC服这种场景,我的处理是只对服务目录调整上下文,而不是无脑关闭SELinux。

8.3 上线前最后过一遍清单

每次开服前,我会在终端里依次确认这些项,全部通过才把地址发给朋友:

  • systemctl status mcserver:服务正常运行。
  • firewall-cmd --list-all:25565端口已放行。
  • java -version:确认当前Java版本符合服务端要求。
  • free -h:内存还有富余,没有swap占用异常。
  • 游戏内/tps:TPS稳定在20。
  • 白名单和权限组:确认自己和朋友都在default组或不低于基础权限。
  • 备份脚本:手动执行一次,确认tar包能正常生成并落盘。

最后分享一个个人习惯:把服务端版本、Java版本、启动参数、常用命令、每次改过的配置项都记在一个markdown笔记里,放在/opt/mc/README.md。服务器可能几个月不碰,下次要维护时翻笔记比翻记忆靠谱得多。这台CentOS 7.9上的MC服现在稳定跑了四十多天,中间只有一次因为云厂商维护触发重启,系统d托管自动把服务拉起来了,存档完好。这套方案不算花哨,但足够稳,至少对一个朋友小服来说,它比频繁折腾更值得。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询