本帖最后由 SkyCatcher 于 2015-5-28 22:22 编辑

因水平所限,本教程中可能出现一些翻译或说明不到位,如果我的教程有什么错误,欢迎跟帖指出!
(请勿PM咨询任何关于BungeeCord跨服的技术问题,我并不提供技术维护,所以此类私信一概不回复)
索引
本文主要翻译解读跨服群组中比较重要的部分,所以会省略一些内容,具体内容请阅读原文Wiki
入门指南详细介绍
内容下载
插件开发

BungeeCord跨服群组搭建标准教程
前言
BungeeCord跨服群组是很流行的一种分布式部署Minecraft服务端从而提高服务器硬件资源利用率的技术。现在已经有很多关于BC群组的教程帖,水平参差不齐,其中有部分教程帖不仅是描述不清晰,甚至在某些地方有错误的描述,从而误导了很多人。
我这篇教程帖主要基于BungeeCord官方Wiki,对其中重要的部分进行翻译和解读,来帮助想要搭建跨服群组的服主来更深刻的理解其中每一项配置的作用。
因为本文的主要内容是基于官方Wiki,所以有可能不适合新手服主来阅读,以后我可能会根据情况来写深入浅出的快速搭建指引专供新手阅读。
使用BC跨服群组后,会产生很多潜在的安全漏洞,关于BungeeCord群组的安全漏洞,请阅读我的另一篇帖子:http://www.mcbbs.net/thread-399234-1-1.html
(请勿PM咨询任何关于BungeeCord跨服的技术问题,我并不提供技术维护,所以此类私信一概不回复)
索引
本文主要翻译解读跨服群组中比较重要的部分,所以会省略一些内容,具体内容请阅读原文Wiki
入门指南详细介绍
内容下载
插件开发
BungeeCord跨服群组简介
BungeeCord是什么?
BungeeCord是一个由SpigotMC团队编写的用于连接客户端和多个服务端之间的网络代理。当你使用了BC以后,玩家是看不出来群组服务器和普通服务器有什么区别的
BungeeCord是如何工作的?
当玩家连入BC代理端时,BC会将玩家信息发送到子服务器,玩家可以使用一些命令来在不同的子服务器之间无缝迁移,从而省去了退出A服务器,然后点击加入B服务器的步骤。通过使用BC跨服代理,你可以将无限数量的子服务器连接在一起成为一个网络集群一样的群组服务器。
为了便于理解,我做了一幅简单的BC工作模式说明图

