01.

服务器如何工作及搭建

发布于 2020-04-10,阅读

作者:Ganxiaozhe (MCAdmin)

本文采用 CC BY-SA 4.0 进行许可

你将在本章学会什么?

不同于其他教程,小蔗将从运行机理开始带你认识我的世界服务器的全貌。并且小蔗相信只有这样,你才会真正成为一个合格的大型服管理者。

不必担心你从未学习过计算机网络&编程相关知识,在这里只需要你能有基本的语文阅读理解以及如何使用计算机。

噢对了,在本章你将学会:

即使你已经运营服务器有段时间,小蔗相信你也能在本文中对不曾理解的地方恍然大悟。

本章针对于 Minecraft:Java 版服务器。


你需要准备什么?

  • 💻 一台能运行 Minecraft 的终端,当然它也要能上网
  • 🧠 一个清晰的大脑
  • ⏱ 已经玩过一段时间的 Minecraft

如果你有相关经验,且急于想知道 Bukkit、Spigot、Sponge 等插件 API 核心方面的消息。请暂且放一放,先耐心看完以下内容,指不定有意想不到的收获呢~

一切就绪,让我们开始吧!

Minecraft 服务器如何运作

在认识服务器前,我们先谈谈最常见的 Minecraft Java 版,它适配于 Windows、Mac OS 与 Linux。

它由 Java 语言开发,所以要运行 Minecraft:Java 你需要先安装Java运行环境(JRE)。Minecraft:Java 1.8 及之前最低支持 Java 6 Release 45,从 Minecraft:Java 1.12 开始,运行必须需要使用 Java 8!

此外,当使用某些与操作系统不匹配的 Java 版本(32或64位)、使用某些 Java 7 版本或安装了多个版本的 Java 玩 Minecraft Java 版时可能会引发问题。

若未安装 Java 8 请先前往 Java.com 下载,官网会根据你的操作系统为你提供适当的安装程序。已安装可以用 java -version 查看其版本,小蔗建议使用最新构建的 Java 8 版本。(部分核心还不支持 Java 9)

不过有些浏览器下可能无法正确被检测,如果你担心出问题,可以通过系统信息来手动选择下载:

  • Windows:按下快捷键 Win + Pause 打开系统信息窗口,找到系统类型。
  • Linux:打开终端,执行 archuname -m。i686 代表 32 位,x86_64 代表 64 位。
  • Mac:恭喜!Mac 不需要区分它们,直接下载便是。

小蔗推荐使用 64 位的 Java ,相比 32 位它运行起来会更快,并且能使用超过 3GB 的内存。


在 Minecraft:Java 版客户端中,提供了在同一个局域网下的多人联机方式。但局域网终究是封闭型网络,无法使各地的玩家都加入进去,所以 Mojang / Microsoft 又提供了一个服务端,以下简称官方服务端。(The vanilla Minecraft server)

官方服务端和 Minecraft Realms 一样,只能使用原版内容,可自定义功能少。你可以在官方启动器的配置编辑中下载每个版本的服务端(包括开发版)。

下载后,你会得到相应版本的服务端核心 server.jar,比如我现在这里是 Minecraft:Java 1.15.2。


如果你并未安装官方启动器,也可以在 https://www.minecraft.net/zh-hans/download/server/ 获取最新官服核心。

其他版本请在 getbukkit.org 下载:https://getbukkit.org/download/vanilla


现在,让我们随意打开一个分区,最好是 SSD 固态硬盘分区,这样能让你服务器读写速度明显提升。为了方便整理服务器文件,我们创建一个名为 minecraft-vanilla-server 的文件夹,并将 server.jar 移动至该文件夹。

进入 minecraft-vanilla-server 文件夹,创建一个名为 start 的文本文件,并打开输入以下指令:

对于 Windows

java -Xms1G -Xmx1G -jar server.jar nogui pause
# 完成后将文件后缀改为.cmd 或 .bat

值得注意的是,请不要使用 Word 等软件来进行编辑,否则它将在保存文件时添加额外的数据。

对于 Mac OS

#!/bin/bash cd "$(dirname "$0")" exec java -Xms1G -Xmx1G -jar server.jar nogui
# 完成后将文件后缀改为.command

对于 Linux

