一个周末的下午,我对着电脑屏幕上的“连接超时”发呆,然后决定不再等别人开服,干脆自己动手在云服务器上搭一个 Minecraft 1.14.4 的服务端。那台机器是某云平台的最低配学生机,系统是 CentOS 7,面板用的是宝塔(BT-Panel)。从完全不知道怎么改服务端配置,到最后朋友顺利进服联机,整个过程踩了不少坑,也积累了一套比较完整的搭建流程。这篇东西就把我当时的操作和思考完整写出来,给想自己开服的人参考。
先说清楚这个项目要解决的问题:不依赖任何现成的开服平台,在“一台干干净净的云主机”上,从零部署一个原版 Minecraft 1.14.4 的 Java 版服务端,让局域网之外的朋友通过公网 IP 直接加入游戏。之所以选 1.14.4,是因为这个版本在模组兼容性和原版体验之间相对平衡,很多整合包的底子都是它,而且服务端对硬件要求不算离谱,适合入门。
我适合谁来参考这件事,说得很直接:哪怕你完全没碰过 Linux,只要会照着控制台敲命令,这篇文章都能带你走一遍。我当时的水平也就是能按教程装软件、看日志找报错而已。真正难的不是某一条命令,而是不知道“下一步该干什么、为什么这样干”。所以文中除了命令,还会解释我为什么这么选、那些配置项到底影响什么。
1. 项目整体设计与选型思路
1.1 先搞清楚服务端是怎么跑起来的
Minecraft 服务端本质上是一个跑在 JVM(Java 虚拟机)上的 Java 程序。玩家客户端连接过来之后,服务端负责计算区块、实体 AI、方块更新、玩家交互逻辑,然后把结果同步给所有在线客户端。所以你做的所有事情,其实都是在为这个 Java 进程准备一个“合适的运行环境”。
这个逻辑决定了整个搭建路径:操作系统装好 -> 装 Java 运行环境 -> 下载服务端核心文件 -> 修改配置 -> 启动进程 -> 放行网络端口 -> 客户端连接。每一步都是在给后面的步骤打基础。我当时把这条链想清楚之后,整个操作就顺畅多了,不会再东一下西一下。
1.2 为什么选 CentOS 7 + 宝塔面板
选 CentOS 7,主要是因为它的资料最多。1.14.4 发布那年,网上教程、论坛提问、博客文章大量使用 CentOS 7 作为示例系统。如果你遇到问题,用浏览器搜报错信息,十有八九能找到别人在 CentOS 7 上的提问和解决方案。云平台一般也都提供这个系统镜像,选择成本几乎为零。
宝塔面板的作用,是给“只看命令行就头大”的人提供一个网页控制台。它可以可视化地管理文件、放行端口、计划任务备份、查看 CPU 和内存占用。我不需要记住一堆 Linux 命令就能完成一部分运维工作,对于从 Windows 环境转过来的新手来说,这个过渡非常重要。
这里我要多说一句:面板只是一个辅助工具,不等于你就不用懂原理了。就算用宝塔,你依然需要知道 Java 装在哪、服务端文件放在哪个目录、端口是多少。面板能帮你省掉一部分手工操作,但不能替你理解服务端的行为。
1.3 1.14.4 版本为什么要用 Java 8 而不是更高版本
Minecraft 服务端的运行和 Java 版本直接绑定。1.14.4 这个版本的服务端核心官方要求 Java 8,不建议直接用 Java 11 或更高版本运行。原因是旧版本服务端在加载某些类库时,依赖 Java 8 内部的一些特定行为和包结构,在新的 JVM 版本上可能出现兼容性警告,严重时直接启动失败或者区块加载异常。
我在实际操作中,一开始图省事装了 OpenJDK 11,结果服务端启动时报了一堆 Illegal reflective access 相关警告,虽然勉强能开,但心里不踏实。后来换成 OpenJDK 8,日志干净很多。所以这个选择不是玄学,是切实的兼容性要求。
2. 云主机购买与基础环境准备
2.1 主机配置怎么选才够用
先给一个最基础的配置参考:单核 CPU / 2GB 内存 / 40GB 系统盘 / 按量付费带宽。这个配置能带起来 3 到 5 个玩家在 1.14.4 原版服务端下玩,不跑大型红石机器、不加载太多模组的时候,流畅度还能接受。
如果预算许可,我更推荐 2核 / 4GB 内存。这个规格下,服务端可以顺畅跑更多实体和区块,玩家数量往上拉一拉,体验提升明显。Minecraft 服务端对单核性能更敏感,因为主逻辑线程要承担大量计算,所以单核主频高的 CPU 比多核低主频的更适合开服。
磁盘方面,建议至少 40GB。服务端本身不大,但地图文件会持续膨胀,再加上日志和备份,40GB 能给你留出缓冲。如果跑整合包模组服,建议直接上更高容量。
2.2 系统选择与初始化设置
在云平台购买页面选择系统镜像时,选 CentOS 7.x 的 64 位版本即可。新购服务器通常要设置 root 密码或者创建密钥对。如果你第一次使用云服务器,建议直接用 root 密码登录,后面熟练了再考虑密钥登录。
购买完成后,云平台会分配一个公网 IP,这个 IP 就是玩家连接服务器的地址。记下这个 IP,后面配置和测试都要用。同时,阿里云控制台的“安全组”功能默认会挡掉外部访问,需要在安全组规则里放行端口,这部分我在第 7 节详细说。
2.3 用终端连接服务器并做基础检查
Windows 用户可以直接用系统自带的终端工具或者第三方工具连接服务器。连接命令非常简单:
ssh root@你的公网IP输入 root 密码后就进入系统了。第一次登录建议先做两件事:更新系统软件包,检查当前系统版本。
yum update -y cat /etc/redhat-release更新软件包的目的是修复已知安全漏洞和软件缺陷,服务端运行在公网上,必要的系统更新不要省。执行 cat 命令后应看到类似 CentOS Linux release 7.9.2009 (Core) 的提示,说明系统正常。
到这里,一个干净的基础环境就绪了。接下来我会在上面安装宝塔面板。
3. 宝塔面板安装与基础配置
3.1 宝塔面板的作用边界
宝塔面板本身不参与 Minecraft 服务端的运行,它帮你做的事主要有三块:文件管理、端口放行、进程监控。文件管理可以让我在网页上直接编辑 server.properties 等配置文件,不用在命令行里折腾 vim;端口放行可以可视化添加防火墙规则;进程监控可以让我随时看到 Java 进程的 CPU 和内存占用。
不过要注意,宝塔面板中的“软件商店”可以一键安装 Java,但我更推荐在命令行手动安装。原因有两个:第一,宝塔的软件源和我手动指定版本的安装方式可能不同,导致版本差异;第二,Minecraft 服务端对 Java 版本敏感,我需要确定具体装的是哪个版本,手动安装更可控。
3.2 安装宝塔面板的具体步骤
登录服务器后,执行宝塔官方提供的安装脚本。不同版本面板的安装命令可能变化,当前稳定版的安装方式是:
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && bash install.sh安装过程会持续几分钟,结束后终端会输出一个面板管理地址、初始账号和初始密码。这个地址形如http://公网IP:8888/xxxxxx,请把这段信息保存好,后面登录面板要用。
这里有一个非常容易踩的坑:面板安装完成后,你可能第一时间用浏览器访问管理地址,但会打不开页面。原因通常是云安全组没有放行 8888 端口。如果你在访问面板这一步卡住,先去云平台控制台的安全组里添加一条放行 8888 端口的规则,再刷新浏览器。
3.3 面板基础安全设置
登录面板后,第一件事不要急着装软件,而是先改面板设置。我强烈建议做以下几项调整:
- 修改面板默认端口,不要用默认的 8888。改成一个高位端口,比如 28888,降低被自动化脚本扫描的概率。
- 修改面板账号和密码,别用初始密码。
- 绑定一个安全入口,入口是一个自定义字符串,访问面板地址时会要求输入,相当于第二道门槛。
这些操作在宝塔面板的“面板设置”页面里都能完成。很多人嫌麻烦跳过这一步,结果服务器被扫到面板端口,暴力破解失败的日志刷了一堆。我自己的机器就遇到过,所以这一节请你不要省。
4. Java 环境部署与验证
4.1 用 yum 安装 OpenJDK 8
CentOS 7 自带的 yum 源可以直接安装 Java 8。执行下面的命令:
yum install -y java-1.8.0-openjdk这个包是 OpenJDK 8 的官方发行版,不包含图形界面等无关组件,对服务器来说很干净。安装完成后,验证一下版本:
java -version正常会输出类似openjdk version "1.8.0_xxx"的信息。看到这个输出,说明 Java 已经可以使用。
4.2 确认 JAVA_HOME 环境变量
有些程序启动脚本会读取 JAVA_HOME 环境变量来定位 Java 安装位置。Minecraft 服务端常用的启动方式不一定依赖这个变量,但为了后面顺利,建议配置上。
先找到 Java 的安装路径:
readlink -f $(which java)一般会输出/usr/lib/jvm/java-1.8.0-openjdk-xxx之类的结果。把这个路径写入/etc/profile:
echo 'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-xxx' >> /etc/profile echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile source /etc/profile然后再次执行java -version,确认命令依然有效。
4.3 安装 Java 时容易出现的版本混乱问题
如果你之前试过装其他版本的 Java,或者系统里残留有多个 JDK,yum 安装的时候可能会覆盖或混淆。遇到这种情况,可以用下面这个命令查看当前默认的 Java 版本:
update-alternatives --config java这个命令能列出所有已安装的 Java 版本,让你手动切换到 Java 8。请确保选中的是 1.8 对应的路径。我就在这一步吃过亏:以为装了 Java 8,结果默认的还是旧版本,服务端启动报了一堆类版本错误。所以建议安装后一定亲自看版本输出,不要想当然。
5. Minecraft 服务端文件下载与部署
5.1 获取 1.14.4 服务端核心文件
Minecraft 官方服务端核心文件可以从官方启动器下载页面获取,也可以使用官方提供的直接下载链接。但官网指路比较绕,我直接分享一个稳妥思路:云服务器上用 wget 下载服务端 jar 包,文件名类似minecraft_server.1.14.4.jar。
mkdir -p /opt/minecraft && cd /opt/minecraft wget https://launcher.mojang.com/v1/objects/xxx/minecraft_server.1.14.4.jar下载完成后,用ls -lh检查文件大小,1.14.4 原版服务端 jar 包大约在 60 MB 左右。如果大小明显不对,说明下载不完整,建议删除重新下载。
你从官方渠道获取服务端文件是合法的,不用担心许可问题。这个 jar 文件就是服务端程序本身,不需要再额外安装别的运行时。
5.2 创建数据目录并规划文件结构
服务器上通常会划分专门的目录来存放游戏数据,这样方便备份和迁移。我的目录结构是这样规划的:
/opt/minecraft/ ├── minecraft_server.1.14.4.jar # 服务端核心程序 ├── eula.txt # 首次启动后生成 ├── server.properties # 服务器配置文件 ├── ops.json # 管理员列表 ├── whitelist.json # 白名单列表 ├── world/ # 地图数据目录 ├── logs/ # 日志目录 └── start.sh # 自定义启动脚本注意这些文件里,有些是首次启动后才自动生成的,比如 eula.txt 和 world 目录。你先创建目录,再把 jar 包放进去,就能开始首次启动。
5.3 首次启动与 EULA 协议确认
Minecraft 服务端第一次启动时不会直接运行游戏,而是生成一个eula.txt文件,内容里要求你同意最终用户许可协议(EULA)。不修改这个文件、直接保持默认 false,服务端会立刻停止运行,日志里出现You need to agree to the EULA的提示。
操作方法是先启动一次:
cd /opt/minecraft java -Xmx1024M -Xms1024M -jar minecraft_server.1.14.4.jar nogui执行后命令会退出,目录里新增了 eula.txt。用宝塔面板的文件管理或者命令行修改eula.txt,把eula=false改成eula=true,保存。这一步在几乎所有教程里都会被提到,但新手经常卡在这里,原因就是不知道有这个许可文件的存在。
6. 核心配置文件与启动脚本优化
6.1 server.properties 关键配置项解读
服务端启动后会在根目录生成server.properties,这是整个服务端最重要的配置文件。我把我实际用到的关键项列出来,并说明它们的含义:
| 配置项 | 我的推荐值 | 说明 |
|---|---|---|
| server-port | 25565 | 服务端监听端口,客户端默认连接这个端口 |
| online-mode | true | 是否开启正版验证。正版玩家建议开启,离线服必须设为 false |
| white-list | false | 是否开启白名单。熟人服建议设为 true |
| max-players | 10 | 服务端允许的最大玩家数量 |
| view-distance | 8 | 服务端发送给玩家的区块视距,数值越大带宽和 CPU 占用越高 |
| spawn-protection | 16 | 出生点保护半径,范围内只有管理员能修改方块 |
| level-type | default | 世界类型,默认即可 |
| motd | A Minecraft Server | 服务器信息栏显示的描述文字,可以改成自己的说明 |
我特别想说说online-mode这个配置项。如果你和朋友都用正版账号,那保持 true 就好;如果是启动器离线登录的客户端,必须改成 false,否则客户端会被服务端拒绝连接。这个选项在网络上有大量讨论,改错导致的后果是“你看着服务器没崩,但客户端就是进不去”,排查起来很绕弯。
6.2 管理员与白名单设置
管理员的设置方式有两种:一种是服务端启动后,在控制台直接输入op 玩家名;另一种是直接编辑ops.json文件。我习惯用前者,因为控制台操作实时生效,而且在面板中可以启动服务端时看到交互界面。
如果你开了 white-list,还要同步维护whitelist.json文件。最省事的方法是先关掉白名单让朋友进一次服,然后控制台输入whitelist add 玩家名,再开启白名单。这样你的白名单列表不会遗漏拼写错误。
6.3 编写一键启动脚本
每次登录服务器手动输入一整串 java 命令很容易出错。我写了一个start.sh脚本来处理启动过程:
#!/bin/bash cd /opt/minecraft java -Xmx2048M -Xms1024M -jar minecraft_server.1.14.4.jar nogui设置脚本可执行权限:
chmod +x /opt/minecraft/start.sh之后每次启动只需要执行bash /opt/minecraft/start.sh。如果你想关闭服务端,不要在面板里直接杀进程,应该在服务端控制台里输入stop,让服务端把地图数据完整保存后优雅退出。直接杀进程可能导致地图区块损坏。
6.4 内存参数调整经验
-Xmx是最大堆内存,-Xms是初始堆内存。对于一台 2GB 内存的云主机,我推荐-Xmx1536M -Xms1024M,预留一部分内存给操作系统和面板使用。设置成 2048M 虽然能撑起更多玩家,但系统内存一旦耗尽,整个机器会陷入极端卡顿,严重时 SSH 连接都会出问题。
4GB 内存的机器,则可以直接用-Xmx3072M -Xms2048M。注意-Xmx的值不要超过物理内存的一半以上,除非你清楚知道系统还会被谁占用内存。Minecraft 服务端内存溢出时不会像普通程序那样提示清晰,更多时候是表现为玩家掉线、区块加载异常、进程被系统杀掉。我建议配置好之后用宝塔面板观察一段时间的趋势图。
7. 端口放行、安全组与公网连接
7.1 云平台安全组规则配置
这是整个流程中“最不起眼但卡住最多人”的一步。很多玩家服务端明明已经在本地跑起来了,朋友却连不上,问题几乎都出在这里。
登录云平台控制台,找到“安全组”或“防火墙”功能。添加一条入方向规则,协议类型选择 TCP,端口填写25565,授权对象可以设置为0.0.0.0/0(表示允许所有 IP 访问)。如果只想开放给固定 IP 的朋友,可以把授权对象改成他们各自的公网 IP,安全系数更高。
同时要确保你修改的是“入方向”规则,而不是“出方向”。搞反规则,从服务器上访问外部没问题,但外部访问服务器仍然被挡。
7.2 宝塔面板防火墙放行
云安全组放行之后,宝塔面板还有一道防火墙。如果你前面已经通过面板给 8888 端口放行过,那 25565 同样需要在面板的“安全”页面里放行。
操作方法:宝塔面板 -> 安全 -> 添加端口规则 -> TCP -> 25565 -> 保存。如果面板里显示防火墙没有开启,也建议放行一次,因为有多种防火墙环境可能同时存在。
7.3 系统防火墙命令操作
除了面板和云安全组,CentOS 7 自带的 firewalld 也可能会拦端口。检查一下当前状态:
systemctl status firewalld如果服务在运行中,执行:
firewall-cmd --zone=public --add-port=25565/tcp --permanent firewall-cmd --reload这样端口就加入到系统防火墙白名单了。三层放行(云安全组、面板、系统防火墙)都确认之后,公网连接才真正畅通。
7.4 从客户端验证连接
到这一步,你可以打开自己电脑上的 Minecraft 客户端(版本同样选择 1.14.4),在服务器地址栏输入公网IP:25565,点击加入服务器。如果进度条正常加载并进入世界,说明整个链路已经打通。
如果连接超时,按顺序排查:先看服务端控制台日志有没有新连接记录,再看云平台安全组是否放行,接着看宝塔端口规则,最后看系统防火墙。绝大多数情况是这三层中某一层漏了规则,按这个顺序检查效率最高。
8. 常见问题与排查技巧实录
8.1 客户端提示“连接超时”或“无法连接服务器”
这个问题我遇到最多,几乎每个新开服的人都绕不开。你可以在服务器上用下面这个命令测试服务端是否在监听端口:
netstat -tlnp | grep 25565如果没有输出,说明服务端没有启动成功或没有绑定该端口。如果有输出,说明监听正常,问题出在网络放行层面。按第 7 节的三层顺序检查即可。
还有一个容易遗漏的点:云平台安全组规则在修改后通常立即生效,但本地电脑的 DNS 缓存或网络环境有时会延迟,建议换一个 4G/5G 热点测试连接,排除本地网络问题。
8.2 服务端启动报错 Java 类版本问题
如果日志里出现类似UnsupportedClassVersionError的报错,说明 Java 版本和服务端要求不匹配。1.14.4 需要 Java 8,而你当前系统默认的 Java 版本可能是更高版本。按第 4.3 节的方法用update-alternatives切换到 Java 8 再启动。
这个报错的特点是一出现服务端进程立即退出,不会给你太多反应时间。所以排错时第一件事就是验证 Java 版本,确认无误后再看其他配置。
8.3 服务端启动后频繁崩溃或自动退出
这种情况要先看崩溃日志的尾部信息。常见原因有三个:内存分配不足、配置文件格式错误、端口被占用。
内存不足时,JVM 通常会抛出OutOfMemoryError或直接被系统 kill。你可以把-Xmx调低一些,给系统留足空闲内存,而不是盲目加高。配置文件格式错误通常是因为server.properties里的某个值含有非法字符,用宝塔面板打开文件检查是否有多余空格或中文字符。端口占用则可能是你已经启动过服务端,但没有彻底关闭进程,用netstat -tlnp | grep 25565查看占用情况。
8.4 玩家连接后延迟极高或频繁卡顿
服务器在公网上,影响延迟的因素很多。首先看你选择的机房线路和玩家所在地理位置之间的距离,跨国连接延迟高是客观事实。其次看服务器带宽,如果购买的是 1Mbps 低带宽,几个人同时在线就会出现明显卡顿,此时升级带宽比升级 CPU 更有效。
服务端本身的view-distance参数也会影响带宽占用。把视距从 10 降到 6,能显著减少服务端向玩家同步区块的数据量,人多的场景下流畅度提升明显。实测下来,8 左右是比较平衡的点。
8.5 服务端进程意外退出,怎么实现自动重启
云主机重启或服务端崩溃后,手动重新登录启动很麻烦。我用了宝塔面板的“计划任务”功能,设置一个每分钟执行一次的检查任务。脚本逻辑很简单:如果服务端进程不存在,就重新启动。
脚本内容大致是这样:
if ! pgrep -f "minecraft_server.1.14.4.jar" > /dev/null; then cd /opt/minecraft && bash start.sh >> /opt/minecraft/auto_restart.log 2>&1 fi把这段脚本放在/opt/minecraft/auto_restart.sh,然后在宝塔面板里添加计划任务,选择 shell 脚本,时间间隔设为每分钟,执行这个文件。这样即使服务端崩溃,最多一分钟内就能自动拉起来。
这里有一个副作用我要提前说清楚:如果服务端因为地图损坏或配置错误频繁崩溃,自动重启会形成“崩溃-重启-崩溃”的循环,反而刷大量日志。所以自动重启脚本要在服务端稳定运行后再启用,出问题时应先停掉脚本排查原因。
9. 运营阶段的安全备份与扩展思考
9.1 定时备份地图数据
Minecraft 服务端的地图数据一旦丢失,玩家长期积累的建筑就全没了。手工备份很不可靠,建议用宝塔面板的“计划任务”做定时打包。
备份命令可以简化为:
cd /opt/minecraft && tar -czf /backups/world_$(date +\%Y\%m\%d_\%H\%M\%S).tar.gz world然后把/backups目录里的备份文件通过宝塔的“文件管理”定期下载到本地,或者直接同步到对象存储。对于小规模服务器,每天备份一次已经足够。
9.2 操作系统与面板的安全注意事项
公网环境里,服务器时刻被扫描是常态。我之前提到过修改面板端口和密码,这里再补充几条:禁止 root 密码登录,改用密钥方式;定期查看面板日志有没有异常失败记录;关闭不用的服务端口。这些操作听起来基础,但大部分开服事故都源于安全设置没做全,而不是 Minecraft 服务端本身有问题。
另外,不要把你的云服务器 root 密码、面板登录地址、公网 IP 随便发到社交平台。如果有朋友需要连接,只发游戏服务器的公网 IP 和端口即可,其他信息一概不给。
9.3 服务端迁移与后续版本升级
如果你想从 1.14.4 迁移到更新版本(比如 1.20.x),可能需要考虑服务端核心文件的替换和地图兼容性。跨大版本的地图数据往往不能直接沿用,建议先备份原地图,再在测试环境里尝试,确认没问题再切换线上。
如果你不想用原版服务端,也可以考虑用模组加载器或高性能服务端(比如兼容 1.14.4 的某些服务端分支),但这类服务端的配置和兼容性差异较大,不适合从零初学者直接上手。我个人给朋友开的服就一直保持原版,稳定压倒一切。
从实际操作中沉淀的几点体会
把这次从零搭建的经历总结成几个关键字,大概是“规划、验证、排错”。规划指的是把整个链路想清楚再做,别急着执行命令;验证指的是每一步都确认结果(Java 版本、端口监听、安全组规则),不靠猜;排错指的是遇到问题先看日志,按链路逐层排查,而不是对着某个参数乱改。
我踩过最深的坑,是忽略了三层放行机制,导致客户端一直连接超时,来回折腾大半天,结果只是云安全组少了一条规则。类似这种问题,在操作顺序上多留个心眼,能省去大量无效排查。
如果你也想自己搭一个 Minecraft 服务端,我的建议是别一开始就追求大版本、高配置、多模组。先按这篇流程跑通原版 1.14.4,确认朋友能进来玩,再逐步做版本升级和插件扩展。基础链路通了,后面的一切都是锦上添花。