本教程是建立在您已经能够架设一个Minecraft Java版服务器的基础上进行教学的,在本篇中,我们会深入讨论群组、模组服、生电服架设,MCDR、MCSM等守护进程的使用,Java优化,报错解决等各方面的Minecraft Java版服务器运维知识。
如果您还无法独立架设一个Minecraft Java版服务器,请先阅读基础篇的相关知识,在进阶篇中我们将不再讨论基础的技术细节。您可以通过目录查找您需要的技术教程。
此外,编者水平有限,难免会出现错误和遗漏,如果您发现任何问题,或者您有任何其他的教程希望我们推出,都可以随时联系我们。
当然,有任何问题您也可以随时在MUA各群聊中询问,我们非常乐意提供咨询和技术援助。
注:本篇将以篇章为单位持续更新,每篇的编者和参考资料都会附在最后,如果有需要可以自行查看
外置登录是能够截取正版登录的验证方式,并允许服务器管理者自行验证玩家账户可信度的方案,目前外置登录的主流方案是authlib-injector,目前MUA联合认证使用的也是此方案,本篇教程将会教学如何为服务器配置authlib-injector。
您需要拥有服务器的完整管理权限,包括对启动参数进行修改。
此外您需要搭建自己的皮肤站以提供验证(如果您高校没有自己的皮肤站,可以使用MUA官方皮肤站统一认证),皮肤站搭建教程见此处。
-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 选项, 则该功能默认启用.
启用后, 则可以使用名为 <username>@mojang 的虚拟角色来调用对应正版角色的皮肤.
例如,
- /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://<host>:<port>
这一代理仅作用于 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
参考资料:
本篇内容将讲解如何架设一个包含生存,创造以及镜像的Minecraft Fabric服务端,这类服务端搭建的服务器常常被称作生电服,它为红石技术提供了一些方便的功能,同时我们将使用MCDR作为守护进程,这个程序在不修改Minecraft的基础上提供了一些好用的功能。
首先我们需要搭建一个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和Velocity 1.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
文件夹,然后启动他。
启动方式与正常的服务器并无不同,你可以编写一个启动脚本启动他,但代理段所需的内存非常小,除非你需要安装大量插件,不然你只需要分给他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地址将在日志中被替换为<ip address withheld>
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
命令切换服务器了。
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
本篇内容可以帮助你使用同样的内存,让服务器可以承载更多玩家。
(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 卡顿。
单纯从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的性能。
1.监控GC的状态
使用各种JVM工具,查看当前日志,分析当前JVM参数设置,并且分析当前堆内存快照和gc日志,根据实际的各区域内存划分和GC执行时间,觉得是否进行优化。
举一个例子: 系统崩溃前的一些现象:
之后系统会无法响应新的请求,逐渐到达OutOfMemoryError的临界值,这个时候就需要分析JVM内存快照dump。如果放任不管,服务端就会崩溃。
2.生成堆的dump文件
通过JMX的MBean生成当前的Heap信息,大小为一个3G(整个堆的大小)的hprof文件,如果没有启动JMX可以通过Java的jmap命令来生成该文件。
3.分析dump文件
打开这个3G的堆信息文件,显然一般的Window系统没有这么大的内存,必须借助高配置的Linux,几种工具打开该文件:
备注:文件太大,建议使用Eclipse专门的静态内存分析工具Mat打开分析。
4.分析结果,判断是否需要优化
如果各项参数设置合理,系统没有超时日志出现,GC频率不高,GC耗时不高,那么没有必要进行GC优化,如果GC时间超过1-3秒,或者频繁GC,则必须优化。
注:如果满足下面的指标,则一般不需要进行GC:
5.调整GC类型和内存分配
如果内存分配过大或过小,或者采用的GC收集器比较慢,则应该优先调整这些参数,并且先找1台或几台机器进行beta,然后比较优化过的机器和没有优化的机器的性能对比,并有针对性的做出最后选择。
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使用的最大内存
注意事项:
* -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 <jar文件> nogui
参考资料:
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(间歇泉)是一项能够允许基岩版玩家加入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 等网站上。<mcsrvstat.us>
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账号登录
并输入账号密码即可。
但这里有一些注意事项:
auth-type
应设置为online
saved-user-logins
allow-password-authentication
应设置为true
对于接入了联合大厅的学校,你可以参照以下内容允许间歇泉同时加入联合大厅
1、首先,配置一个二级域名使用A解析指向你的游戏服务器IP地址,如be.test.com
,这个二级域名不应当与你的Java版二级域名相同。此外,如果您使用代理端,应当有一个二级域名直接连接至联合大厅,如果并没有可以选择使用MUA的联合大厅官方地址。
2、随后,在frp配置文件中修改domain
的相关部分,如下所示
meta_domain = <JAVA版联合大厅二级域名>
meta_domain_alias = ["<基岩版联合大厅二级域名>"]
meta_forced_hosts = ["<显示在联合大厅的标签名>"]
3、将remote.address
设置为您的meta_domain
(确保可以连入联合大厅),remote.port
设置为对应端口,考虑到各学校均采用cname或srv解析指向联合大厅,端口应使用25565,remote.forward-hostname
应设置为true
4、最后开启间歇泉即可,此时服务器应当已经接入联合大厅,并可以同步联合大厅force host
编者:JianMoOvO