#!/bin/sh java -Xms1G -Xmx1G -jar server.jar nogui;
# 完成后将文件后缀改为.sh

在 Mac 或 Linux 中,可能还需要修改文件权限来使其成功运行。

chmod a+x start.command 或 chmod a+x start.sh


当你完成上诉操作后,我们就可以着手开始启动你的 Minecraft 服务器了。

我们运行一次启动脚本,这时你会发现并没有启动成功。别担心,这是正常的,在绝大多数核心下,你需要同意 EULA(最终用户许可协议),命令行中会提示:

You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

你可以在 https://account.mojang.com/documents/minecraft_eula 查看详细协议内容。

若要启动服务器,我们需打开目录下出现的 eula.txt,将 eula=false 修改为 eula=true

保存更改后再次运行启动脚本,稍等片刻(联网下载支持库、创建或加载世界、初始化插件和模组都需要部分时间),等出现 Done (5.330s)! For help, type "help" 后,就代表服务器已经完成了启动。

想要停止服务器,只需在终端中输入 stop 即可。

Minecraft 服务器硬件需求

同其他游戏服务器一样,Minecraft 也更吃单核性能,虽然 Minecraft 服务器在 1.1.0 版本之后能够使用多个处理器内核。

在原版纯净服务器中,一名玩家大约占用 80MB 的内存,需要 0.4Mbps 的上传速度及 0.2Mbps 的下载速度。Minecraft 服务器可以勉强在 1Mbps 的上传带宽上运行,但小蔗不建议这么做!

如果要搭建一个百人服,你至少需要:

类型CPU内存SSD上传宽带下载宽带
纯净服2.5+ GHz10 GB+60 GB+30 MBps+15 MBps+
插件服2.5+ GHz10 GB+120 GB+30 MBps+15 MBps+
MOD服3+ GHz10 GB+200 GB+150 MBps+100 MBps+

当然了,上诉配置前提是:

  • 不计服务器系统及其他程序运行所需内存
  • 不使用优化很差的核心、插件或 MOD
  • 跑图的玩家较少
  • 玩家不会疯狂搭建刷怪塔或圈养宠物
  • 没有人玩高频红石

所以,对于百人服小蔗推荐你使用如下配置:

类型CPU内存SSD上传宽带下载宽带
纯净服3+ GHz16 GB+60 GB+40 MBps+20 MBps+
插件服3+ GHz20 GB+120 GB+40 MBps+20 MBps+
MOD服3.5+ GHz30 GB+200 GB+150 MBps+100 MBps+

而插件+MOD服这里就不方便做推荐了,因为有些插件+MOD造成的资源占用并非 1+1=2 这么简单。

你可以使用在线工具对服务器人数进行大致估算: 服务器配置人数预算

服务器 VPS 选择的话小蔗推荐阿里云,新用户活动力度挺大的:https://www.aliyun.com/minisite/goods?userCode=34mjlgxu,及服务器专场 https://www.aliyun.com/daily-act/ecs/activity_selection?userCode=34mjlgxu,使用该链接购买你和小蔗都能获得优惠。通常情况下,高频单核、大 RAM 内存与足够宽带即可。你也可以使用 服务器配置人数预算 工具来进行评估。

JVM - 服务器如何被启动

现在,我们再回过头来解释一下那行启动参数到底是什么。

首先,要知道这并不是 Minecraft 专属的启动代码,而是属于 Java语言虚拟机(JVM)。Java 能够被称为“一次编译,到处运行”的原因就是 Java 屏蔽了许多操作系统平台的信息,使得其只需生成能在 JVM 运行的代码,就可以在多种平台运行。

java -Xms1G -Xmx1G -jar server.jar nogui
java调用 Java 运行时环境(JRE)
-XmsJVM 启动时申请的最小 RAM 大小,默认为物理内存的 1/64
-XmxJVM 启动时申请的最大 RAM 大小,默认为物理内存的 1/4
-jar将 JRE 指向特定的.jar文件
server.jarMinecraft 服务器程序文件(核心)
nogui用基于文本的界面来显示,可减少内存使用

Mojang 建议为 Minecraft 服务器分配静态内存,也就是 Xms 要与 Xmx 相同。这样做是为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间。

