Minexa说明书
基础服务端基础

服务端是怎么跑起来的(含首次启动)

从点下“启动”到出现 Done,中间发生了什么;为什么第一次慢、世界文件夹什么时候出现、端口什么时候开始监听。

你在概览页点了「启动」,状态变成“运行中”,进度条停在「创建世界」,终端一行行往上滚。三分钟过去了,朋友还是进不来——你开始怀疑它到底是在干活,还是已经卡死了。

想判断这件事,不需要懂 Java,只需要知道服务端启动时按固定顺序做几件事,而且每件事都会在日志里留下痕迹。知道顺序,你就能一眼看出它卡在哪一步;不知道顺序,就只能看着黑底白字干等,然后在“是不是要重装”里反复摇摆。

下面按顺序讲:服务端到底在算什么、启动链上的八步、Done 的含义、第一次为什么慢、停止时又发生了什么。

本页要点
  • 服务端是个每秒循环 20 次(tick)的程序,它只和客户端交换“发生了什么”,不传世界本身。

  • 启动链固定八步:检查 → 运行时 → 配置 → 世界 → 端口 → Done,前一步没过就不会有下一步。

  • 看到 Done 才算启动成功,状态显示“运行中”只代表进程活着,可能还在生成世界。

  • 第一次启动要 1~3 分钟(装环境、下依赖、生成世界),之后十几秒就完成。

  • 停止要发 stop 让它自己存盘退出,最多等 180 秒,别直接杀进程。

先理解:服务端是一个“一直在算”的程序#

客户端(朋友打开的游戏画面)负责渲染画面和接收操作,服务端负责一切规则:怪物怎么刷、方块怎么变、谁在挖什么、世界长什么样。两者之间只传“发生了什么”,不传世界本身——所以朋友看到的画面,永远是他自己的客户端根据服务端消息画出来的。

服务端跑起来后,以每秒 20 次的节奏循环推进,这个节奏叫 tick(游戏刻,可以理解成服务端的心跳,20 tick = 1 秒)。实际每秒能跑完多少刻就是 TPS,20 是满分;掉到 15 以下,玩家就会感到卡顿、怪物瞬移、方块挖了不掉。

世界也不是整块装进内存的,而是切成 区块(16×16 方块的竖条,一个区块从基岩一直通到天空)。服务端只加载玩家附近的区块,远处的卸载掉。所以第一次进服时你会看到“正在生成地形”——那些区块之前根本不存在,是这一刻才被你踩出来的。

世界数据在内存里改,然后定期写回磁盘(自动保存)。这是理解后面所有“别直接杀进程”的前提:进程活着的时候,内存和磁盘可能不一致,最近几分钟的改动还没落盘。

从点启动到 Done,中间发生八件事#

  1. 应用先做检查:有没有选核心、运行环境装没装、内存值在不在 256–65536 MB 之间、核心要求的运行环境和当前选的是不是同一种。不通过就直接拦下,不会启动。

  2. 拉起运行时:Termux 兼容环境、PRoot 容器或 PHP。这是服务端脚下的“地基”,它先起来,Java 才有地方跑。

  3. 拼出启动命令并执行:Java 系核心本质上是 java -Xmx… -jar server.jar nogui;Forge 用 unix_args.txt,PocketMine 执行 PocketMine-MP.phar。命令里的 -Xmx 就是你设的「JVM 内存上限」。

  4. 核心读配置:Java 系读 server.properties(端口、MOTD、正版验证、视距都在里面);PowerNukkitX 读 pnx.yml,Allay 读 server-settings.yml。

  5. 生成或加载世界:第一次是生成出生点附近的区块,之后是读已有的 world/。日志里会出现 Preparing level "world"。

  6. 绑定端口:向系统申请监听 25565(Java,TCP)或 19132(基岩,UDP)。这一步失败就是端口被占用。

  7. 打印 Done:所有插件加载完、世界就绪、端口已经在听,控制台输出那一行。

  8. 开始接客:这时玩家连接才会被接受,之前连过来一律超时或被拒绝。

这八步里,第 2、3 步出问题表现为“点了没反应”或“闪退”,第 4、5 步出问题表现为“卡住不动”,第 6 步出问题表现为一句明确的报错,第 7 步之后才轮到网络问题。先用现象定位到步,再去查原因,比从头重装快得多。

Done 那一行到底代表什么#

日志
[12:03:41] [Server thread/INFO]: Starting minecraft server version 1.21.4
[12:03:44] [Server thread/INFO]: Preparing level "world"
[12:03:47] [Server thread/INFO]: Done (3.214s)! For help, type "help"

三行的意思是:核心版本起来了 → 开始加载世界 → 世界加载完成、端口已经在听、可以进了。

括号里的 3.214s 是从加载世界到就绪的耗时,不是“启动总共用了多久”;前面还有环境、JVM、核心初始化的时间。

要记住一条:看到 Done 才算启动成功。概览页显示“运行中”只说明进程活着,可能还停在生成世界。这时候让朋友连,他只会看到“连接超时”,然后你会以为是网络问题,白折腾半小时。

在 Minexa 里

概览页会在启动期间显示阶段进度(「启动中」「创建世界」「监听端口」这类),这些阶段是应用从日志里读出来的,不是它自己编的进度条。不想看可以点启动卡右上角齿轮,打开「跳过启动中进度」,它就不显示阶段,直接按运行中显示。日志本身在 终端与控制台 里看。

世界和配置文件是什么时候出现的#

