ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从零搭建Minecraft服务器:硬件选型、服务端配置与联机优化全指南

从零搭建Minecraft服务器:硬件选型、服务端配置与联机优化全指南

1. 开篇:为什么越来越多人想自己搭一个Minecraft服务器

如果你玩Minecraft超过三个月,大概率动过“自己开个服”的念头。原因很简单:公共服务器要么规则太多,要么熊孩子满地跑,要么延迟高得离谱,挖个方块要等半秒才消失。而自己搭服务器,意味着规则你定、地图你选、朋友你拉,想装什么模组就装什么模组,想什么时候重启就什么时候重启。

但真到动手那一步,很多人就卡住了。网上教程要么是几年前的版本,要么只讲一半——告诉你输入什么命令,却不告诉你为什么这么配;告诉你端口要开放,却不告诉你防火墙和路由器到底怎么设。结果就是:服务器看起来启动了,但朋友连不上;或者玩着玩着突然卡死,日志里一堆看不懂的报错。

这篇内容就是来解决这些问题的。我会从零开始,把Minecraft服务器的搭建拆成几个清晰的阶段:先讲清楚你需要什么硬件和网络条件,再讲服务端核心怎么选、配置文件怎么调,然后是完整的启动流程和联机配置,最后是我自己踩过的坑和排查问题的思路。整个过程不依赖任何特定平台,你可以在自己的电脑、旧笔记本、或者租来的云主机上照着做。

适合谁看?如果你完全没接触过命令行,但愿意照着步骤敲几行命令,这篇能带你跑通。如果你已经搭过一两次,但总是遇到内存溢出、连接超时、模组冲突这些问题,这篇里的排查思路和参数调优部分应该对你有用。我尽量把每个操作背后的原因讲清楚,这样你遇到我没提到的情况时,也能自己判断该怎么处理。

2. 搭建前的整体规划:硬件、网络与服务端选型

2.1 先想清楚:你的服务器要给谁玩、玩什么

动手之前,先回答三个问题:多少人玩?玩原版还是模组?自己电脑开还是租机器?这三个答案直接决定后面所有选择。

两个人玩原版生存,和二十个人玩大型模组包,对硬件的要求差了一个数量级。我见过太多人上来就租高配云主机,结果就自己和朋友两个人玩,一个月花好几百,纯属浪费。反过来,也有人用老笔记本开服,装了三十个模组,结果一进游戏就卡成幻灯片,还以为是网络问题。

一个粗略的参考:原版生存,2到5人,2核CPU、4GB内存足够;5到10人,建议4核、8GB内存;如果加模组,每增加10个中等规模的模组,内存至少加1到2GB。大型整合包(比如那些包含几百个模组的)起步就是6GB内存,而且CPU单核性能要强,因为Minecraft服务端的主线程是单核跑的,模组多了之后主线程很容易成为瓶颈。

网络方面,自己家里开服最大的问题是公网IP。很多宽带运营商给的是内网IP,外面的人根本连不进来。判断方法很简单:去路由器管理页面看WAN口IP,再和百度搜“IP”显示的地址对比,如果不一样,那就是内网IP。这种情况要么打电话给运营商申请公网IP(部分地区可以),要么用内网穿透工具(后面会讲)。上传带宽也很关键,每个玩家大概需要0.1到0.3Mbps的上传,十个人就是1到3Mbps,一般家庭宽带的上传够用,但如果是百兆下载、十兆上传的那种,人多了就会卡。

2.2 服务端核心怎么选:原版、Paper、Forge、Fabric的区别

Minecraft服务端不是只有一个版本。官方原版服务端(Vanilla)最干净,但性能一般,而且不支持模组和插件。实际开服很少有人直接用原版,除非你就想体验最纯粹的原版机制。

目前主流的服务端核心分两条线:插件线和模组线。