如果你有了解 JVM,那么肯定能知道上诉参数只是冰山一角,这还存在许多改进空间,比如优化内存管理策略、GC垃圾回收策略。

关于 JVM 的知识值得写一长篇大论去讨论,很显然现在这里并不是个好地方,所以我只介绍作为 Minecraft 服主需要了解的内容。

当然,你也许会在网上看见许多配置好的 JVM 优化参数。但值得注意的是:在绝大部分情况下,JVM 调优策略并没有一种固定的方法,只有根据知识和经验去分析调整。


根据虚拟机规范,JVM 将内存划分为:

  • 🧑 年轻代 Young generation (存放刚创建的对象)
  • 🧓 年老代 Tenured generation(存放未被垃圾回收的年轻代,大内存对象也会被存放在此,尽管它刚刚创建)
  • 🎅 永久代 Perm generation (存放 class、method 等程序元信息)

年轻代和年老代属于堆内存,他们将直接被启动参数 -Xmx 进行分配。永久代则直接被虚拟机分配。

有对象被创建,必然得有对象被清理,否则程序性能岌岌可危。就如同我们的身体一样,每天运行的过程中会不断进行新陈代谢。在程序中的这项技术便是 Garbage Collection(GC),也称垃圾收集器。

当 GC 只发生在年轻代中,回收年轻代中的对象,称为 Minor GC;当 GC 发生在年老代时则称为 Major GC 或者 Full GC。一般的,Minor GC 的发生频率要比 Full GC 高很多。而 GC 优化的关键之一就是增加 Full GC 周期。

那么接下来,我们再众观一下 JVM 的常用参数。等等,你以为我会讲 GC?Ooooops!这不合适。

注:该表格由小蔗整合于互联网。

-client以客户端模式运行,启动速度较快 
-server以服务端模式运行,启动速度较慢。但是启动进入稳定期长期运行之后 Server 模式的程序运行速度比 Client 要快很多。 
-Xms初始堆大小,默认物理内存的1/64-Xms512M
-Xmx最大堆大小,默认物理内存的1/4-Xms2G
-Xmn新生代内存大小,官方推荐为整个堆的3/8-Xmn512M
-Xss线程堆栈大小,JDK1.5 及之后默认1M,之前默认256k-Xss512k
-XX:NewRatio=n设置新生代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4-XX:NewRatio=3
-XX:SurvivorRatio=n年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:8,表示Eden:Survivor=8:1:1,一个Survivor区占整个年轻代的1/8-XX:SurvivorRatio=8
-XX:PermSize=n永久代初始值,默认为物理内存的1/64-XX:PermSize=128M
-XX:MaxPermSize=n永久代最大值,默认为物理内存的1/4-XX:MaxPermSize=256M
-XX:+AggressiveOpts启用后每当 JDK 版本升级时,JVM 都会使用最新加入的优化技术
-verbose:class在控制台打印类加载信息 
-verbose:gc在控制台打印垃圾回收日志 
-XX:+PrintGC打印GC日志,内容简单 
-XX:+PrintGCDetails打印GC日志,内容详细 
-XX:+PrintGCDateStamps在GC日志中添加时间戳 
-Xloggc:filename指定GC日志路径-Xloggc:/data/jvm/gc.log
-XX:+UseSerialGC年轻代设置串行收集器 Serial,Serial 收集器是 Hotspot 运行在 Client 模式下的默认新生代收集器, 它的特点是只用一个CPU/一条收集线程去完成 GC 工作,且在进行垃圾收集时必须暂停其他所有的工作线程 
-XX:+UseParallelGC年轻代设置并行收集器 Parallel Scavenge,是 Serial 的多线程版本。但与其他收集器关注尽可能缩短垃圾收集时间不同, Parallel Scavenge 更关注系统吞吐量。 
-XX:+UseG1GC启用 G1 收集器,面向服务端应用,主要目标用于配备多颗 CPU 的服务器治理大内存 
-XX:ParallelGCThreads=n设置 Parallel Scavenge 收集时使用的 CPU 数。并行收集线程数。-XX:ParallelGCThreads=4
-XX:MaxGCPauseMillis=n设置期望达到的最大 GC 停顿时间指标(毫秒)-XX:MaxGCPauseMillis=100
-XX:GCTimeRatio=n设置 Parallel Scavenge 垃圾回收时间占程序运行时间的百分比。公式为:1/(1+n)-XX:GCTimeRatio=19
-XX:+UseParallelOldGC设置老年代为并行收集器 ParallelOld 收集器 
-XX:+UseConcMarkSweepGC设置老年代并发收集器 CMS,一种多并发低暂停的收集器 
-XX:+CMSIncrementalMode设置 CMS 收集器为增量模式,适用于单CPU情况。 
-D<name>=<value>JVM 自定义参数。-Dgxz.age=18



