架设服务端(进阶)
¶ 引语
本教程是建立在您已经能够架设一个Minecraft Java版服务器的基础上进行教学的,在本篇中,我们会深入讨论群组、模组服、生电服架设,MCDR、MCSM等守护进程的使用,Java优化,报错解决等各方面的Minecraft Java版服务器运维知识。
如果您还无法独立架设一个Minecraft Java版服务器,请先阅读基础篇的相关知识,在进阶篇中我们将不再讨论基础的技术细节。您可以通过目录查找您需要的技术教程。
此外,编者水平有限,难免会出现错误和遗漏,如果您发现任何问题,或者您有任何其他的教程希望我们推出,都可以随时联系我们。
当然,有任何问题您也可以随时在MUA各群聊中询问,我们非常乐意提供咨询和技术援助。
注:本篇将以篇章为单位持续更新,每篇的编者和参考资料都会附在最后,如果有需要可以自行查看
¶ 为服务器配置外置登录
外置登录是能够截取正版登录的验证方式,并允许服务器管理者自行验证玩家账户可信度的方案,目前外置登录的主流方案是authlib-injector,目前MUA联合认证使用的也是此方案,本篇教程将会教学如何为服务器配置authlib-injector。
您需要拥有服务器的完整管理权限,包括对启动参数进行修改。
此外您需要搭建自己的皮肤站以提供验证(如果您高校没有自己的皮肤站,可以使用MUA官方皮肤站统一认证),皮肤站搭建教程见此处。
第一步,关闭正在运行的服务器,如果您还没有搭建服务器请查看基础篇教程
下载最新版本的authlib-injector
将下载下来的authlib-injector移动至与服务端JAR文件同级的目录下
在启动参数中添加如下内容-javaagent:{authlib-injector.jar 的路径}={验证服务器 URL (API 地址)},并且为服务器开启正版验证(代理端仅仅只需要在代理端开启,但子服都应当安装authlib-injector并添加至启动参数)
最后,启动服务器,外置登录就可以使用了
例如您需要使用MUA验证,那么服务器参数就应该使用如下案例:
java -javaagent:authlib-injector-1.2.3.jar=https://skin.mualliance.ltd/api/union/yggdrasil -jar server.jar nogui
当然,开发者也提供了一些可以添加的参数,他们额外增加了别的功能。您可以自己选择并修改。
-Dauthlibinjector.noLogFile
不要将日志输出到文件.
默认情况下, authlib-injector 会将日志输出到控制台以及当前目录下的 authlib-injector.log 文件.
开启此选项后, 日志仅会输出到控制台.
需要注意的是, authlib-injector 的日志是不会输出到 Minecraft 服务端/客户端的日志文件中的.
每次启动时, 日志文件都会被清空. 如果有多个进程使用同一个日志文件, 则只有最早启动的会成功打开日志文件.
-Dauthlibinjector.mojangNamespace={default|enabled|disabled}
设置是否启用 Mojang 命名空间 (@mojang 后缀).
若验证服务器未设置 feature.no_mojang_namespace 选项, 则该功能默认启用.
启用后, 则可以使用名为
例如,
- /give @p minecraft:skull 1 3 {SkullOwner:"Notch@mojang"}
- /npc skin Notch@mojang
显示的将会是 Notch 的皮肤.
注意, 虚拟角色和对应正版角色的 UUID 是不同的. 为了将虚拟角色和正版角色区别开,
虚拟角色 UUID 中 time_hi_and_version 字段的最高位被置为 1 (见 RFC 4122 4.1.3 章节).
例如:
069a79f4-44e9-4726-a5be-fca90e38aaf5 Notch
069a79f4-44e9-c726-a5be-fca90e38aaf5 Notch@mojang
采用该方法的原因是, 在 RFC 4122 中 UUID 版本号只有 6 种可能的取值 (0~5), 版本号的最高位始终为 0.
而实际上, Mojang 使用的是版本 4 (随机) UUID, 因此其对应的虚拟角色的 UUID 版本号为 12.
-Dauthlibinjector.mojangProxy={代理服务器 URL}
设置访问 Mojang 验证服务时使用的代理, 目前仅支持 SOCKS 协议.
URL 格式: socks://
这一代理仅作用于 Mojang 命名空间 功能, 其仅用于访问 Mojang 服务器.
若要在访问自定义验证服务器时使用代理, 请参考 https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html .
-Dauthlibinjector.legacySkinPolyfill={default|enabled|disabled}
是否启用旧式皮肤 API polyfill, 即 'GET /skins/MinecraftSkins/{username}.png'.
若验证服务器未设置 feature.legacy_skin_api 选项, 则该功能默认启用.
-Dauthlibinjector.debug (等价于 -Dauthlibinjector.debug=verbose,authlib)
或 -Dauthlibinjector.debug={调试选项; 逗号分隔}
可用的调试选项:
- verbose 详细日志
- authlib 开启 Mojang authlib 的调试输出
- dumpClass 转储修改过的类
- printUntransformed 打印已分析但未修改的类; 隐含 verbose
-Dauthlibinjector.ignoredPackages={包列表; 逗号分隔}
忽略指定的包, 其中的类将不会被分析或修改.
-Dauthlibinjector.disableHttpd
禁用内建的 HTTP 服务器.
以下依赖内建 HTTP 服务器的功能将不可用:
- Mojang 命名空间
- 旧式皮肤 API polyfill
-Dauthlibinjector.httpdPort={端口号}
设置内置 HTTP 服务器使用的端口号, 默认为 0 (随机分配).
-Dauthlibinjector.noShowServerName
不要在 Minecraft 主界面展示验证服务器名称.
默认情况下, authlib-injector 通过更改 --versionType 参数来在 Minecraft 主界面显示验证服务器名称, 使用本选项可以禁用该功能.
-Dauthlibinjector.mojangAntiFeatures={default|enabled|disabled}
设置是否开启 Minecraft 的部分 anti-feature.
若验证服务器未设置 feature.enable_mojang_anti_features 选项, 则默认禁用.
Minecraft 的 anti-feature 包括:
- Minecraft 服务器屏蔽列表
- 查询用户权限的接口, 涵盖以下项目:
* 聊天权限 (禁用后默认允许)
* 多人游戏权限 (禁用后默认允许)
* 领域权限 (禁用后默认允许)
* 遥测 (禁用后默认关闭)
* 冒犯性内容过滤 (禁用后默认关闭)
-Dauthlibinjector.profileKey={default|enabled|disabled}
是否启用消息签名密钥对功能, 这一功能在 22w17a 引入, 用于多人游戏中聊天消息的数字签名.
启用此功能后, Minecraft 会向 /minecraftservices/player/certificates 发送 POST 请求, 以获取由验证服务器颁发的密钥对.
此功能需要验证服务器支持, 若验证服务器未设置 feature.enable_profile_key 选项, 则该功能默认禁用.
-Dauthlibinjector.usernameCheck={default|enabled|disabled}
是否启用玩家用户名检查, 若禁用, 则 authlib-injector 将关闭 Minecraft、BungeeCord 和 Paper 的用户名检查功能.
若验证服务器未设置 feature.usernameCheck 选项, 则默认禁用.
注意, 开启此功能将导致用户名包含非英文字符的玩家无法进入服务器.
本篇编者:JianMoOvO
参考资料:
authlib-injector官方文档:https://github.com/yushijinhun/authlib-injector
¶ 架设生电服(Velocity+MCDR+Fabric)
本篇内容将讲解如何架设一个包含生存,创造以及镜像的Minecraft Fabric服务端,这类服务端搭建的服务器常常被称作生电服,它为红石技术提供了一些方便的功能,同时我们将使用MCDR作为守护进程,这个程序在不修改Minecraft的基础上提供了一些好用的功能。
¶ 架设Fabric服务器
首先我们需要搭建一个Fabric服务器,您可以在这里获取到所有版本的Fabric服务端安装器。(PL:实际上是一系列)
编者这里采用的是Minecraft 1.20.1,Fabric Loader Version 0.14.22,Installer Version 0.11.2。
版本不同操作步骤大致类似,选择好版本点击界面上的按键即可。如果您需要更旧的版本或是开发版本可以点击下方的Download installer for older versions or manual installation,但是我们推荐您使用最新的版本,旧版本和开发版可能会导致一些不必要的错误。
和基础篇一样,将服务端放在一个独立的文件夹中,编者将其命名为survival,这将作为我们的生存主服
随后编写一个启动脚本,启动服务端,当然您也可以指定一些JVM参数。
注:这里大概率需要魔法上网,编者也没下载下来…..找的朋友帮忙下载的。在安装中遇到问题请访问Fabric官方WIKI,这里有更详细的安装方法:https://fabricmc.net/wiki/install
(如果您对这部分内容存在疑问,请阅读基础篇)
java -jar <服务端名称>.jar
下载完成后,你应该会得到这些文件,同意eula.txt之后,请先不要重新启动,建立一个server文件夹,将你的survival文件夹进去,同时将这些文件复制两份,将文件夹命名为creative和mirror,这些文件会分别作为你的生存,创造以及镜像服的文件。
然后我们来安装一些Mod(此列表的Mod为推荐安装的Mod,请根据你的需要挑选,不在此列表的Mod也可以安装,但请注意客户端是否能够直接访问)
Mod
描述
地址
FabricProxy(必须安装)
这个模组可以用于联接群组服,支持BungeeCord和Velocity1.14客户端和服务端都需要安装,1.14.1及以上版本仅服务端安装。如果启用了Velocity支持,则必须设置secret要求与Velocity中的velocity.toml文件内forwarding-secret的数值相同。
🌏
FabricProxy-Lite(必须安装)
FabricProxy停更后的替代品,仅支持Velocity并使用Fabric-API处理Velocity数据包与FabricProxy二者任选其一即可
🌏
Fabric API(必须安装)
Fabric 由 Fabric-loom , Fabric-Loader 和 Fabric API 组成其中 Fabric-Loader 是最基础的组件;大多数情况下需要同时安装 Loader 和 API
🌏
Xaero's World Map Xaero's Minimap(强烈建议安装)
这俩地图可以给客户端提供一串标识服务端与维度的代码,用于客户端自动切换地图。(PL:在单端的情况下不装可能也没什么关系;但是当你架设群组服或者接入联合大厅时,如果没有标识代码,不同服务器的地图会相互覆盖,导致客户端的地图报废。这简直是一场灾难)
🌏🌏
C^2M-Engine(谨慎安装)
C^2M 引擎 是一个 Fabric 模组,旨在提高 Minecraft 区块的性能具体化那便是对区块的生成,I/O,加载优化。(PL:C2ME在实测中经常出现负优化甚至崩服的现象,稳定性极差,极其不建议安装。建议使用同作者的Very Many Players)
🌏🌏
Carpet(建议安装)
地毯端对游戏进行了一些改动,让你能更好的控制游戏内容,并且能更好的理解发生了什么。移除了游戏中一些烦人的bug,提高了游戏的运行效率。在不影响游戏正常运行的情况下,地毯端提供了一些可选的游戏特性或者原版特性缺少的内容。(PL:Carpet及其拓展通常都有一些必开配置,可以向各校的生电玩家询问或者]站搜索。)
🌏
Carpet-extra (建议安装)
为地毯端添加了更多功能。
🌏
Plusls Carpet Addition (建议安装)
这是一个Carpet mod的扩展 mod。PCA 同步协议是一个用于在服务端和客户端之间同步 Entity,BlockEntity 的协议。
🌏
Gugle Carpet Addition(建议安装)
GCA提供了对假人的可视化,比起Carpet原生的操作更加人性化。(PL:感谢古镇天)
Krypton(谨慎安装)
Krypton 是一个 Fabric mod,试图优化Minecraft网络堆栈。(PL:《试图》,代价是大面积破坏协议,可能导致玩家无法登录)
🌏
LazyDFU(高版本无需)
LazyDFU 是一个优化mod,它使DataFixerUpper的初始化变得“懒惰”── 也就是说,它不会立即创建将数据从旧版本的Minecraft迁移到新版本所需的规则,直到它实际需要这样做。它不直接修改DFU,故应该能够安全使用,但毕竟还是做出了修改,还请多加小心。(PL:1.20已经包含,不再需要)
🌏
Starlight(高版本无需)
由 Tuinity 作者 Leaf 开发的光照优化 Fabric & Forge 通用Mod,对 MOJANG 的光照代码进行了完整的重写。(PL:1.20已经包含,不再需要)
🌏
Lithium(建议安装)
Lithium 是一个免费且开源的优化模组,与其它优化模组不同,Lithium 致力于着一个标准,即在不修改原版机制的前提下做出更多的优化改进,如果你想获取更激进一点的优化,可以考虑安装。(PL:实际上还是有破坏,但这些破坏大多为非常底层的破坏,普通生电玩家接触不到)
🌏
Syncmatica(建议安装)
Syncmatica 模组可以使你在服务器中与其他安装了 Syncmatica 模组的玩家一起共享投影模组的原理图及其位置。
🌏
ViaFabric(谨慎安装)
ViaFabric 是 ViaVersion 的 Fabric 实现,配合 ViaBackwards 和 ViaRewind 可以做到从 1.7.X 到最新版的 MC 客户端都可以连接你的服务器。(PL:大量服务器上报了Via全家桶对于生电协议,如Carpet精准放置协议的破坏。因此如果没有接入大厅的需求请不要安装。)
🌏
ViaBackwards(谨慎安装)
ViaBackwards 是一款多平台的服务器插件,依赖 ViaVersion 或 ViaFabric;配合 ViaRewind 可以做到从 1.7.X-1.20 都可以连接你的服务器。(PL:同上)
🌏
Carpet存在大量提供不同功能的附属,编者在此不一一列出,此外,本列表中的Mod仅仅只是推荐安装,如果您存在其他需求,也可以自行安装其它Mod,如果您不确定这些Mod的作用,也可以寻求技术人员的帮助。
编者在此安装了如下的这些Mod:
注意,这些Mod同样需要复制到Mirror和Creative文件夹中,同时,我们推荐您为Mirror和Creative安装WorldEdit,这对大量编辑方块非常有帮助。
此外我们推荐您将创造和镜像的默认模式设置为Creative,并且为创造主世界生成超平坦或者虚空世界,方便进行建设
注:即使是列表的这些Mod,也可能存在兼容性问题,并且他们可能拥有各自的前置,请自行安装
¶ 使用Velocity搭建群组服
下一步我们将使用Velocity将这些服务器连接起来,使得玩家可以自由切换。
下载最新版本的Velocity并且在你的服务器文件夹下新建一个Velocity文件夹,然后启动他。
启动方式与正常的服务器并无不同,你可以编写一个启动脚本启动他,但代理段所需的内存非常小,除非你需要安装大量插件,不然你只需要分给他512M的内存即可。
第一次启动过后,服务端会自动生成如下的文件:
lang文件夹中存放了语言文件,后缀为zh_CN的即为简体中文。
logs为启动日志,plugins为插件文件夹。
我们需要重点关注的是velocity.toml和forwarding.secret,前者是代理端配置文件,后者则是自动生成的连接密钥,用任意的文本编辑器(如记事本)就可以打开这两个文件。
我们先来关注velocity.toml的配置,这里我们将注释全部翻译,你可以根据需要修改!
配置文件版本 2023/8/13
# 配置文件版本,请勿修改!
config-version = "2.6"
# 你需要将代理端口绑定在哪个端口上,默认为25577(注意玩家最后是通过这个端口访问你的服务器的)
# 前面的IP设置为0.0.0.0代表对所有来源的IP开放,除非有多张网卡需要绑定,一般无需更改
bind = "0.0.0.0:25577"
# 服务器MOTD,显示在连接页,支持MiniMessage变量
motd = "<#09add3>A Velocity Server"
# 显示在连接页的服务器最大玩家数,不代表真实玩家数量
show-max-players = 500
# 是否开启正版验证
online-mode = true
# 是否强制使用密钥验证,如果开启,下游服务器必须有密钥才可以连入代理端
force-key-authentication = true
# 防止客户端代理连接,这可以让一些使用VPN的客户端无法连入
prevent-client-proxy-connections = false
# 我们应该传递IP地址或者其他信息到下游服务器吗?
# 可选项
# - "none": 不传递,所有玩家连接至代理端后被分配一个离线的UUID
# - "legacy": 以旧BungeeCord的标准传递玩家的UUID和IP,在1.12以下的版本的服务器使用这个选项
# - "bungeeguard": 传递玩家的IP和ID以兼容BungeeCord的方式,包括插件,如果你使用的的是1.12的版本可能无法完善网络防火墙设置,或者影响共享域名
# - "modern": 使用Velocity原生的传递方式,将传递玩家数据和UUIDs作为处理连接进程的一部分。
仅用于1.13或者更高版本的Minecraft。
player-info-forwarding-mode = "NONE"
# 如果你使用的是 modern 或者 BungeeGuard 的IP传递方式,在这里配置一个包含独特密钥的文件
# 这个密钥应使用UTF-8编码并且不是空的(应该会自动生成一份在服务器根目录)
forwarding-secret-file = "forwarding.secret"
# 广播你的服务器是否支持Forge,如果你开设了一个加入mod的服务器,建议打开
# 如果你的网络需要发送整合包的内容,建议将 ping-passthrough 的路径指向 "mods"以获得连接界面更好的显示
announce-forge = false
# 如果打开(默认是关闭的)同时代理端开启了正版验证,那么服务器就会踢出连接进程堵塞的玩家
kick-existing-players = false
# 服务器列表是否显示后端服务器的延迟
# 可选的选项:
# - "disabled": 不会进行传递。初始服务器的 velocity.toml 和 server-icon.png将决定列表ping的响应。
# - "mods": 仅从您的后端服务器传递mod列表到响应中。您的服务器列表中的第一个服务器(或强制域名)的mod列表将被使用。如果无法联系到任何后端服务器,Velocity不会显示任何mod信息。
# - "description": 使用来自后端服务器的描述和mod列表。服务器列表中的第一个服务器(或强制域名)响应将用于描述和mod列表。
# - "all": 使用后端服务器的响应作为代理响应。如果无法联系到任何服务器,则使用Velocity的配置。
ping-passthrough = "DISABLED"
# 如果未启用(默认为true),玩家的IP地址将在日志中被替换为
enable-player-address-logging = true
[servers]
# 在此配置您的服务器。每个键代表服务器的名称,值代表要连接的服务器的IP地址。
#下面是一些范例,可以使用远程服务器地址
survival = "127.0.0.1:30001"
creative = "127.0.0.1:30002"
mirror = "127.0.0.1:30003"
# 当玩家登录或从服务器被踢出时,我们应该优先连接哪些服务器。
try = [
"survival","creative"
]
[forced-hosts]
# 在此配置您的强制域名。
"lobby.example.com" = [
"lobby"
]
"factions.example.com" = [
"factions"
]
"minigames.example.com" = [
"minigames"
]
[advanced]
# 一个Minecraft数据包需要多大才进行压缩。将此设置为零将压缩所有数据包,将其设置为-1将完全禁用压缩。
compression-threshold = 256
# 压缩应该完成的程度(从0-9)。默认值为-1
compression-level = -1
# 客户端在上次连接后多快(以毫秒为单位)被允许连接?
# 默认为三秒。通过将此设置为0来禁用它。
login-ratelimit = 3000
# 在此指定连接超时的自定义超时。默认为五秒。
connection-timeout = 5000
# 在此指定连接的读取超时。默认为30秒。
read-timeout = 30000
# 启用与HAProxy的PROXY协议的兼容性。如果您不知道这是用来做什么的,那么不要启用它。
haproxy-protocol = false
# 在代理上启用TCP快速打开支持。需要代理在Linux上运行。
tcp-fast-open = false
# 在Velocity上启用BungeeCord插件消息通道支持。
bungee-plugin-message-channel = true
# 显示来自客户端的代理ping请求。
show-ping-requests = false
# 默认情况下,当用户意外地与服务器失去连接而没有明确的断开连接消息时,Velocity将尝试优雅地处理情况,通过尝试将用户回退,除非在读取超时的情况下。BungeeCord将断开用户的连接。您可以禁用此设置以使用BungeeCord的行为。
failover-on-unexpected-server-disconnect = true
# 向1.13+客户端声明代理命令。
announce-proxy-commands = true
# 启用命令的日志记录
log-command-executions = false
# 启用玩家连接到代理、切换服务器时的日志记录以及从代理断开连接。
log-player-connections = true
[query]
# 是否启用对GameSpy 4查询响应的响应。
enabled = false
# 如果开启查询,哪个端口应当用来监听查询协议
port = 25577
# 这个map名会被反馈给查询回复
map = "Velocity"
# 插件是否显示在查询回复中
show-plugins = false
需要特别注意的是[servers]和bind两个配置项,编者将Velocity端口绑定在30000,生存,创造和镜像则分别配置在30001、30002、30003。别的选项您可以按需配置,此外,如果后端服务器版本差异过大,请注意配置ping-passthrough 。
随后你就可以保存配置并启用代理端了,BungeeCord的流程类似。
而在后端的服务器,即生存,创造,镜像中,你只需要将server.properties文件中的server-port配置为你在Velocity.toml中配置的端口,server-ip配置为127.0.0.1即可(注:127.0.0.1仅本地网络中的电脑可以访问,配置为0.0.0.0则公网可访问,指定ip则多用于网卡绑定,我们一般推荐仅开放代理端至公网,再由代理端连接至后端子服务器,这样做可以大大提高网络安全性)
然后,你需要将代理端forwarding.secret文件中生成的密钥,复制到下游服务端的config/FabricProxy-Lite.toml中的secret处,这将帮助服务器验证客户端的连接是否可信。
最后,启动所有的子服务器,然后你就可以通过连接代理端端口进入服务器,并使用/server命令切换服务器了。
¶ 使用MCDR作为守护进程托管服务器
MCDReforged是一个可以在完全不对 Minecraft 服务端进行修改的情况下,通过可自定义的插件系统,提供对服务端的管理能力的工具。
作者为其提供了完整的上手教程,请在这里查看。
(PL:**警告!**你需要为每一个子服,如survival构建MCDR,而不是将上文的三个服务器丢进一个MCDR的server文件夹中!)
小至计算器、高亮玩家、b 站弹幕姬,大至操控计分板、管理结构文件、自助备份回档,都可以通过 MCDR 及相配套的插件实现。
插件仓库见:https://github.com/MCDReforged/PluginCatalogue
参考资料:
1、Paper官方文档:https://docs.papermc.io/
2、MCDR官方文档:https://mcdreforged.readthedocs.io/zh_CN/latest/index.html
本篇编者:JianMoOvO
¶ 通过JVM参数优化服务器
本篇内容可以帮助你使用同样的内存,让服务器可以承载更多玩家。
(PL:本篇的很多资料已经严重脱离时代。建议全文背诵圣经:https://github.com/brucethemoose/Minecraft-Performance-Flags-Benchmarks)
Java 语言在 JVM 的基础上隐藏了很多细节,从而让程序更关注功能而非性能。而JVM提供了很多参数选项帮助我们进行调优,通过改变这些参数,我们的Minecraft可以增加内存的使用效率,使得服务器可以承载更多玩家,对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。
一些名词解释:
GC:垃圾收集的意思(Garbage Collection)
JVM :Java Virtual Machine,Java虚拟机,所有Java程序都是划分出一定内存运行虚拟机,程序在虚拟机中执行,这也是Java语言可以跨平台的主要原因,任何一个能够安装JVM的设备都可以运行同一套代码编译成的Java程序
G1GC:类似的名词都为GC其中的一种。
JDK:Java Development Kit,Java开发工具包,包括了开发和运行Java程序的所有内容。不同厂家开发的JDK在实际的性能表现上存在一定区别。
¶ 原理分析
本段难度较高,如果看不懂可以直接跳到实际应用上.
通过对OpenJ9 和其他使用 G1 的 HotSpot 的五种JVM的测试,我们得到如下数据:
OpenJDK
Temurin
IBM Semeru
Azul Zulu JDK
Azul Zing
Chunky 用时
8 分 59 秒
9 分 15 秒
11 分 20 秒
9 分 17 秒
8 分 51 秒
平均暂停 /ms
51.3
49.68
62
55.38
-
平均 GC 间隔
8
8
3.55
7
-
对于使用G1的三种JVM,我们更关注 Young GC(Normal)和 Mixed GC 的占比,一般来说大部分 GC 应当发生在新生代,即 Young GC,有时候也叫 Normal GC。当新生代也不够用了,传统的垃圾收集器开始进行 Full GC 以回收老年代,而 G1 则对老年代进行部分回收,直到有足够用的空域内存。因此使用 G1 收集器同样也要注意是否有太多的新生代对象漏到老年代,从而因此过多的 Mixed GC 拖慢速度。频繁的 Mixed GC 带来的就是 MC 卡顿。
OpenJDK:114 次 GC 暂停中有 8 次是因为 Mixed GC
Temurin:115 次 GC 暂停中有 8 次是因为 Mixed GC
Zulu JDK:120 次 GC 暂停中有 2 次是因为 Mixed GC
单纯从Mixed GC来看,我们应当选择Zulu JDK,他产生Mixed GC的次数更少,但是从生成区块的速率上来看,Zulu JDK的速率是最慢的,猜测其采用的策略为性能换取稳定度。
而OpenJ9这一虚拟机在测试表现中尽管性能表现不佳,但是其内存占用却是最少的,在这一基础上,如果我们需要优化内存,使用的应当是OpenJ9,事实上,Minecraft社区内有大量使用OpenJDK得到更佳的服务器内存使用性能的例子,因此我们也推荐您更换OpenJ9作为JVM。
区块生成速率图
在确认了JVM性能的基础上,我们来选择究竟使用哪一家的JDK,Azul Zing是最佳的选择,如果内存较小,可以考虑 IBM Semeru,如果受商业限制,则可以考虑 Azul Zulu JDK,他们的 Mixed GC 更少,当然,Linux 发行版本自带的 OpenJDK也是可以考虑的选择,在性能测试中可以看出随着各种优化机制的接入,性能第二的就是 OpenJDK。
下一步我们来讨论调优的策略,不同的JVM参数实际上会影响到多方面的使用。越多的启动参数反而往往导致越多的性能损耗。在不了解JVM工作原理的情况下,不要随随便便增加一大堆无用的启动参数。(例如国外论坛流传的使用G1GC可以优化MC性能,尽管G1GC减少了Full GC的时间,但是会额外增加10%~30%的CPU时间占用,完全得不偿失。)
¶ 调优GC的基本步骤
在游戏中,我们也可以通过相关程序或插件分析GC的性能。
1.监控GC的状态
使用各种JVM工具,查看当前日志,分析当前JVM参数设置,并且分析当前堆内存快照和gc日志,根据实际的各区域内存划分和GC执行时间,觉得是否进行优化。
举一个例子: 系统崩溃前的一些现象:
每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4、5s
FullGC的次数越来越多,最频繁时隔不到1分钟就进行一次FullGC
年老代的内存越来越大并且每次FullGC后年老代没有内存被释放
之后系统会无法响应新的请求,逐渐到达OutOfMemoryError的临界值,这个时候就需要分析JVM内存快照dump。如果放任不管,服务端就会崩溃。
2.生成堆的dump文件
通过JMX的MBean生成当前的Heap信息,大小为一个3G(整个堆的大小)的hprof文件,如果没有启动JMX可以通过Java的jmap命令来生成该文件。
3.分析dump文件
打开这个3G的堆信息文件,显然一般的Window系统没有这么大的内存,必须借助高配置的Linux,几种工具打开该文件:
Visual VM
IBM HeapAnalyzer
JDK 自带的Hprof工具
Mat(Eclipse专门的静态内存分析工具)推荐使用
备注:文件太大,建议使用Eclipse专门的静态内存分析工具Mat打开分析。
4.分析结果,判断是否需要优化
如果各项参数设置合理,系统没有超时日志出现,GC频率不高,GC耗时不高,那么没有必要进行GC优化,如果GC时间超过1-3秒,或者频繁GC,则必须优化。
注:如果满足下面的指标,则一般不需要进行GC:
Minor GC执行时间不到50ms;
Minor GC执行不频繁,约10秒一次;
Full GC执行时间不到1s;
Full GC执行频率不算频繁,不低于10分钟1次;
5.调整GC类型和内存分配
如果内存分配过大或过小,或者采用的GC收集器比较慢,则应该优先调整这些参数,并且先找1台或几台机器进行beta,然后比较优化过的机器和没有优化的机器的性能对比,并有针对性的做出最后选择。
¶ 调优JVM参数的原则
1.针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,通常把最大、最小设置为相同的值;
2.年轻代和年老代将根据默认的比例(1:2)分配堆内存, 可以通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以针对回收代。
比如年轻代,通过 -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样,为了防止年轻代的堆收缩,我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小。
3.年轻代和年老代设置多大才算合理
1)更大的年轻代必然导致更小的年老代,大的年轻代会延长普通GC的周期,但会增加每次GC的时间;小的年老代会导致更频繁的Full GC
2)更小的年轻代必然导致更大年老代,小的年轻代会导致普通GC很频繁,但每次的GC时间会更短;大的年老代会减少Full GC的频率
如何选择应该依赖应用程序对象生命周期的分布情况: 如果应用存在大量的临时对象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。但很多应用都没有这样明显的特性。
在抉择时应该根据以下两点:
(1)本着Full GC尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道理 。
(2)通过观察应用一段时间,看其他在峰值时年老代会占多少内存,在不影响Full GC的前提下,根据实际情况加大年轻代,比如可以把比例控制在1:1。但应该给年老代至少预留1/3的增长空间。
4.在配置较好的机器上(比如多核、大内存),可以为年老代选择并行收集算法.
5.线程堆栈的设置:每个线程默认会开启1M的堆栈,用于存放栈帧、调用参数、局部变量等,对大多数应用而言这个默认值太了,一般256K就足用。
理论上,在内存不变的情况下,减少每个线程的堆栈,可以产生更多的线程,但这实际上还受限于操作系统。
¶ 实际应用
如果您没有看懂上面的一段也没有关系,但是如果您有一定的技术基础,这些内容一定可以帮助你找到JVM实际的内存使用情况,并进行针对性的优化。
如果您没有阅读上面的内容,我们也推荐您阅读一下本段。究竟使用哪一家的JDK,Azul Zing是最佳的选择,如果内存较小,可以考虑 IBM Semeru,如果受商业限制,则可以考虑 Azul Zulu JDK,他们的 Mixed GC 更少,当然,Linux 发行版本自带的 OpenJDK也是可以考虑的选择,在性能测试中可以看出随着各种优化机制的接入,性能第二的就是 OpenJDK。您可以先更换合适的JDK,我们再进一步往下讨论。
下面我们将会给出一些实际的参数供您参考。
一段基础的启动命令应当为:
java -jar server.jar
在这段命令里-jar本质就是Java的一个参数,代表运行的是jar文件,也就是说我们下文讨论的所有参数都应当加载-jar之前。
¶ 首先应当指定的参数(必读)
* -Xms JVM使用的最小内存
* -Xmx JVM使用的最大内存
注意事项:
不要让 Xmx 完全占用你机器的全部内存,这样会导致其他程序无法运行,系统也会需要一定内存。
保证这两个值相同,如果Xms低于Xmx,那么未使用的内存就被浪费了。而G1的内存越多,运行效果就越好。G1自适应地选择给每个区域多少内存来优化。
调优GC行为的基本思想是确保对象尽快清除,G1的内存越多,就能将垃圾尽快清除。
¶ 一些通用的应该加入的参数
* -XX:+AggressiveOpts 尽可能的使用更多对性能有帮助的优化功能(仅JAVA8)
* -XX:+UseCompressedOops指针压缩,可以减少一定的内存占用(仅JAVA8,64位才支持)
* -XX:+UseG1GC 使用G1GC,如果分配的内存大于等于4GB,建议使用
¶ 其他可选加入的参数
见下表:
参数及其默认值
描述
-XX:-DisableExplicitGC
禁止调用System.gc();但jvm的gc仍然有效
-XX:+MaxFDLimit
最大化文件描述符的数量限制
-XX:+ScavengeBeforeFullGC
新生代GC优先于Full GC执行
-XX:+UseGCOverheadLimit
在抛出OOM之前限制jvm耗费在GC上的时间比例
-XX:-UseConcMarkSweepGC
对老生代采用并发标记交换算法进行GC
-XX:-UseParallelGC
启用并行GC
-XX:-UseParallelOldGC
对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用
-XX:-UseSerialGC
启用串行GC
-XX:+UseThreadPriorities
启用本地线程优先级
-XX:LargePageSizeInBytes=4m
设置用于Java堆的大页面尺寸
-XX:MaxHeapFreeRatio=70
GC后java堆中空闲量占的最大比例
-XX:MaxNewSize=size
新生成对象能占用内存的最大值
-XX:MaxPermSize=64m
老生代对象能占用内存的最大值
-XX:MinHeapFreeRatio=40
GC后java堆中空闲量占的最小比例
-XX:NewRatio=2
新生代内存容量与老生代内存容量的比例
-XX:NewSize=2.125m
新生代对象生成时占用内存的默认值
-XX:ReservedCodeCacheSize=32m
保留代码占用的内存容量
-XX:ThreadStackSize=512
设置线程栈大小,若为0则使用系统默认值
-XX:+UseLargePages
使用大页面内存
¶ 直接可以使用的案例(抄作业)
下面是可以直接抄的作业,但如果你真的能看懂原理并自行查找JVM的内存回收存在的问题,您应该可以根据本篇内容自行添加参数。
对于高版本Java可直接应用的参数,如果您的玩家数量很多且使用超过10GB的内存,您可能需要调整以下内容:
-XX:G1MaxNewSizePercent=60
-XX:G1NewSizePercent=40
java -Xms<视情况> -Xmx<视情况> -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 -Dusing.aikars.flags=mcflags.emc.gs -jar <服务端名称>.jar
对于Java8可用的参数
java -Xms<视情况> -Xmx<视情况> -server -XX:-UseVMInterruptibleIO -XX:NewRatio=3 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=4 -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+UseBiasedLocking -XX:+CMSParallelRemarkEnabled -XX:MaxGCPauseMillis=50 -XX:+UseAdaptiveGCBoundary -XX:-UseGCOverheadLimit -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=15 -XX:+DisableExplicitGC -Xnoclassgc -oss4M -ss4M -XX:CMSInitiatingOccupancyFraction=60 -XX:SoftRefLRUPolicyMSPerMB=2048 -jar
参考资料:
1、aikar的JVM调优教程:https://aikar.co/category/minecraft/
2、针对 Minecraft 的 JVM 调优:https://developer.aliyun.com/article/1079907/
3、Reddit论坛贴:Java VMS and You:How to reduce your ram and cpu
4、Minecraft中文wiki:架设服务器
编者:JianMoOvO
¶ 使用Geyser实现基岩互通并接入外置登陆
Geyser(间歇泉)是一项能够允许基岩版玩家加入Java版Minecraft服务器的技术,他能够将Java服务器的内容对应翻译为基岩版服务器的内容,通过这项技术我们能够允许基岩版玩家加入高校服务器及联合大厅。
本篇内容将会呈现完整的间歇泉搭建教程并接入外置登陆。
¶ 搭建间歇泉
首先,我们需要下载间歇泉。如果你使用了外置登录,请于此处下载仍然支持 Mojang 账号登录的 Geyser。这里有一个简易的自动更新脚本,会在 Geyser 重启时自动更新,如果你会一点 Python 可以尝试更换代理 / 更换 Geyser 类型 / 加上定时重启。
间歇泉官方提供了多种服务端的支持,您只需要选择对应的插件版本下载即可,另外,群组服仅需要在Velocity/BungeeCord/Waterfall 上安装即可,不需要在下游服务端进行安装。当然,如果出现了兼容性问题,又或者你需要加入的服务器并不属于你,你可以选择Standalone版本,这是一个独立的服务端,他可以允许你自行指向其他的Java服务器,如果条件允许,我们也非常推荐您使用此版本,便于维护。
Standalone版本更适合外置登陆,同时它也允许端口穿透等功能,本篇教程将会以此版本为教学。插件版的配置方法与此版本完全相同,您可以参照本篇进行搭建。
首先,下载最新的Standalone版本,按照正常的服务端启动方式对他进行启动。间歇泉需要的内存非常非常少,512M即可,除非你开设的是一个超大型服务器,不然无需担忧内存使用。
初次启动后关闭,我们会得到这些文件。
我们需要关注的就是config.yml,这是间歇泉的配置文件,你需要重点关注**bedrock**和**remote**的配置项。
当然我们在这里也附上所有配置项的中文版本供您参考
# --------------------------------
# 间歇泉配置文件
#
# Minecraft: Bedrock Edition 和 Minecraft: Java Edition 之间的桥梁。
#
# GitHub: https://github.com/GeyserMC/Geyser
# Discord:https://discord.gg/geysermc
# --------------------------------
bedrock:
# 将侦听连接的 IP 地址。
# 通常,只有当您想限制哪些 IP 可以连接到您的服务器时,才应该取消注释并更改此设置。
#address:0.0.0.0
# 将侦听连接的端口(UDP)
port: 19132
# 某些托管服务会在您每次启动服务器时更改您的 Java 端口,并且需要将相同的端口用于基岩。
# 此选项使基岩端口与每次启动服务器时 Java 端口相同。
# 此选项仅适用于插件版本。
clone-remote-port: false
# 将广播给 Minecraft: Bedrock Edition 客户端的 MOTD。如果“clone-remote-motd”设置为 true,则无关紧要
# 如果其中任何一个为空,则相应的字符串将默认为“Geyser”
motd1: "Geyser"
motd2: "Another Geyser server."
# 将发送到 Minecraft: Bedrock Edition 客户端的服务器名称。这在暂停菜单和设置菜单中都可见。
server-name: "Geyser"
# 将网络流量压缩到基岩客户端的多少。数字越大,使用的 CPU 使用率越高,但是
# 使用的带宽越小。在低于 -1 或高于 9 时没有任何影响。设置为 -1 表示禁用。
compression-level: 6
# 是否为客户端启用 PROXY 协议。除非运行 UDP 反向代理,否则您不需要此功能
# 在您的间歇泉实例前面。
enable-proxy-protocol: false
# 允许的代理协议代代理 IP 地址/子网的列表。仅在启用“启用代理协议”时有效,并且
# 实际上应该只在您无法使用适当的防火墙时使用(通常与共享托管服务提供商等相同)。
# 将此列表留空表示没有 IP 地址白名单。
# 同时支持 IP 地址和子网。
# proxy协议白名单 IPS: [ “127.0.0.1”, “172.18.0.0/16” ]
remote:
# 远程(Java 版)服务器的 IP 地址
# 如果是“auto”,对于独立版本,远程地址将设置为 127.0.0.1,
# 对于插件版本,建议将其保留为“auto”,以便 Geyser 自动配置地址、端口和身份验证类型。
# 如果安装了floodgate,则保留为“auto”。
address: auto
# 远程(Java 版)服务器的端口
# 对于插件版本,如果地址已设置为“auto”,则端口也将跟随服务器的侦听端口。
port: 25565
# 认证类型。可以是离线、在线或floodgate(见 https://github.com/GeyserMC/Geyser/wiki/Floodgate)。
# 对于插件版本,建议将“地址”字段保留为“auto”,以便自动配置 Floodgate 支持。
# 如果安装了 Floodgate 并且 'address: ' 设置为 “auto”,则会自动使用 “auth-type: floodgate”。
auth-type: online
# 允许通过间歇泉使用基于密码的身份验证方法。仅在联机模式下有用。
# 如果这是false,用户必须使用Geyser在其桌面上提供的代码对Microsoft进行身份验证。
allow-password-authentication: true
# 连接到服务器时是否启用 PROXY 协议。
# 这仅在以下情况下有用:
# 1)您的服务器支持代理协议(可能不支持)
# 2) 您在代理的主配置中启用选项的情况下运行 Velocity 或 BungeeCord。
# 如果你不知道这是什么,就不要碰它!
use-proxy-protocol: false
# 将基岩客户端用来连接的主机名转发到 Java 服务器
# 这旨在用于代理上的强制主机
forward-hostname: false
# Floodgate 使用加密来确保从授权来源使用。
# 这应该指向 Floodgate 生成的公钥(BungeeCord、Spigot 或 Velocity)
# 不使用 Floodgate 时可以忽略这一点。
# 如果您在同一台服务器上使用插件版本的 Floodgate,则会自动从 Floodgate 中获取密钥。
floodgate-key-file: key.pem
# 仅适用于在线模式身份验证类型。
# 存储登录后应保存其 Java 版帐户的基岩玩家列表。
# 这会保存一个令牌,以后可以重复使用该令牌对玩家进行身份验证。这不会保存电子邮件或密码,
# 但是在添加到此列表并允许其他人访问此间歇泉实例的文件时,您仍然应该谨慎。
# 从此列表中删除名称将在下次间歇泉启动时删除其缓存的登录信息。
# 保存令牌的文件与此配置位于同一文件夹中,名为“saved-refresh-tokens.json”。
saved-user-logins:
- ThisExampleUsernameShouldBeLongEnoughToNeverBeAnXboxUsername
- ThisOtherExampleUsernameShouldAlsoBeLongEnough
# 指定用户授权间歇泉访问其Microsoft帐户时等待的秒数。
# 在此期间,允许用户断开与服务器的连接。
pending-authentication-timeout: 120
# 如果给出很多命令,基岩客户端在第一次打开命令提示符时可能会冻结。
# 禁用此功能将阻止发送命令建议并解决基岩客户端的冻结问题。
command-suggestions: true
# 以下三个选项启用“ping passthrough” - 从 Java 服务器检索 MOTD、玩家计数和/或协议名称。
# 将 MOTD 从远程服务器中继到基岩玩家。
passthrough-motd: false
# 中继协议名称(例如 BungeeCord [X.X],Paper 1.X) - 仅在使用自定义协议名称时才真正有用!
# 这也将显示在 MCSrvStatus 等网站上。
passthrough-protocol-name: false
# 将玩家数量和最大玩家数从远程服务器中继到基岩玩家。
passthrough-player-counts: false
# 启用传统 ping 直通。除非您的 MOTD 或玩家计数未正确显示,否则无需启用此功能。
# 此选项在独立设备上不执行任何操作。
legacy-ping-passthrough: false
# ping 远程服务器的频率,以秒为单位。仅与独立或旧版 ping 直通相关。
# 如果您遇到连接超时错误,请增加。
ping-passthrough-interval: 3
# 是否将玩家 ping 转发到服务器。虽然启用此功能将使基岩玩家拥有更准确的
#ping,它也可能导致玩家更容易超时。
forward-player-ping: false
# 可以连接的最大玩家数量。目前这只是视觉效果,实际上并不限制玩家数量。
max-players: 100
# 如果调试消息应该通过控制台发送
debug-mode: false
# 允许第三方cape可见。目前允许:
# OptiFine capes、LabyMod capes、5Zig capes 和 MinecraftCapes
allow-third-party-capes: false
# 允许第三方 deadmau5 ears可见。目前允许:
# Minecraft capes
allow-third-party-ears: false
# 允许发送虚假的冷却时间指示器。否则基岩玩家不会看到冷却时间,因为他们仍然使用1.8战斗。
# 请注意:如果开启了冷却时间,部分用户在冷却序列中可能会看到一个黑框,如下所示:
# https://cdn.discordapp.com/attachments/613170125696270357/957075682230419466/Screenshot_from_2022-03-25_20-35-08.png
# 可以通过进入辅助功能选项卡下的基岩设置并将“文本背景不透明度”设置为 0 来禁用此功能
# 此设置可以设置为“title”、“actionbar”或“false”
show-cooldown: title
# 控制是否向玩家显示坐标。
show-coordinates: true
# 基岩玩家是否被阻止执行脚手架式桥接。
disable-bedrock-scaffolding: false
# 如果设置,当基岩玩家执行任何表情时,它将交换副手和主手物品,就像 Java 版键绑定一样
# 有三个选项可以设置为:
# 禁用 - 默认/回退,不应用此解决方法
# 无表情 - 表情不会发送给其他基岩客户端,并且会随手交换。这有效地禁用了所有表情的可见。
# 表情符号和副手 - 表情符号将被发送给基岩客户,副手将被交换
emote-offhand-workaround: "disabled"
# 默认语言环境,如果我们没有客户端请求的语言环境。取消注释以不使用默认系统语言。
# 默认语言环境:en_us
# 指定图像将缓存到磁盘的天数,以保存从互联网下载图像的时间。
# 禁用值 0。(默认值:0)
cache-images: 0
# 允许显示自定义头骨。保持启用状态可能会导致较旧/较弱的设备的性能下降。
allow-custom-skulls: true
# 每个玩家要显示的最大自定义头骨数量。增加此值可能会降低较弱设备上的性能。
# 将其设置为 -1 将导致显示所有自定义头骨,无论距离或数量如何。
max-visible-custom-skulls: 128
# 显示自定义头骨的玩家周围方块半径。
custom-skull-render-distance: 32
# 是否在游戏中添加(目前仅)熔炉矿车作为单独的物品,这在基岩版中通常不存在。
# 仅当使用不使用服务器交换的“传输数据包”样式的代理时,才需要禁用此功能。
# 如果禁用此选项,熔炉矿车物品将映射到料斗矿车物品。
# 此选项需要重新启动间歇泉才能更改其设置。
add-non-bedrock-items: true
# 基岩阻止在下界建造和显示 Y127 以上的方块。
# 此配置选项通过将下界维度 ID 更改为结束 ID 来解决此问题。
# 这样做的主要缺点是整个下界将具有相同的红色雾,而不是每个生物群系都有不同的雾。
above-bedrock-nether-building: false
# 强制客户端加载所有资源包(如果有)。
# 如果设置为 false,则允许用户连接到服务器,即使他们没有
# 想要下载资源包。
force-resource-packs: true
# 允许解锁 Xbox 成就。
# 这将禁止所有命令在游戏中成功运行基岩,否则基岩认为你在作弊。
xbox-achievements-enabled: false
# 服务器是否记录玩家 IP 地址。
log-player-ip-addresses: true
# 是否提醒控制台和操作员有支持基岩版本的新间歇泉版本
# 此间歇泉版本不支持。建议保持启用此选项,因为许多基岩平台
# 自动更新。
notify-on-new-bedrock-update: true
# 使用哪个物品来标记基岩玩家物品栏中不可用的插槽。这方面的例子是在创意中的 2x2 制作网格,
# 或自定义库存菜单,其大小与通常的 3x9 不同。屏障块是默认项。
unusable-space-block: minecraft:barrier
# bStats 是一个完全匿名的统计跟踪器,只跟踪基本信息
# 关于间歇泉,例如有多少人在线,有多少服务器在使用间歇泉,
# 正在使用什么操作系统等。您可以在此处了解有关bStats的更多信息:https://bstats.org/。
# https://bstats.org/plugin/server-implementation/GeyserMC
metrics:
# 是否应启用指标
enabled: true
# 服务器的 UUID,不要更改!
uuid: 88d62c14-cab2-4ea3-a1df-1832c146434e
#高级选项 - 除非您知道自己在做什么,否则不要触摸!
# 间歇泉在每个记分牌数据包后更新记分牌,但当间歇泉尝试处理
# 每秒大量记分牌数据包可能会导致严重的延迟。
# 此选项允许您指定每秒多少记分牌数据包
# 记分牌更新将限制为每秒四次更新。
scoreboard-packet-threshold: 20
# 允许来自 ProxyPass 和 Waterdog 的连接。
# 请参阅 https://www.spigotmc.org/wiki/firewall-guide/ 以获取帮助 - 使用 UDP 而不是 TCP。
enable-proxy-connections: false
# 互联网支持的最大 MTU 为 1492,但可能会导致数据包分段问题。
# 1400 是默认值。
mtu: 1400
# 是否直接连接到 Java 服务器而不创建 TCP 连接。
# 仅当与数据包或网络接口的插件无法与间歇泉正常工作时,才应禁用此功能。
# 如果在插件版本上启用,则忽略远程地址和端口部分
# 如果在插件版本上禁用,预计性能会降低和延迟会增加
use-direct-connection: true
# 间歇泉是否应该尝试禁用基岩播放器的压缩。这应该是一个好处,因为不需要压缩数据
# 当 Java 数据包未通过网络处理时。
# 这要求使用直接连接为真。
disable-compression: true
config-version: 4
在bedrock项下,我们需要配置port,这是基岩版访问的端口,注意,此端口需要以UDP协议开放,当然你可以将clone-remote-port设置为true,这样使用的端口就会与 Java 一致,但此端口需要同时放行TCP/UDP 协议。同时你也可以配置 Motd 和 Servername,他们都会显示在基岩版的界面中,当然也可以将passthrough-motd设置为true以直接使用 Java 版服务器的 Motd。
而 remote 项则决定了连接的 Java 服务器,address项可以是域名或者 ip,port 则是服务器使用的端口,auth-type则需要与 Java 服务器同步,如果 Java 服务器开启了online-mode,那么此项就需要设置为online。
当你配置完此部分后,此时已经可以访问 Java 版服务器了,此时使用微软账号或 Mojang 账号就可以进入 Java 版服务器了,其他配置项也可以按需要更改。
SITMC 和 YSUMC 的间歇泉入口
通过 SITMC 的基岩版联合大厅入口访问联合大厅主大厅
如果您使用了外置登陆或者 Floodgate,请继续往下阅读。
¶ 使用外置登陆并接入联合大厅
对 MUA 的各高校来说,有很大一部分都是用了外置登陆,因此,允许外置登陆加入服务器成为了一个迫切的需求,间歇泉配置外置登陆的步骤与其他服务器并无不同,如果是插件版本,你只需要为安装了间歇泉的服务端安装authlib-injector,或者为间歇泉的Standalone 版本安装authlib-injector,关于 authlib-injector 的配置方法,你可以查看上文。
随后,启动游戏并连入间歇泉,此时外置登陆就可以直接使用了,选择使用mojang账号登录并输入账号密码即可。
但这里有一些注意事项:
你应当使用 PL 提供的分支版本,原版的 Geyser 已经删除了 Mojang账号的选项
auth-type应设置为online
不应当添加任何的saved-user-logins
allow-password-authentication应设置为true
¶ 接入联合大厅
对于接入了联合大厅的学校,你可以参照以下内容允许间歇泉同时加入联合大厅
1、首先,配置一个二级域名使用A解析指向你的游戏服务器IP地址,如be.test.com,这个二级域名不应当与你的Java版二级域名相同。此外,如果您使用代理端,应当有一个二级域名直接连接至联合大厅,如果并没有可以选择使用MUA的联合大厅官方地址。
2、随后,在frp配置文件中修改domain的相关部分,如下所示
meta_domain =
meta_domain_alias = ["<基岩版联合大厅二级域名>"]
meta_forced_hosts = ["<显示在联合大厅的标签名>"]
3、将remote.address设置为您的meta_domain(确保可以连入联合大厅),remote.port设置为对应端口,考虑到各学校均采用cname或srv解析指向联合大厅,端口应使用25565,remote.forward-hostname应设置为true
4、最后开启间歇泉即可,此时服务器应当已经接入联合大厅,并可以同步联合大厅force host
编者:JianMoOvO