首先是玩家用客户端登陆BungeeCord代理服务端(这个服务端本身只是起一个网络转发的作用,它本身并不会创建地图,也就是说单独开启BC服务端是无法登入的),然后BungeeCord代理服务端会把你的数据转发到子服务器上面,子服务器就是普通的spigot/carftbukkit/cauldron等服务端,假设我们在这里有“登陆服、生存服、游戏服”三个服务端,并且将“登陆服”设置为默认登陆到的服务器,那么当玩家连入BC代理端时,就会进入到“登陆服”
然后玩家可以使用一些命令在“登陆服”、“生存服”、“游戏服”之间互相跳转,而这个跳转过程就和单服内多世界的切换一样,玩家并不会感觉到其实他到了另一个服务器内
最下面的数据库是当你有一些特殊需要,例如需要同步所有服务器的背包、玩家的Home/Spawn/Tpa/Warp时,需要用MySQL等数据库来作为数据的中转站。如果你只是想要使用跨服聊天、跨服星门传送等简单功能,并不需要数据库的支持!
BungeeCord的优势
- BungeeCord可以通过把玩家分散到多个服务器,来降低CPU的负荷,并且充分利用多核CPU(众所周知MC服务端虽然支持多核心,但是对它的利用并不是很好。使用BungeeCord跨服技术可以让每个服务端的主线程都使用到单独的核心,提升整体负载能力)
- 你可以把不同的游戏内容搭载到不同的子服务器上面,例如一个服务器开生存模式,一个服务器开创造模式,而且不同服务器的背包等数据还可以不互通
本帖最后由 SkyCatcher 于 2016-3-17 22:01 编辑
在Linux上安装BungeeCord
前3步与Windows是一致的,第4步的时候不是创建一个.bat文件,而是创建一个.sh文件,里面的代码内容如下
复制代码这里没用绝对路径,而是直接用“java”,也就是说你需要将java添加到系统环境变量内
然后执行这个启动文件即可
建议:如果你在Linux下面运行,请安装screen或者同类软件,以便于你断开远程SSH连接的时候后台仍然能正常运行
在Mac OS X上安装BungeeCord
目测没多少人需要在这个系统下面开服,所以不做翻译了,想要了解的话可以点击这里阅读原文
在Multicraft网页面板上安装BungeeCord
一些其他的事项和建议
BungeeCord安装指引
在Windows上安装BungeeCord
- 首先你需要在服务器上面安装Java7或者更高版本(点击这里下载安装)
- 然后点击这里下载BungeeCord的对应版本的主程序和模块
我们可以在这个网页的左下角看到很多“#数字”这种格式的列表,这个是不同版本的构建,你需要挑选适合你子服务器(不明白什么是子服务器?看上面一楼的图)的BungeeCord代理端版本。
#985以上的版本是给1.8的服务端用的(事实上1.7也能用)
#985 = 1.7
#701 = 1.6.4
#666 = 1.6.2
#548 = 1.5.2
#386 = 1.5.0
#251 = 1.4.7
在这里我们以#1068为例来介绍,点进去
最上面的“BungeeCord.jar”是BC端的主程序,下面的橙色框里面的几个是BC端的模块,我们将它们一起下载下来 - 然后我们新建一个文件夹(名称随意,例如命名为“BC端”),把刚刚下载的这几个jar文件放进去,然后在里面再新建一个文件夹并重命名为“modules”,把上图中的那几个“模块”移动到这个文件夹内
- 在这个“BC端”文件夹内新建一个文本文档并重命名为“启动BC端.bat”(把后缀名一起改掉),然后右键这个文件,选择“编辑”,在里面输入以下内容然后保存关闭
其中“你的java路径”需要看你把java装到了什么文件夹,如果你是装到了“C:\Program Files\Java\jre7\bin\java.exe”,那你的完整代码就是:复制代码- @echo off
- 你的java路径 -Xmx256M -Xincgc -jar BungeeCord.jar
- pause
这里说明一下,-Xmx256M中的“256M”是你分配给BC端的最大内存,你可以调整为其他值,设置多少合理将在下面说明。-Xincgc参数是开启java的内存回收机制复制代码- @echo off
- "C:\Program Files\Java\jre7\bin\java.exe" -Xmx256M -Xincgc -jar BungeeCord.jar
- pause
- @echo off
- 双击“启动BC端.bat”即可打开BungeeCord代理,在BC的后台输入命令“/end”(注意:不是/stop)即可将其关闭
在Linux上安装BungeeCord
前3步与Windows是一致的,第4步的时候不是创建一个.bat文件,而是创建一个.sh文件,里面的代码内容如下
- #!/bin/sh
- cd "$(dirname "$0")"
- java -Xmx256M -jar BungeeCord.jar
然后执行这个启动文件即可
建议:如果你在Linux下面运行,请安装screen或者同类软件,以便于你断开远程SSH连接的时候后台仍然能正常运行
在Mac OS X上安装BungeeCord
目测没多少人需要在这个系统下面开服,所以不做翻译了,想要了解的话可以点击这里阅读原文
在Multicraft网页面板上安装BungeeCord
- 如果你的服务端选项里面已经有BungeeCord,那么你可以直接选择相应版本并且开启,然后再租其他的服务器作为子服务器
- 如果你的服务端选项中没有BungeeCord,那么你可以通过FTP将下载到的“BungeeCord.jar”上传到你的服务器,然后将其重命名为你的服务商设定的名称,这样就可以将BungeeCord启动了,然后再租其他的服务器作为子服务器
- 一些服务商并不允许你运行BungeeCord,你应该提前咨询好这些问题
一些其他的事项和建议
- 设置最大内存的建议:每多500人就多增加512M内存的分配,当然如果你用了BC端的插件,你也得考虑这些插件的内存占用
- 建议在Linux生产环境下运行BungeeCord
- 如果你使用Multicraft,请下载他们推荐的配置文件:http://www.multicraft.org/download/conf/?file=bungeecord.jar.conf
- 请将你子服务端目录下的“bukkit.yml”中的“connection-throttle”一项的数值修改为“-1”
- 请将你子服务端目录下的“server.properties”中的“server-ip”一项的值修改为“127.0.0.1”(原因请参见另一篇关于漏洞解析的帖子)
- 为了提高安全性,请确保你的服务器防火墙阻断了玩家直接连入后端服务器的请求(最好只给你的BC端开放唯一一个外网端口)
- 添加服务器列表页图标的方式和普通服务器一样,放一个64*64像素的png文件到BC端文件夹即可,图片名称是“server-icon.png”
- 如果你想获取到正版玩家的UUID,请在BungeeCord的“config.yml”中设置“ip_forward: true”,并使用spigot/cauldron作为子服务端,然后在“spigot.yml”中设置“bungeecord: true”
本帖最后由 SkyCatcher 于 2016-10-26 13:32 编辑