综上,对于 Minecraft 服务器,小蔗推荐使用 G1GC 。不过通常情况下,你不需要使用到 GC 优化,除非你的服务器规模已经达到了数百人以上同时在线,或者即使分配了较大内存还是经常卡顿。GC 优化是到最后不得已才采用的手段。

对于基础服务器,只需设置一个较大的内存即可,推荐是 10G 。

java -server -Xms10G -Xmx10G -jar server.jar nogui

或者你可以尝试 aikar 研究得出适用于 Minecraft 服务器的启动参数:

java -Xms10G -Xms10G -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=100 -XX:+DisableExplicitGC -XX:TargetSurvivorRatio=90 -XX:G1NewSizePercent=50 -XX:G1MaxNewSizePercent=80 -XX:G1MixedGCLiveThresholdPercent=35 -XX:+AlwaysPreTouch -XX:+ParallelRefProcEnabled -jar server.jar

如果你将上诉启动参数并且需分配大于10G的 RAM 内存,请使用这行代码:

java -Xms16G -Xms16G -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=100 -XX:+DisableExplicitGC -XX:TargetSurvivorRatio=90 -XX:G1NewSizePercent=40 -XX:G1MaxNewSizePercent=60 -XX:G1MixedGCLiveThresholdPercent=35 -XX:+AlwaysPreTouch -XX:+ParallelRefProcEnabled -jar server.jar

在 aikar 的原文中,还带有自定义参数 -Dusing.aikars.flags=mcflags.emc.gs。不过在面板服自定义参数可能会存在字符串长度限制,以防万一去掉了该参数。

为了直观的展示 CG 优化的区别,下面第两张图分别对应其启动参数:

java -Xms2G -Xms2G -jar server.jar
java -Xms2G -Xms2G -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=100 -XX:+DisableExplicitGC -XX:TargetSurvivorRatio=90 -XX:G1NewSizePercent=50 -XX:G1MaxNewSizePercent=80 -XX:G1MixedGCLiveThresholdPercent=35 -XX:+AlwaysPreTouch -XX:+ParallelRefProcEnabled -jar server.jar

可以明显的发现,启用 G1GC 之后服务器 Full GC 周期明显被增长了。

server.properties - 服务器配置文件

在服务器完成启动后,你应该有注意到根目录新出现了一堆文件吧。下面小蔗为你介绍下他们:

banned-ips.json通过IP地址禁止玩家
banned-players.json通过 Minecraft 用户名来禁止玩家
crash-reports储存服务器崩溃时的报告
logs储存服务器的历史消息
ops.json服务器上所有具有 OP 权限的玩家(管理)
server.properties主要的配置文件!
usercache.json所有连接过服务器的玩家客户端数据缓存,来使其下次更快连接到服务器
whitelist.json开启白名单后允许的玩家用户名
world主世界地图文件
world_nether下界(地狱)世界地图文件
world_the_end末地世界文件

这便是原版服中的所有文件了,如同你客户端的 .minecraft 目录,包含了运行需要的所有文件。


在正式连接到服务器之前,我们还需要进行一些设置。输入 stop 停止服务器后,我们打开 server.properties

