扩大
缩小

MC群组服开服教程系列三: 代理端搭建

代理端的选择

服务器人数太多话,单靠一个核心paper是扛不住的,我们需要一个代理端来分散用户,比如一个paper作为生存一区,一个paper作为生存二区,这样就通过代理端来分散用户流量到不同的核心paper。

可选择的代理端还是比较少的,主要有以下几个。

  • BungeeCord
  • Waterfall
  • Velocity

BungeeCord

这玩意是spigotmc团队制作的,算是最原始的代理端了吧,非常经典款的,插件生态完善。

官方地址: bc

Waterfall

这个是paper团队fork Bungeecord的,加入了很多优化能力,兼容BungeeCode的所有插件吧。

官方地址: wf

Velocity

这个paper团队自研的代理端,转发性能优越。插件生态还不行。

官方地址: vc

代理对比

代理端 适合场景
bungeecode 简单 快速入门,资料比较全面
waterfall 后端为paper的场景,代理端需要安装很多插件的
velocity 代理端不需要安装复杂插件的

 

我们这个教程系列后端paper的,代理端后面需要安装很多插件,我们选择Waterfall。

Java环境安装

java环境安装,我们在前面的教程配置过了,这里主要上个链接吧。

MC群组服开服教程系列一: 核心端搭建

WaterFall的下载安装

WaterFall的官方教程: https://docs.papermc.io/waterfall/getting-started

具体操作如下:

# 进入文件夹
cd /home/mc/instances/
# 创建代理目录waterfall
mkdir wf
# 进入目录
cd wf/
# 下载最新版本的wf
wget https://api.papermc.io/v2/projects/waterfall/versions/1.19/builds/510/downloads/waterfall-1.19-510.jar
# 查看下载的
ll
# 重命名下,方便配合管控脚本
mv waterfall-1.19-510.jar  wf.jar
# 启动wf
java -jar wf.jar

 

其中效果如下

[root@mc wf]# java -jar wf.jar
[11:20:21 INFO]: Using mbed TLS based native cipher.
[11:20:21 INFO]: Using zlib based native compressor.
[11:20:21 INFO]: Enabled Waterfall version git:Waterfall-Bootstrap:1.19-R0.1-SNAPSHOT:13085b9:510
[11:20:21 INFO]: Not on Windows, attempting to use enhanced EpollEventLoop
[11:20:21 INFO]: Epoll is working, utilising it!
[11:20:21 INFO]: Discovered module: ModuleSpec(name=cmd_alert, file=modules/cmd_alert.jar, provider=JenkinsModuleSource())
[11:20:21 INFO]: Discovered module: ModuleSpec(name=cmd_find, file=modules/cmd_find.jar, provider=JenkinsModuleSource())
[11:20:21 INFO]: Discovered module: ModuleSpec(name=cmd_list, file=modules/cmd_list.jar, provider=JenkinsModuleSource())
[11:20:21 INFO]: Discovered module: ModuleSpec(name=cmd_send, file=modules/cmd_send.jar, provider=JenkinsModuleSource())
[11:20:21 INFO]: Discovered module: ModuleSpec(name=cmd_server, file=modules/cmd_server.jar, provider=JenkinsModuleSource())
[11:20:21 INFO]: Discovered module: ModuleSpec(name=reconnect_yaml, file=modules/reconnect_yaml.jar, provider=JenkinsModuleSource())
[11:20:21 INFO]: Attempting to update plugin from null to ModuleVersion(build=510, git=13085b9)
[11:20:21 INFO]: Attempting to Jenkins download module cmd_alert v510
[11:20:22 INFO]: Download complete
[11:20:22 INFO]: Attempting to update plugin from null to ModuleVersion(build=510, git=13085b9)
[11:20:22 INFO]: Attempting to Jenkins download module cmd_find v510
[11:20:22 INFO]: Download complete
[11:20:22 INFO]: Attempting to update plugin from null to ModuleVersion(build=510, git=13085b9)
[11:20:22 INFO]: Attempting to Jenkins download module cmd_list v510
[11:20:22 INFO]: Download complete
[11:20:22 INFO]: Attempting to update plugin from null to ModuleVersion(build=510, git=13085b9)
[11:20:22 INFO]: Attempting to Jenkins download module cmd_send v510
[11:20:23 INFO]: Download complete
[11:20:23 INFO]: Attempting to update plugin from null to ModuleVersion(build=510, git=13085b9)
[11:20:23 INFO]: Attempting to Jenkins download module cmd_server v510
[11:20:23 INFO]: Download complete
[11:20:23 INFO]: Attempting to update plugin from null to ModuleVersion(build=510, git=13085b9)
[11:20:23 INFO]: Attempting to Jenkins download module reconnect_yaml v510
[11:20:23 INFO]: Download complete
[11:20:23 INFO]: Loaded plugin reconnect_yaml version git:reconnect_yaml:1.19-R0.1-SNAPSHOT:13085b9:510 by WaterfallMC
[11:20:23 INFO]: Loaded plugin cmd_find version git:cmd_find:1.19-R0.1-SNAPSHOT:13085b9:510 by WaterfallMC
[11:20:23 INFO]: Loaded plugin cmd_server version git:cmd_server:1.19-R0.1-SNAPSHOT:13085b9:510 by WaterfallMC
[11:20:23 INFO]: Loaded plugin cmd_alert version git:cmd_alert:1.19-R0.1-SNAPSHOT:13085b9:510 by WaterfallMC
[11:20:23 INFO]: Loaded plugin cmd_send version git:cmd_send:1.19-R0.1-SNAPSHOT:13085b9:510 by WaterfallMC
[11:20:23 INFO]: Loaded plugin cmd_list version git:cmd_list:1.19-R0.1-SNAPSHOT:13085b9:510 by WaterfallMC
[11:20:23 WARN]: Forced host server pvp is not defined
[11:20:23 INFO]: Enabled plugin reconnect_yaml version git:reconnect_yaml:1.19-R0.1-SNAPSHOT:13085b9:510 by WaterfallMC
[11:20:23 INFO]: Enabled plugin cmd_find version git:cmd_find:1.19-R0.1-SNAPSHOT:13085b9:510 by WaterfallMC
[11:20:23 INFO]: Enabled plugin cmd_server version git:cmd_server:1.19-R0.1-SNAPSHOT:13085b9:510 by WaterfallMC
[11:20:23 INFO]: Enabled plugin cmd_alert version git:cmd_alert:1.19-R0.1-SNAPSHOT:13085b9:510 by WaterfallMC
[11:20:23 INFO]: Enabled plugin cmd_send version git:cmd_send:1.19-R0.1-SNAPSHOT:13085b9:510 by WaterfallMC
[11:20:23 INFO]: Enabled plugin cmd_list version git:cmd_list:1.19-R0.1-SNAPSHOT:13085b9:510 by WaterfallMC
[11:20:23 INFO]: Listening on /0.0.0.0:25577
View Code