插件线以Paper为代表。Paper是基于Spigot优化的服务端,性能比原版好很多,支持Bukkit/Spigot插件。如果你想要原版玩法加上一些便利功能(比如领地保护、经济系统、传送指令),Paper是首选。Paper的配置文件很丰富,可以调视距、实体激活范围、自动保存间隔等等,后面会详细讲。

模组线分Forge和Fabric。Forge历史久、模组多,但启动慢、内存占用高。Fabric轻量、启动快,近几年新模组越来越多。选哪个主要看你想要的模组支持哪个。如果整合包里两个都有,那就看哪个是主流。一般来说,大型整合包用Forge的多,轻量优化类和新技术模组用Fabric的多。

还有一个NeoForge,是Forge的分支,最近一些新版本模组开始转向它。如果你玩的是1.20.1之后的版本,可能会遇到NeoForge和Forge二选一的情况,选模组支持多的那个就行。

提示:服务端核心的版本必须和客户端版本一致。1.20.1的客户端连不上1.20.4的服务器,这是新手最常见的错误之一。

2.3 硬件和系统环境的最低要求

自己电脑开服,Windows和Linux都可以。Windows的好处是图形界面熟悉,坏处是资源占用高、命令行体验差。Linux(比如Ubuntu Server)资源占用低、稳定,但需要一点命令行基础。如果你有旧笔记本或者闲置的台式机,装个Ubuntu Server是最省心的方案。

内存是Minecraft服务端最关键的资源。分配多少内存给服务端,取决于模组数量和玩家数量。一个常见的误区是把所有物理内存都分给服务端,比如16GB内存分14GB。这样做的后果是操作系统本身没有足够内存做缓存,反而会拖慢整体性能。一般建议留2到4GB给系统,剩下的再分配给服务端。

Java版本也很重要。Minecraft 1.17及以上需要Java 17,1.16.5及以下可以用Java 8或11。Java版本不对,服务端根本启动不了,或者启动后各种奇怪报错。建议直接装Java 17或Java 21,这两个是长期支持版本,兼容性最好。

硬盘方面,原版世界不大,几个GB就够。但模组包加上世界存档,几十GB很正常。建议用SSD,因为Minecraft服务端会频繁读写区块数据,机械硬盘容易成为瓶颈,表现为玩家跑图时突然卡顿。

3. 核心细节解析:配置文件与启动参数的门道

3.1 server.properties里最该改的五个参数

server.properties是服务端的核心配置文件,每次启动都会读取。里面几十个参数,但真正需要改的没几个。以下五个是我每次开服必调的。

view-distance:视距,决定玩家能看到多远。默认是10,意味着以玩家为中心10个区块半径内的内容都会加载。这个参数对性能影响极大,调低到6到8能显著降低CPU和内存压力,但玩家会觉得远处雾蒙蒙的。我的建议是:原版生存设8,模组服设6到7,人数多的话再降。

simulation-distance:模拟距离,决定多远范围内的生物、作物、红石会实际运行。这个比视距更影响性能。默认和视距一样,但可以单独调低。比如视距10、模拟距离6,玩家能看到远处地形,但只有近处的生物会动。这样既保留了视觉体验,又省了性能。

max-players:最大玩家数。这个不是硬限制,设20人,第21个人也能进,只是会提示服务器满。实际能承载多少人取决于硬件,设太高没意义。

online-mode:正版验证。设为true时,只有正版账号能进。设为false,离线账号也能进,但会有安全问题——任何人都能冒充你的ID。如果是和朋友玩,设false方便;如果是公开服,必须设true。

difficulty:难度。peaceful没有怪物,easy怪物伤害低,normal标准,hard怪物伤害高且会破门。生存服一般normal或hard。

改完这些,记得保存文件再启动。改错了导致服务器起不来,就把这行删掉或者改回默认值。

3.2 JVM启动参数:内存分配与垃圾回收调优

启动服务端时,Java虚拟机(JVM)的参数直接决定性能和稳定性。最常见的参数是-Xmx和-Xms,分别设置最大和初始堆内存。比如:

java -Xms4G -Xmx4G -jar server.jar nogui

这里把初始和最大内存都设为4GB。为什么设成一样?因为如果初始小、最大大,JVM会在运行过程中不断申请内存,造成额外开销。设成一样可以让JVM一开始就分配好,减少波动。

但光设内存不够。Minecraft服务端会产生大量临时对象,垃圾回收(GC)策略很关键。默认的GC在内存大、玩家多的时候容易造成长时间停顿,表现为服务器突然卡几秒。推荐使用G1GC,参数如下:

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 -jar server.jar nogui

这一长串看着吓人,但核心就几个:UseG1GC启用G1垃圾回收器,MaxGCPauseMillis=200限制每次GC停顿不超过200毫秒,AlwaysPreTouch让JVM启动时就把内存占住,避免运行中才分配。实测下来,这套参数在4到8GB内存的服务器上能把卡顿频率降低很多。

注意:-Xmx不要超过物理内存的70%到80%。比如8GB内存的机器,最多分6GB给服务端,留2GB给系统。

3.3 模组和插件的加载顺序与冲突排查

模组和插件的加载顺序不是随便排的。Forge和Fabric会按照模组文件名的字母顺序或者依赖关系加载,但有些模组明确要求排在另一个前面。比如某些核心库模组必须最先加载,否则依赖它的模组会报错。

判断加载顺序问题,看日志最直接。服务端启动时会在logs/latest.log里记录每个模组的加载过程。如果某个模组报“Missing dependency”或者“ClassNotFoundException”,说明它依赖的模组没加载或者版本不对。这时候需要检查模组文件夹里有没有对应的依赖,版本号是否匹配。

插件冲突更隐蔽。两个插件都修改同一个游戏机制时,可能不会报错,但行为会变得奇怪。比如两个领地插件同时运行,玩家可能无法放置方块,或者领地边界错乱。排查方法是逐个禁用插件,每次重启测试,直到找到冲突的那个。

一个实用技巧:新加模组或插件时,一次只加一个,加完就启动测试。一次性加十个,出问题了根本不知道是哪个的锅。

4. 完整实操流程:从零启动一个可联机的服务器

4.1 下载服务端核心与首次启动

以Paper服务端为例。先去Paper的官方下载页,选好Minecraft版本,下载对应的jar文件。把jar文件放到一个单独的文件夹里,比如C:\mc-server或者/home/user/mc-server。不要放在桌面或者下载文件夹,路径里最好不要有中文和空格,否则某些情况下Java会找不到文件。

然后创建一个启动脚本。Windows下新建一个文本文件,改名为start.bat,内容如下:

@echo off java -Xms4G -Xmx4G -XX:+UseG1GC -jar paper.jar nogui pause

Linux下新建start.sh:

#!/bin/bash java -Xms4G -Xmx4G -XX:+UseG1GC -jar paper.jar nogui

然后给执行权限:chmod +x start.sh。

第一次启动时,服务端会生成eula.txt文件,里面有一行eula=false。必须改成eula=true才能继续启动。这是接受用户协议的意思,不改的话服务端会直接退出。

改完再启动,服务端会生成世界文件、配置文件、日志文件夹。看到“Done”字样,说明启动成功。这时候服务器已经在本地运行了,端口默认是25565。

4.2 局域网联机与端口映射配置

本地启动成功后,同一局域网内的电脑可以通过你的内网IP连接。比如你的电脑IP是192.168.1.100,朋友在同一个WiFi下,直接在Minecraft里添加服务器,地址填192.168.1.100:25565就能进。