#为了你更好的修改数据,小蔗已经为你翻译并注释好了每行参数,你大可全部复制后粘贴并覆盖进你的配置文件
#Minecraft server properties
#Tue Mar 31 22:29:01 CST 2020
#通过将该值进行2x+1的运算来决定出生点的保护半径。设置为0将不会禁用出生点保护,但会保护位于出生点的那一个方块。如果服务器没有设置OP,这个选项会自动禁用。
spawn-protection=16
#设置每个tick花费的最大毫秒数。超过该毫秒数时,服务器看门狗将停止服务器程序并附带上信息。
max-tick-time=60000
#设置监听服务器的端口号(参见 enable-query)
query.port=25565
#用于自定义世界的生成
generator-settings=
#强制玩家加入时为默认游戏模式
force-gamemode=false
#允许玩家进入下界
allow-nether=true
#强制开启白名单,使不在白名单中的用户无法加入游戏
enforce-whitelist=false
#定义默认游戏模式,survival\creative\adventure\spectator
gamemode=survival
#将控制台信息显示给OP
broadcast-console-to-ops=true
#允许使用GameSpy4协议的服务器监听器,用于获取服务器信息。
enable-query=false
#玩家空闲超时(分钟)
player-idle-timeout=0
#游戏难度,peaceful\easy\normal\hard
difficulty=easy
#动物生成
spawn-monsters=true
#将 RCON 信息显示给OP
broadcast-rcon-to-ops=true
#OP 权限等级
op-permission-level=4
#是否允许玩家互相攻击
pvp=true
#数据采集,是否允许服务端定期发送统计数据到 http://snoop.minecraft.net
snooper-enabled=true
#确定地图所生成的类型,default\flat\largebiomes\amplified\buffet
level-type=default
#开启后强制设置为困难模式
hardcore=false
#启用命令方块
enable-command-block=false
#允许玩家人数上限
max-players=20
#网络压缩阈值,默认会允许n-1字节的数据包正常发送, 如果数据包为n字节或更大时会进行压缩。所以,更低的数值会使得更多的数据包被压缩,但是如果被压缩的数据包字节太小将反而使压缩后字节更大。
network-compression-threshold=256
#资源包的SHA-1值,必须为小写十六进制,建议填写它。这还没有用于验证资源包的完整性,但是它提高了资源包缓存的有效性和可靠性。
resource-pack-sha1=
#世界大小
max-world-size=29999984
#函数权限等级
function-permission-level=2
#RCON 远程访问的端口号
rcon.port=25575
#服务器(监听的)端口号。如果服务器在使用 NAT 的网络中运行,该端口必须被转发
server-port=25565
#将服务器与一个特定IP绑定。强烈建议留空该属性值!
server-ip=
#是否生成村民
spawn-npcs=true
#允许玩家在安装添加飞行功能的模组下在生存模式下飞行
allow-flight=false
#服务器世界名称及其文件夹名
level-name=world
#视野距离
view-distance=10
#可输入指向一个资源包的URI,玩家可选择是否使用该资源包。注意若该值含":"和"="字符,需要在其前加上反斜线(\)。资源包大小理应不能超过50 MiB。
resource-pack=
#是否生成动物
spawn-animals=true
#启用服务器的白名单
white-list=false
#设置RCON远程访问的密码(参见enable-rcon)
rcon.password=
#是否生成遗迹等建筑,即使设为false,地牢仍然会生成
generate-structures=true
#正版验证
online-mode=true
#最大建造高度
max-build-height=256
#地图种子
level-seed=
#是否禁止玩家使用虚拟专用网络或代理
prevent-proxy-connections=false
#是否使用针对Linux平台的数据包收发优化
use-native-transport=true
#服务器标语
motd=A Minecraft Server
#是否允许远程访问服务器控制台
enable-rcon=false

若你没有用正版登录情况下运行客户端,请将正版验证关闭:online-mode=false,否则将无法登入至服务器。

对于 CommandBlocker,不要忘记将 enable-command-block 设置为 true 噢!

请注意:如果关闭正版验证后,在官服(纯净服)中最好开启白名单。否则其他玩家若修改用户名为 OP 的名称,即可继承其权限!


另外,如果要切换地图,只需要用地图文件夹替换服务器里的 world 文件夹。如果要保存玩家数据,请记得将 world 文件夹中的 playerdata 文件夹保留。

如果有用多世界等插件,计分板等数据也都是保存在 world 目录下的 data 文件夹中。

网络协议 - 加入你的服务器

接下来就到了最“鸡冻人心”的时刻啦!启动服务器后,让我们打开客户端,进入多人游戏。

选择添加服务器,在服务器地址处输入你的IP地址。如果只是本地测试用,可以直接填写回送地址:localhost127.0.0.1

通过以下途径可以获取本机IP:

对于 Windows