我们可以看到其中“config.yml”就是BungeeCord端的配置文件,“plugins”是BC端的插件目录,你可以将BC端的插件放入这个文件夹
接下来我就详细介绍下config.yml文件中的每个参数
注意:本文件请保持为UTF-8编码(即使在Windows服务器),否则一旦出现中文将发生报错
groups
默认值:
复制代码描述:这里可以设置BungeeCord的玩家权限,其中“md_5”是玩家名,下面的“admin”是权限组,权限组拥有哪些权限可以在下面进行设置。BungeeCord群组的admin权限组和子服务器下GroupManager插件中的admin并没有什么联系,也就是说BungeeCord权限系统和CraftBukkit权限系统是并行的两套系统。即使你是BungeeCord的群组管理员,也并没有游戏服务器的OP权限,反之亦然。
如果你不想设置BungeeCord群组管理员(为了安全起见),那么请将这里修改为:复制代码
disabled_commands
默认值:复制代码描述:通过设置此项内容,你可以禁用游戏中的一些命令,例如你想要禁用/glist ,就需要这样编辑:复制代码
player_limit
默认值:-1
描述:群组最大人数上限,设置-1即为不限制,这里设置的数值是真实上限数值,而不是显示数值
stats
默认值:随机字符串
描述:匿名发送统计数据到MCStats,请勿修改此项的值
permissions
默认值:复制代码描述:在这里可以设置BungeeCord的权限表,default组是所有玩家默认的权限,你可以新增或删除权限组,或者为它们分配BC插件的权限。
注意:这个权限系统和Bukkit权限系统无关,请不要把Bukkit插件的权限写到这里来。
listeners
默认值:
复制代码描述:监听选项,下面详细介绍
max_players
默认值:1
描述:这是BC群组所显示的最大人数上限,并不是真实值(真实值在player_limit一项中设置),即使玩家在线人数超过这里的数字,也可以正常进入服务器
fallback_server
默认值:lobby
描述:如果默认服务器不可用,玩家会被移动到这个服务器
host
默认值:0.0.0.0:25577
描述:设置服务器的IP和端口(即玩家在客户端里面输入的端口号)。0.0.0.0表示接受从所有IP地址发来的数据,例如服务器是双线双IP的,那么请填0.0.0.0。后面的端口号如果设置为25565,玩家在连入服务器的时候就不需要填端口号。建议设置为:
复制代码
bind_local_address
默认值:true
描述:是否把BC端和你服务器通讯的IP地址设置为BC端监听的地址,如果你的服务器没有多个IP的话,这一项没什么意义
ping_passthrough
默认值:false
描述:是否穿透BC直接获取后端服务器ping信息,例如motd和人数等。开启后将无视BC端设置的motd等信息
tab_list
默认值:GLOBAL_PING
描述:这里有三个选项供选择:
GLOBAL_PING: 显示玩家连接到BC代理端的延迟.
GLOBAL: 同上,但是不会更新ping的数值.
SERVER: 显示玩家连接到当前所在的服务器的延迟.
注意:1.8版本的BungeeCord只能工作在SERVER状态下,即使你填的是前两个选项
default_server
默认值:lobby
描述:玩家第一次进入BC群组时,连接到的服务器,一般设置为登陆服
forced_hosts
默认值:pvp.md-5.net: pvp
描述:设置域名绑定,例如你设置了个叫做pvp的服务器,它的地址是127.0.0.1:26666,那么现在你把pvp.md-5.net这个域名在DNS那里设置A记录指向你服务器的时候,你的玩家使用“pvp.md-5.net”登陆服务器后默认就到了端口为26666的子服务器了,也就是说这个功能是为你的域名和端口做了个绑定
tab_size
默认值:60
描述:按Tab键的时候,显示的玩家列表总容量。60的时候是三列,80的时候是四列
force_default_server
默认值:false
描述:如果设置为true,玩家每次登陆到BC群组时,都会进入你设置的默认服务器(一般是登陆服);如果设置为false,那么玩家加入BC群组时会进入上次退出的服务器
motd
默认值:"Another Bungee Server"
描述:客户端多人联机游戏列表显示的服务器介绍,颜色符号是&,无需转为unicode,请使用UTF-8编码
query_enabled
默认值:false
描述:是否启用UDP查询
query_port
默认值:25577
描述:UDP查询端口
timeout
默认值:30000
描述:设置无响应多少毫秒后BungeeCord会关闭这个连接
connection_throttle
默认值:4000
描述:设置客户端每隔多少毫秒才可以重新连接一次服务器
servers
默认值:复制代码描述:设置BungeeCord后端的子服务器端口和信息。
“lobby”是服务器名,将在BC命令和BC插件中使用;
“address”是子服务器的地址,如果设置为127.0.0.1:25500,就是连入在同一台电脑上面开启的端口为25500的子服务器;
“restricted”如果设置为true,那么没有“bungeecord.server.服务器名”权限的玩家将无法连入这个子服务器;
“motd”仍然是客户端列表看到的服务器介绍
你可以按这个格式在这里添加多个服务器,例如:复制代码
ip_forward
默认值:false
描述:是否启用真实IP和UUID转发功能。本功能需要后端的子服务器为spigot服务端或者cauldron(MCPC+)服务端,并且在其“spigot.yml”中设置“bungeecord: true”。两边都开启后,后端服务器可以获得玩家的真实IP和UUID,两边任何一边没开启,将导致后端服务器获取的IP全部是127.0.0.1,UUID是离线模式下的UUID
online_mode
默认值:true
描述:是否开启正版验证,设置为true后,只允许正版玩家登陆服务器
BungeeCord配置表详细介绍(config.yml)
首先需要运行一次BC端来让其生成配置文件,双击“启动BC端.bat”就可以了