添加登录和生存分区

我们上个主城分区已经使用paper搭建了一个启动在33301的端口上的,我们复制下文件夹,启动一个登录分区和生存分区。

具体操作如下,这里只仅仅演示dl分区的操作,生存分区同理。

# 从主城的paper复制出来给登陆区
cp -r zc dl
# 进入登录分区目录
cd dl/
# 查看文件
ll
# 删除世界文件
rm -rf world world_nether/ world_the_end/
# 命名下,适配管理脚本
mv zc.jar  dl.jar
# 修改端口,避免冲突
sed -i 's@server-port=33301@server-port=33300@g' server.properties
# 进入sysv管理目录
cd /etc/init.d/
# 查看文件
ll
# 创建链接
ln -s /home/mc/github/mc/scripts/sysv/mc_control mc_dl
# 重载sysv文件
systemctl daemon-reload
# 启动登录分区
systemctl restart mc_dl
# 查看启动状态
systemctl status mc_dl
# 查看启动日志。
tail -f /home/mc/instances/dl/logs/latest.log

代理端配置分区操作

现在为止,我们已经有个wf(代理端)+dl(登陆分区)+zc(主城分区)+sc1(生存1区),下面就讲讲如何配置代理端来完成分区移动操作。

变更diff

修改代理的config文件,让代理端可以连接到正确的登陆分区和主城分区。

 

 修改的这几个参数简单说明下:

  • priorities: 设置下优先级,可以设置多个,让代理选择接收到用户请求,优先给转发到那个服务器。
  • max_players: 最大玩家数量,会显示在用户多人游戏界面里面的,这个只是个显示,可以随意写的。
  • groups: 控制哪些id应该归属那些组,bc是md_5这个作者开发的,我们需要换成我们自己的ID, 不过后面我们会采用其他的权限系统管理,这种自带的权限系统使用僵硬的很。
  • server: 就是控制每个分区的, 核心是地址和名字。

效果测试

 

 

我们可以看到,进入游戏后,我们可以输入/server指令后提示我们当前在登陆分区,另外提示我们可以通过/server dl 进入登录分区, 输入/server zc进入主城区域。

进行跨区操作

 

分区加以区别

我们现在进入分区,没法知道当前分区是主城还是登录分区的。 我们先用木牌标记下。后面我们在通过其他的分区插件来标识。

先通过终端给我们自己添加一个管理权限

[root@mc ~]# /etc/init.d/mc_zc conn "op panda"
mc=zc
[root@mc ~]# /etc/init.d/mc_dl conn "op panda"
mc=dl

 

 游戏内会有这个提示的,我们通过游戏的/gamemode creative启用下创造模式,放置一些木牌。

 

关于转发

我们启动好了代理端,也配置了2个分区,通过/server 指令可以完成分区切换了, 还有个关键的信息没有弄,那就是用户ip信息和UUID等信息的转发透传。也就是代理需要将信息透传给下面的代理端。