打开命令提示符窗口(Win+R > 输入cmd > 回车),输入 ipconfig,即可在 IPv4 地址 处找到IP地址。

对于 Mac OS

打开 终端,输入 ifconfig | grep "inet ",即可找到IP地址。

对于 Linux

在 Shell 中输入 /sbin/ifconfig 或 ip addr show,即可找到IP地址。

将 IPv4 地址输入后,点击完成后即可在多人游戏服务器列表中看见你的私人服务器啦!

不过,你可能还无法直接让局域网外的朋友通过这个 IP 直接连接到你的服务器。

这个问题说来话长但小蔗长话短说:因为互联网以人们难以预料的速度发展,网上冲浪的用户越来越多,导致 IPv4 地址告急。所以运营商分配给家用的基本都是局域网IP(LAN IP),也称内网IP(Private IP)。如何确定你的 IP 是否为内网IP,只需对照你的 IPv4 是否属于以下地址段。

10.0.0.0 - 10.255.255.255 172.16.0.0 - 172.31.255.255 192.168.0.0 - 192.168.255.255

如果你的 IP 为 192.168.0.102,那么属于内网 IP 了 TuT。

如果你的 IP 不属于上面任何一段,那就是公网IP(Public IP)啦!你只需要确保防火墙或安全策略开放了 server-port,默认是 25565。使用 Minecraft:Java 服务器默认端口可以直接通过 IP 连接服务器,而无需加上端口。

这就像你除了用 mcadmin.cn:80 访问小蔗的网站外,使用 mcadmin.cn 依然没问题,而你正在这么做呢~


当然,内网IP也可以通过端口映射、端口转发或内网穿透等 NAT (Network Address Translation) 技术或隧道技术使外面的朋友访问你的服务器。

不要被它们吓到,其实它们早就和你熟透啦!你家庭网络使用的内网IP就是通过 NAT 分发的,当你上网需要连接访问 Internet 时,NAT 就将你的内网IP映射(转换)到互联网服务提供商分配的公网IP的某端口上。

不过你家肯定不止一台联网终端,那难道 NAT 要为每个终端分配一个内网 IP 么?幸好,他还有个叫 Dynamic Host Configuration Protocol,简称 DHCP 的好朋友。DHCP 服务器能够根据自身 IP 池自动给局域网当中的设备分配 IP、子网掩码等 TCP/IP 协议参数,在分配时 DHCP 还贴心的为其设置了租期,当租期到期时,终端就要将 IP 归还给 DHCP,并按需进行重新分配。

所以,要用自家电脑开服,你还需要跟你所属网关勾兑(商量)一番。告诉它,将以 25565 端口入网的流量转发至你的内网IP:

不过说了这么多,小蔗还是不建议你使用自家电脑开服的,因为无论是稳定性、可靠性、安全性、可扩展性、可管理性还是宽带等都不足以达到大服所需要求。想象一下全世界各地通过你开放的端口匿名连接到你的家庭网络,没准又可以拍一部黑客科技电影呢,还是无后期版本哦!当然如果你只是为了和小伙伴玩上一会,倒是可以选择自家电脑啦。


另外,Minecraft:Java 服务器采用的是 TCP 协议连接,而 Minecraft:Bedrock(基岩版) 采用的是 UDP 协议连接。不过在端口转发上,Mojang 建议将其全部转发。

搭建多个服务器与 SRV 技术

想必玩过小游戏服的玩家都会发现游戏大厅被分为了许多区,要实现这一功能,相比于多世界插件,大多数情况下利用群组服来实现更佳。

小蔗当然不会现在就直接让你搭建群组服,而只是告诉你怎么在一个实例上运行多个 Minecraft 服务器。别把它想得复杂,其实非常简单就可以做到!

在之前,我们创建了一个名为 minecraft-vanilla-server 的文件夹,并将 server.jar 服务器核心移动了进去。

这一次,我们创建一个名为 minecraft-vanilla-server-2 的文件夹,并将 server.jar 服务器核心移动进去。核心可以是任意版本。

还是一样的方法,设置好启动脚本后运行服务器,同意 EULA。成功运行后,先停止服务器,将 server-port 从默认值 25565 改为 任意一个没被占用的端口,比如 25566。

完成后重新运行服务器,你就可以通过 localhost:25566 加入新开的服务器啦!