但要让外网的朋友连进来,就需要端口映射。步骤如下:

  1. 给开服的电脑设置固定内网IP。在路由器管理页面里,找到DHCP静态分配,把开服电脑的MAC地址和IP绑定,比如固定为192.168.1.100。
  2. 在路由器里找到“端口转发”或“虚拟服务器”选项。
  3. 添加一条规则:外部端口25565,内部端口25565,内部IP填192.168.1.100,协议选TCP(有些路由器需要TCP+UDP)。
  4. 保存后,外网朋友用你的公网IP加端口连接,比如123.45.67.89:25565。

如果路由器里设置了防火墙,还需要放行25565端口。Windows防火墙也要放行Java或者对应端口。

提示:公网IP会变,尤其是重启路由器之后。可以用动态DNS服务把一个域名绑定到你的IP,这样朋友用域名连接就行,不用每次问你要新IP。

4.3 内网穿透方案:没有公网IP时的替代做法

如果运营商不给公网IP,端口映射做了也没用。这时候可以用内网穿透工具。原理是在你的电脑和一台有公网IP的服务器之间建一条隧道,外网玩家连到那台服务器,流量转发到你的电脑。

常见的内网穿透服务有Sakura Frp、花生壳等。以Sakura Frp为例,注册账号后创建一个TCP隧道,本地IP填127.0.0.1,本地端口25565,然后会分配一个公网地址和端口。朋友用那个地址连接就行。

免费版通常有带宽和流量限制,几个人玩够用,人多了会卡。付费版带宽更大,但成本可能比自己租云主机还高。如果长期开服,建议直接租一台云主机,省去内网穿透的麻烦。

注意:内网穿透的流量会经过第三方服务器,所以不要在里面传敏感信息。另外,免费隧道可能不稳定,掉线后需要重新连接。

4.4 服务端日常维护:备份、重启与性能监控

服务器跑起来只是开始,日常维护才是长期稳定运行的关键。

备份最重要。Minecraft世界文件在world文件夹里,直接复制整个文件夹就行。但服务端运行中复制可能得到不完整的数据,最好先执行save-all命令保存,再复制。或者用插件自动备份,比如FTB Backups或者Simple Backups。

重启频率看情况。原版服几天重启一次都行,模组服建议每天重启,因为模组容易内存泄漏,跑久了会越来越卡。重启前记得在游戏里公告,让玩家下线,避免丢进度。

性能监控可以用Spark插件。它能生成CPU、内存、TPS的报告,还能看哪个模组或插件占用资源最多。TPS低于20就说明服务器卡了,需要排查。常见原因:实体太多(比如大量掉落物、动物)、红石机器高频运行、某个模组死循环。

5. 常见问题与排查技巧实录

5.1 连接超时、被拒绝、版本不匹配的排查顺序

朋友连不上,先按这个顺序排查:

  1. 服务端启动了吗?看控制台有没有“Done”。没启动的话,检查Java版本和eula.txt。
  2. 本地能连吗?用localhost:25565或者127.0.0.1:25565测试。本地能连说明服务端没问题,问题在网络。
  3. 局域网能连吗?用内网IP测试。局域网能连说明端口映射或防火墙有问题。
  4. 外网能连吗?用公网IP测试。连不上就检查端口转发规则、防火墙、运营商是否封了25565端口。
  5. 版本匹配吗?客户端和服务端版本必须完全一致。1.20.1的客户端连不上1.20.4的服务器。

如果提示“Connection refused”,通常是服务端没启动或者端口不对。如果提示“Timed out”,通常是防火墙拦截或者端口映射没生效。

5.2 内存溢出与TPS低的典型原因

内存溢出(OutOfMemoryError)是模组服最常见的问题。原因通常是分配的内存不够,或者某个模组内存泄漏。解决方法:先加内存,如果加了还溢出,就用Spark查哪个模组占用最多,考虑替换或移除。

TPS低但内存没满,通常是实体太多或者红石机器太猛。用命令/spark tps看当前TPS,/spark health看整体状况。如果某个区块实体数量异常,可以用/kill @e[type=item]清理掉落物,或者限制刷怪数量。