我们可以看到其中“config.yml”就是BungeeCord端的配置文件,“plugins”是BC端的插件目录,你可以将BC端的插件放入这个文件夹
接下来我就详细介绍下config.yml文件中的每个参数
注意:本文件请保持为UTF-8编码(即使在Windows服务器),否则一旦出现中文将发生报错
groups
默认值:
- groups:
- md_5:
- - admin
如果你不想设置BungeeCord群组管理员(为了安全起见),那么请将这里修改为:
- groups: {}
disabled_commands
默认值:
- - disabledcommandhere
- - glist
player_limit
默认值:-1
描述:群组最大人数上限,设置-1即为不限制,这里设置的数值是真实上限数值,而不是显示数值
stats
默认值:随机字符串
描述:匿名发送统计数据到MCStats,请勿修改此项的值
permissions
默认值:
- permissions:
- default:
- - bungeecord.command.server
- - bungeecord.command.list
- admin:
- - bungeecord.command.alert
- - bungeecord.command.end
- - bungeecord.command.ip
- - bungeecord.command.reload
注意:这个权限系统和Bukkit权限系统无关,请不要把Bukkit插件的权限写到这里来。
listeners
默认值:
- - max_players: 1
- fallback_server: lobby
- host: 0.0.0.0:25577
- bind_local_address: true
- ping_passthrough: false
- tab_list: GLOBAL_PING
- default_server: lobby
- forced_hosts:
- pvp.md-5.net: pvp
- tab_size: 60
- force_default_server: false
- motd: '&1Another Bungee server'
- query_enabled: false
- query_port: 25577
max_players
默认值:1
描述:这是BC群组所显示的最大人数上限,并不是真实值(真实值在player_limit一项中设置),即使玩家在线人数超过这里的数字,也可以正常进入服务器
fallback_server
默认值:lobby
描述:如果默认服务器不可用,玩家会被移动到这个服务器
host
默认值:0.0.0.0:25577
描述:设置服务器的IP和端口(即玩家在客户端里面输入的端口号)。0.0.0.0表示接受从所有IP地址发来的数据,例如服务器是双线双IP的,那么请填0.0.0.0。后面的端口号如果设置为25565,玩家在连入服务器的时候就不需要填端口号。建议设置为:
- 0.0.0.0:25565
bind_local_address
默认值:true
描述:是否把BC端和你服务器通讯的IP地址设置为BC端监听的地址,如果你的服务器没有多个IP的话,这一项没什么意义
ping_passthrough
默认值:false
描述:是否穿透BC直接获取后端服务器ping信息,例如motd和人数等。开启后将无视BC端设置的motd等信息
tab_list
默认值:GLOBAL_PING
描述:这里有三个选项供选择:
GLOBAL_PING: 显示玩家连接到BC代理端的延迟.
GLOBAL: 同上,但是不会更新ping的数值.
SERVER: 显示玩家连接到当前所在的服务器的延迟.
注意:1.8版本的BungeeCord只能工作在SERVER状态下,即使你填的是前两个选项
default_server
默认值:lobby
描述:玩家第一次进入BC群组时,连接到的服务器,一般设置为登陆服
forced_hosts
默认值:pvp.md-5.net: pvp
描述:设置域名绑定,例如你设置了个叫做pvp的服务器,它的地址是127.0.0.1:26666,那么现在你把pvp.md-5.net这个域名在DNS那里设置A记录指向你服务器的时候,你的玩家使用“pvp.md-5.net”登陆服务器后默认就到了端口为26666的子服务器了,也就是说这个功能是为你的域名和端口做了个绑定
tab_size
默认值:60
描述:按Tab键的时候,显示的玩家列表总容量。60的时候是三列,80的时候是四列
force_default_server
默认值:false
描述:如果设置为true,玩家每次登陆到BC群组时,都会进入你设置的默认服务器(一般是登陆服);如果设置为false,那么玩家加入BC群组时会进入上次退出的服务器
motd
默认值:"Another Bungee Server"
描述:客户端多人联机游戏列表显示的服务器介绍,颜色符号是&,无需转为unicode,请使用UTF-8编码
query_enabled
默认值:false
描述:是否启用UDP查询
query_port
默认值:25577
描述:UDP查询端口
timeout
默认值:30000
描述:设置无响应多少毫秒后BungeeCord会关闭这个连接
connection_throttle
默认值:4000
描述:设置客户端每隔多少毫秒才可以重新连接一次服务器
servers
默认值:
- lobby:
- address: localhost:25565
- restricted: false
- motd: '&1Just another BungeeCord - Forced Host'
“lobby”是服务器名,将在BC命令和BC插件中使用;
“address”是子服务器的地址,如果设置为127.0.0.1:25500,就是连入在同一台电脑上面开启的端口为25500的子服务器;
“restricted”如果设置为true,那么没有“bungeecord.server.服务器名”权限的玩家将无法连入这个子服务器;
“motd”仍然是客户端列表看到的服务器介绍
你可以按这个格式在这里添加多个服务器,例如:
- servers:
- login:
- address: 127.0.0.1:25560
- restricted: false
- motd: '&b这是登陆服务器'
- survival:
- address: 127.0.0.1:25561
- restricted: false
- motd: '&c这是生存服务器'
- game:
- address: 127.0.0.1:25561
- restricted: false
- motd: '&c这是游戏服务器'
ip_forward
默认值:false
描述:是否启用真实IP和UUID转发功能。本功能需要后端的子服务器为spigot服务端或者cauldron(MCPC+)服务端,并且在其“spigot.yml”中设置“bungeecord: true”。两边都开启后,后端服务器可以获得玩家的真实IP和UUID,两边任何一边没开启,将导致后端服务器获取的IP全部是127.0.0.1,UUID是离线模式下的UUID
online_mode
默认值:true
描述:是否开启正版验证,设置为true后,只允许正版玩家登陆服务器
BungeeCord命令详解
在Bukkit服务端使用BungeeCord命令
虽然这个并不是BC端的默认功能,但是你可以通过安装一个BungeeCord和配套的Bukkit插件来实现这个功能,例如让命令方块执行BungeeCord端的命令。插件介绍和下载地址请点这里
BungeeCord命令和使用权限
/alert <信息>
权限节点:bungeecord.command.alert
用途:发送一条整个群组的公告,会显示在所有的子服务器内。颜色符是&,使用&h 可以清除所有默认的格式
默认使用者:群组管理员
/alertraw <json格式的信息>
权限节点:bungeecord.command.alert
用途:和上一个命令一样,但是仅允许使用json格式的内容
默认使用者:群组管理员
/bungee
权限节点:无
用途:显示BungeeCord的版本信息
默认使用者:所有玩家
/end
权限节点:bungeecord.command.end
用途:关闭BungeeCord代理端,类似于Bukkit服务器下的/stop
默认使用者:群组管理员
/find <玩家名>
权限节点:bungeecord.command.find
用途:确认指定玩家是否在线和他现在在哪个子服务器内
默认使用者:群组管理员
/glist
权限节点:bungeecord.command.list
用途:显示所有的子服务器和每个服务器当前在线人数
默认使用者:所有玩家
/greload
权限节点:bungeecord.command.reload
用途:重载BungeeCord代理端的配置文件,将重新载入子服务器列表、监听选项和一些配置项目,但是不会重载BC端插件和权限
默认使用者:群组管理员
/ip <玩家名>
权限节点:bungeecord.command.ip
用途:查看指定玩家的真实连接IP
默认使用者:群组管理员
/perms
权限节点:无
用途:显示你拥有的权限和所在权限组
默认使用者:所有玩家
/send <玩家名/current/all> <目标子服务器名>
权限节点:bungeecord.command.send
用途:将指定玩家移动到目标子服务器,使用“current”将会把你所在服务器的所有玩家移动到目标服务器,使用“all”将会把整个群组下的玩家移动到目标服务器。子服务器名就是你在“config.yml”的“servers”下面设置的服务器名
默认使用者:群组管理员
/server [子服务器名]
权限节点:bungeecord.command.server
用途:传送到指定子服务器,这个权限默认是高于Bukkit插件权限的,也就是说玩家可以在未登录之前使用此命令跳转到另外一个服务器,如果另外的服务器没登陆插件,那么通过此方法就可以使用到OP账号
默认使用者:所有玩家