只要你有足够的 RAM,开多少个服务器,全凭你乐意~


小蔗在这里说个题外话,一个实例多开服务器后,因为端口 25565 只能有一个,也就表明连接其他非默认端口的服务器时,就需要带上其端口。

然而这样除了不方便记忆,还会使玩家认为这是个“野鸡服”,因为 90% 的带端口服务器都是搭建于网页面板服而非 VPS 或独立服务器。

那这样的“野鸡服”就是永无翻身之日了么?当然!不是!((٩(//̀Д/́/)۶))

你可以使用 DNS 服务器的服务定位资源记录,也称 SRV 记录,以指明某域名下提供的服务。啊不是,应该是以隐藏你的端口号。


为了实现这一技术,你需要一个能支持 SRV 记录解析的 DNS 服务商。并且已将一个域名解析到了你的服务器 IP,比如域名 server.mcadmin.cn。(此时通过 server.mcadmin.cn:25566 登入服务器)

接下来,我们新增一条 SRV 的记录类型,在主机记录处填写 _minecraft._tcp,在记录值处填写 5 0 25566 server.mcadmin.cn

解析生效后,我们就可以直接通过 mcadmin.cn 登入服务器了!在这个过程中无需对服务器进行任何设置。

_minecraftService,服务名称
_tcpProtocol,使用的协议类型
5Priority,优先级
0Weight,权重
25566Port,端口
server.mcadmin.cnTarget,实际提供服务的域名

写得多详细啊,可我还是不会。

没关系,我们再来一遍


这次小蔗运行了第三个服务器,IP 为:server.mcadmin.cn:25567

若我们要直接通过 love.mcadmin.cn 登入该服务器,那么我们需要新增一条这样的 SRV 记录:

记录类型主机记录记录值TTL
SRV_minecraft._tcp.love5 0 25567 server.mcadmin.cn600秒

OP - 管理你的服务器

如果你要开一个像 2B2T 的服务器,可以略过此节 _(:з」∠)_

前提是你能接受服务器逐渐不受你所控制,并且可能还伴有熊孩子叫嚣着要你怎么怎么样。如果不能,还请仔细阅读此节 (。・ω・。)ノ


首先这里的 OP 是 operator 的缩写,译为操作员,有时候说的 OP权限 也可理解为 操作权限。

如果没有 OP 权限,你在游戏中只能执行以下指令(Minecraft:Java 1.15.2):

help、list、me、msg、teammsg、tell、tm、trigger、w

如果你强行执行高权限指令,如 /time set day,则会反馈:未知的命令,或在其他核心中返回:你没有该权限。就像这样:

I'm sorry, but you do not have permission to perform this command.Please contact the server administrators if you believe that this is in error.

如果你使用的 Paper 核心,可以在 paper.yml 中设置此类信息。

你需要先给自己足够的权限来执行高权限命令,在控制台(Console)里输入 /op Ganxiaozhe 即可。Ganxiaozhe 为你游戏的用户名,如果不小心给到了 Gandazhe,也不必担心,用 /deop Gandazhe 即可取消其 OP 身份。

此外,在控制台中输入指令无需添加斜杠"/"!

如果你使用的 Sponge 核心,再怎么 op 也是无济于事了。在 Sponge 中,命令的执行受权限的控制,且 Sponge 自身未含有权限管理插件。若需添加或取消特定玩家或组的权限,你需要使用某种权限管理插件,小蔗推荐使用 LuckPerms


什么!你不知道什么是控制台?好好看看这个黑乎乎的家伙,你以后可要经常跟他打交道呢:

除了在 console 中,你也能在 logs 文件夹中查看到所有的历史消息。为了节省空间,Mojang 会将除最后一次以外的记录文件进行压缩。


接下来,利用下方的指令,你将更好的对服务器进行管理:

/kick <玩家名> [理由]强制切断用户与服务器的连接,可在用户名后可加上原因以警告。
/ban <玩家名> [理由]封禁,永久切断用户与服务器的连接,可在用户名后可加上原因以警告。
/ban-ip <IP地址 | 玩家名> [理由]封禁,永久切断用户的 IP 与服务器的连接,可在用户名后可加上原因以警告。这意味着即使玩家更换名称也无济于事,但他们仍可能通过改变 IP 进入服务器。
/banlist [list | ips]显示被封禁的 IP 地址或玩家。
/pardon <玩家名>解除对玩家的封禁。
/pardon-ip <IP地址>解除对 IP 地址的封禁。
/whitelist add <玩家名>将玩家添加进白名单。
/whitelist remove <玩家名>将玩家从白名单移除。
/whitelist list显示白名单中的玩家。
/whitelist on开启白名单。
/whitelist off关闭白名单。

服务器核心一览及安装

也许你会疑惑单凭原版服务器是如何开发出那么多自动化小游戏的呢?

这就要得益于可爱的开发者们在官服基础上制作的各类核心了,使用它们内置的 API ,可以快速开发各类模组(插件、MOD)。常见的核心列表如下:

另外其他的小蔗就不做介绍了,小蔗只建议你选择上诉核心之一进行服务器搭建,无论是在生态活跃、核心性能还是稳定性上。

综合考虑,如果追求性能,小蔗建议是利用 Paper 开插件服;如果追求趣味性,用 Sponge 开 MOD+插件,单纯的 MOD 服不利于管理。

原生的 BungeeCord 是不支持 Forge 服之间转发的,所以需要使用 BungeeCord WaterFall 版本。不过由于是在 BungeeCord 基础上开发,有些缺陷只有重写才能解决。但 BungeeCord 的作者 md_5 并不打算支持 Forge,所以 BungeeCord WaterFall 的作者 Andrew 开发了 Velocity。


插件服安装与官服基本一致,只需把官服核心替换为插件服核心即可。较为麻烦的就是 Forge 安装,所以在这里大致描述一下安装流程,防止看见它会一脸懵圈,更详细的教程请查看 模组服与 Sponge 等核心

首先,从 Minecraft Forge 网站下载相应版本的 Forge Installer。通常请下载其推荐版本,也就是下图中靠右的版本。不通常的情况就是某个调皮的 MOD 使用了最新 Forge 的 API,所以你需要下载靠左的最新版。

接下来我们点击下载。嗯???怎么是 Minecraft Forge Server Hosting !?噢,原来是 AdFoc 跳转广告,没事没事,都要恰饭嘛,我等。

2000 YEARS LATER......

怎么还没跳转!?

境外网站啦,有些资源加载问题。来,小蔗教你 F12 大法(误)。

比如我们下载后跳转的链接是:http://adfoc.us/serve/?id=27122873517997,我们在其前面加上 view-source: 并访问:view-source:http://adfoc.us/serve/?id=27122873517997 就能看见该网页的 HTML 源代码了。(手机浏览器通常是不支持的啦)

当然,你也可以使用快捷键 CTRL+U 或右键菜单来查看网页源代码。

在源代码中,我们按下 CTRL+F,查找 class="skip" 。即可找到 a 元素,其中 href 属性就是我们需要下载的文件链接了:

<a href="https://files.minecraftforge.net/maven/net/minecraftforge/forge/1.15.2-31.1.0/forge-1.15.2-31.1.0-installer.jar" class="skip">

在之前会有 .exe 可执行文件的 Installer,不过现在都普遍是可执行的 .jar 文件。与运行服务器核心一样,我们使用 JVM 运行 Forge Installer。(注意文件路径)

java -jar "H:\Minecraft\服务器\1.15.2\forge-1.15.2-31.1.0-installer.jar"

运行成功后选择 Install server 安装服务器环境,小蔗建议新创建一个文件夹来作为安装目标文件夹,它默认选择的是 Minecraft 官方启动器根目录。

开始安装后,它会查找目标文件夹中是否存在官服核心,没有则进行下载。不过得益于境外访问,十有八九都会在安装过程中喜闻乐见地报错:Failed to download version manifest, can not find server jar URL.

所以,最好事先将官服核心放进安装目标文件夹,并将文件名改为 minecraft_server.1.15.2.jar,否则无法被成功检测。其他版本以此规律修改即可,如 1.12.2 改为:minecraft_server.1.12.2.jar

如果在安装中出现 libraries 下载失败,忽略警告重新运行下载一次即可。


下载完成后运行目标文件夹中的 forge-1.15.2-31.1.0.jar 即可。



服务器上线与策划