还有一个容易被忽略的原因:视距和模拟距离设太高。十个人在线、视距12、模拟距离10,再好的CPU也扛不住。调低到视距8、模拟距离6,TPS立刻回升。

5.3 模组冲突与日志阅读速查表

日志是排查问题的第一手资料。logs/latest.log是当前日志,logs/文件夹里还有历史日志。看日志时重点关注“ERROR”和“WARN”级别的行。

日志关键词可能原因解决方法
Missing dependency缺少前置模组下载并放入对应模组
ClassNotFoundException模组版本不匹配检查模组支持的MC版本
Duplicate mod重复模组删除重复的jar文件
Ticking entity实体导致崩溃用Spark定位具体实体
Ticking block entity方块实体导致崩溃检查机器类模组
Exception in server tick loop服务端主循环异常看堆栈定位具体模组

提示:日志里的堆栈信息从下往上看,最下面一行通常是根本原因,上面的是调用过程。

5.4 我踩过的坑与独家避坑技巧

第一个坑:用中文路径。Windows下把服务端放在“我的文档\新建文件夹”里,结果Java报“找不到主类”。后来才知道路径里有中文和空格,Java处理不了。改成C:\mc-server就好了。

第二个坑:内存分配太多。16GB内存分了14GB给服务端,结果系统卡死,服务端反而更慢。后来留了4GB给系统,服务端分10GB,流畅多了。

第三个坑:模组一次性全加。下了个整合包,把里面所有模组一次性放进mods文件夹,启动直接崩溃。后来一个一个加,发现是两个模组冲突,删掉其中一个就好了。

第四个坑:忘了关正版验证。自己测试时设了online-mode=false,后来忘了改回来,结果公开后被人用离线账号冒充管理员。幸好发现得早,没造成损失。

第五个坑:备份没做。有一次模组更新导致世界存档损坏,没有备份,几个月的进度全没了。从那以后,我设置了每天自动备份,保留最近七天的存档。

这些坑看起来都是小事,但每一个都能让你折腾半天。希望你看完能绕过去。

6. 进阶玩法:从能跑到跑得好的几个优化方向

服务器能跑起来之后,下一步就是让它跑得更好。优化方向主要有三个:性能、安全和体验。

性能方面,除了前面说的视距和模拟距离,还可以用Paper的异步区块加载、实体激活范围调整。Paper的配置文件里有个entity-activation-range,可以设置不同生物在多远距离内才会激活。比如把动物的激活范围调到16,怪物调到32,能大幅降低CPU占用。

安全方面,公开服一定要装防作弊和防熊插件。防作弊推荐Matrix或者Vulcan,防熊推荐CoreProtect,它能记录所有方块变化,谁破坏了什么一查就知道。另外,定期检查OP列表,不要随便给人管理员权限。

体验方面,可以装一些便利插件,比如EssentialsX提供传送、家、经济系统,LuckPerms管理权限组。但插件不是越多越好,每个插件都会占用资源,也会增加冲突风险。只装真正需要的。

还有一个容易被忽略的点:MOTD和服务器图标。MOTD是服务器列表里显示的那段文字,可以在server.properties里改。图标是一张64x64的PNG图片,命名为server-icon.png放在服务端根目录。这两个小东西能让你的服务器看起来更专业,朋友也更容易找到。

最后,如果你打算长期开服,建议把服务端放在云主机上,而不是自己家里的电脑。云主机24小时运行,网络稳定,不用担心家里断电断网。选云主机时注意看CPU单核性能,Minecraft服务端吃单核,核心多但单核弱的机器反而不好用。内存和硬盘按前面说的标准选就行。

我个人在实际操作中的体会是,搭服务器最难的不是技术,而是耐心。遇到报错不要慌,看日志、搜错误信息、逐个排查,大部分问题都能解决。实在搞不定,去相关的社区提问,把日志和配置贴出来,通常有人能帮你。祝你开服顺利,玩得开心。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进