具体配置参考官方文档:

具体操作需要下面2个步骤。

  1. 在代理端的config.yml 设置enable_ip_forward 为true。
  2. 在后端的paper服务spigot.yml中,设置bungeecord为true。

 

WF重要配置说明

这个部分可以不着急看的,有需要了可以在看的。

water的配置文件分为2个部分,一个部分是BC的配置文件,一个是WF的配置文件,2个都会被WF使用到的。

BC配置文件说明: https://www.spigotmc.org/wiki/bungeecord-configuration-guide/

WF配置文件说明: https://docs.papermc.io/waterfall/configuration

常见问题

 

BC配置说明

配置文件还是看官方文档比较靠谱,我这里只是简单翻译和使用的经验推荐。

enforce_secure_profile: 如果设置为true,没有mojang签名公钥的玩家将无法连接到服务器。
query_port: UDP查询的启用端口。
motd: 多人游戏提示界面的信息。
tab_list: TAB按键的效果,GLOBAL_PING显示群组玩家的ping值,GLOBAL显示ping值,但是不会更新的,SERVER只是显示一个分区的。
query_enabled: 是否启用UDP的查询能力
proxy_protocol: 让你有能力支持haproxy过来的代理情况,如果你不知道你在做什么,请不要改这个配置项。
forced_hosts: 特定域名过来的直接进入特定分区。这个是默认的pvp.md-5.net: pvp,用户从pvp.md-5.net这个域名连接代理端,会被分配到pvp 这个server分区。
ping_passthrough: 默认客户端ping的是代理端,设置true会ping穿透代理到我们的默认server的,motd也会是默认server的提示。不推荐改。
priorities: 优先级,用户连接到代理端,具体那个分区是优先的。可以指定多个,如果第一个挂了,代理端会送用户连接你指定第二个分区的。
bind_local_address: 绑定本地地址127.0.0.1的监听。
host: 监听主机和端口,默认0.0.0.0是代表本机的所有ip的。
max_players: 服务器指定的最大用户数量,会在用户连接的时候显示的。
tab_size: tab页面显示的最大用户数量。
force_default_server: 这个配置项还是很关键的,如果是true,用户断开代理端在此连接,代理端会将用户放置到priorities指定的分区,
如果为false,用户断开代理端在此连接,代理端会将用户放置到用户上次最后所在的分区。建议设置为true,将登陆分区放置到priorities。
remote_ping_cache: 使用服务器的缓存,而不是每次ping都真的去给下游的分区进行一次ping. -1表示不使用缓存,人多的话可以开启下
network_compression_threshold: 这个官方也没有给说明,看名字应该是一个网络包最大值。
permissions: 权限,默认他给分了2个组,一个默认组一个管理,分别给了不同的权限。后面我们使用权限组件在详细说明吧。
log_pings: 日志记录ping
connection_throttle_limit: 限流能力,如果一个用户在一旦一个IP在connection_throttle毫秒内连接了connection_throttle_limit次,它必须等待connection_throttle毫秒才能再次尝试连接。
server_connect_timeout: BungeeCord在取消连接之前将尝试连接玩家到服务器的时间(以毫秒为单位)。
timeout: 在关闭所有连接之前,BungeeCord代理应该无响应多长时间。
stats: 这个是bstat插件进行统计插件使用量的一个唯一ID,不用动他。
player_limit: 限制最大的玩家数量,这个是真的限制配置,上面的max_player只是显示值。
ip_forward: 是否转发用户ip信息+UUID信息。 需要开启的。这样后端的server看到的ip就是用户的客户端ip而不是代理端的127.0.0.1的ip地址。
groups: 设置用户和组的映射关系,上面的配置permissions是组合权限的映射关系的。后面通过权限插件来详细说明。
remote_ping_timeout: BungeeCord在取消连接之前尝试ping服务器以获得玩家个数的时间(以毫秒为单位)。
connection_throttle: 连接超限等待的时间,配合connection_throttle_limit一起使用。
log_commands: 启用命令记录,这里主要是代理端能执行的命令,你在具体分区执行的/give是不会记录的需要再具体分区看。
online_mode: 启用正版认证
forge_support: 选择你的BungeeCord实例是否支持Forge客户端。
disabled_commands: 设置全局禁用命令,可以设置一些指令禁止玩家查看你的插件列表的。后面有系列专门讲。
servers: 设置一个一个分区的。paper端,fabric端,原生mc服务端都可以的。
key名字: 就是可以/server key名字 进入特定分区的,建议弄成拼音或者英文简写。
motd: 提示信息,好像没啥用。
address: 后端分区的地址信息,ip+port的,建议配置127.0.0.1本机地址。而不是公网地址。
restricted: 组织默认玩家进入特定分区,除非明确指定你有特定分区权限。
 
 
 

posted on 2023-01-14 12:58  LinuxPanda  阅读(1084)  评论(0编辑  收藏  举报

导航