很多人以为下载完就有 world/、server.properties、logs/,其实这些都是核心在启动过程中自己创建的:第 4 步写下 server.properties 的默认值,第 5 步才生成 world/,从第 3 步起往 logs/ 里写日志。

所以会出现两个“看着像故障”的正常现象:

  • 刚下载完、还没启动过的服务器,配置页可能一片空白,端口也改不了——因为文件还不存在;

  • 第一次启动的终端里没有任何“已保存”字样,只有一路生成地形——因为世界是新建的。

文件各自的作用和能不能删,集中写在 服务端目录结构与文件说明。

第一次为什么慢,第二次为什么快#

同样一个 Paper 服,第一次可能要 1~3 分钟,之后十几秒就 Done。差在四个地方:

阶段第一次启动之后启动
运行环境要初始化约 50 MB 的 Termux 兼容环境已就绪,直接用
Java要下载并安装几百 MB 的 JDK已安装,直接调
核心依赖Fabric / Forge / NeoForge / Quilt 要先拉 libraries 依赖已存在,跳过
世界生成出生点附近区块,视距越大越久直接读盘,几十秒内完成

所以“第一次慢”不是故障。真正需要担心的是第二次、第三次依然慢,或者同一个世界每次启动都卡在同一行——那说明有东西在反复重试,通常是依赖下载失败,或者某个模组在报错。

一个粗略的时间基准:干净的 Paper 服冷启动,环境装好之后一般在 20~60 秒内出 Done;超过 5 分钟没有任何新日志,才值得按卡死处理。

EULA 和配置文件是谁写的#

Minecraft 官方要求接受 EULA(最终用户许可协议)才能开服。原版服务端的做法是:第一次启动时生成 eula.txt,然后在控制台停下,等你自己改成 eula=true 再启动。

在 Minexa 里这一步被提前了:下载或导入服务端时,如果目录里没有 eula.txt,应用会直接写入 eula=true。所以你不会看到任何询问窗口,也不会卡在“请同意 EULA”那里。

这意味着什么

写入 eula=true 相当于替你表达了同意:下载或导入服务端的动作,就代表你接受 Minecraft EULA。之后你若手动把它改成 false,应用不会改回来,服务端会拒绝启动,终端里显示“未接受 Minecraft EULA,服务端无法启动”。

server.properties 则完全由核心生成,应用不预写端口。所以端口这种东西以文件为准:你在「服务器配置」页改了 server-port,保存后要重启才生效;如果文件里的值和界面显示的不一致,一律以文件为准。改法见 服务器配置页。

停止的时候发生了什么#

点「停止」不是“关掉窗口”,而是向控制台发送 stop 指令,等同于你在游戏里敲 /stop。服务端收到后会做一串收尾:

  1. 停止接收新连接,踢出在线玩家;

  2. 把所有加载中的区块和玩家数据写回磁盘;

  3. 关闭监听端口,退出 JVM;

  4. 进程结束,状态变回“未运行”。

Minexa 会等这个过程,最多等 180 秒。180 秒还没退出,它不会帮你强杀,而是提示“服务端仍在关停中,可点「强制停止」立即结束”。是否强杀由你决定。

直接杀进程的代价

「强制停止」会立刻结束进程,内存里还没写回磁盘的世界数据直接丢失:轻则回档几分钟,重则 level.dat 或区块文件写到一半损坏,世界打不开。

判断标准很简单:只要还能等,就用「停止」等它自己退。只有确认卡死(比如十分钟没有任何日志输出)时才用强制停止,事后检查世界能不能正常加载。

另外两件事容易误会:

  • 没有「重启」按钮。改完配置想生效,要先点「停止」,等它真的退出,再点「启动」。运行中直接改配置不会生效。

  • 崩溃自动重启默认是关闭的。打开后最多连续重试 3 次,间隔 3 秒、6 秒、12 秒,这是给“偶尔被系统杀一次”准备的,不是给“每次都崩”准备的。

卡住了,按阶段定位#

对照现象找阶段,再按最后一列去看:

现象卡在哪一步先看哪里
启动按钮是灰的第 1 步检查没过概览启动卡的提示、Java 运行环境卡
点启动后几秒就退出第 2~3 步,运行时或命令出错终端第一屏输出、崩溃报告
一直停在“创建世界”第 5 步,世界生成或加载终端最后 20 行、磁盘剩余空间
报 Address already in use第 6 步,端口被占用换端口或关掉占用它的程序
有 Done 但朋友进不来第 7 步之后,纯网络问题地址、是否同一 Wi-Fi、正版验证

第 4 步之前的问题(环境、Java、命令)几乎都会在 30 秒内暴露;卡在第 5 步通常是世界太大、磁盘满了、或模组死循环。排查步骤见 启动失败:卡住、闪退、迟迟不出 Done,判断 Java 版本够不够见 游戏版本与 Java 版本。

上机自查
  • 终端里出现过 Done (...s)! For help, type "help",不是停在 Starting server。

  • 服务端目录里已经出现 world/、server.properties、logs/latest.log 三样东西。

  • 概览「当前运行环境」显示的是你想用的那个来源和版本,不是默认值。

  • 点「停止」后状态能自己回到“未运行”,没有用到「强制停止」。

  • 知道改完 server.properties 必须重启才生效。

下一步#

读到这儿了,给你点个赞。如果这页内容帮你解决了问题,说明说明书的方向是对的;如果发现错误、过时信息或看不懂的地方,欢迎到 GitHub Issues 告诉我们。

⚡ 回到极速开服 📖 查术语表