【腾讯云的1001种玩法】搭建属于自己的Minecraft服务器

首先,本人是一只喜欢瞎折腾的咸鱼,带有轻微的强迫症,同时也是Minecrafter。 然而别人创建好的xxxx懒人/整合服务端有时候并不是自己喜欢的东西,在强迫症和好动症的逼迫下自己瞎折腾出一套适合自己的Minecraft服务端。

前提

  1. 服务端运行环境为JVM,因此不限于操作系统平台,我在这里选用了Debian Linux,其他发行版更替相应专有命令即可
  2. Minecraft官方服务端可以在官网得到,但是存在可玩性不高并且游戏模式单一的缺陷,因此我选用了大众化的Spigot服务端(十分感谢md5酱的贡献)
  3. 由于个人服务器同时在线人数也不多,选用1个CPU1G内存的足够达到本人要求,因此所有环境基于1C1G的CVM

OK开搞

至于CVM基本内容这里就不赘述了,为了方便起见需要有root权限以及方便远程连接的普通用户。

安装java运行环境以及tmux(我比较喜欢直接安装jdk,如果没有需求或者介意存储空间的童鞋可以考虑jre),tmux用于方便管理服务器console,这里就一起安装好:

root@Mercury:~# aptitude install openjdk-7-jdk tmux

完成之后可以查看java版本是否正确安装:

root@Mercury:~# java -version
java version "1.7.0_121"
OpenJDK Runtime Environment (IcedTea 2.6.8) (7u121-2.6.8-2~deb8u1)
OpenJDK 64-Bit Server VM (build 24.121-b00, mixed mode)

添加运行MC服务的Linux用户:

root@Mercury:~# useradd -m -s /bin/zsh minecraft

我习惯于使用zsh,这里可以不指定,直接使用系统默认shell,-m参数创建用户主目录,不需要设置密码。

现在直接切换到minecraft用户,切换到主目录:

root@Mercury:~# su minecraft
Mercury% cd
Mercury% pwd
/home/minecraft

这时候最好创建一个spigot工作目录,下载最新版本的BuildTools:

mkdir spigot
cd spigot
wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar

下载完成之后运行,可以根据自己需求制定--rev参数,若不指定就是最新版本:

java -jar BuildTools.jar --rev 1.11.2

经历时间取决于网络状态,一般几分钟到十几分钟左右。 好了,现在可以去泡杯茶了。 完工之后没有任何报错,可以看到在spigot目录下有了spigot-1.11.2.jar这个文件:

ls -l spigot*
-rw-r--r-- 1 minecraft minecraft 24534618 Mar  3 17:59 spigot-1.11.2.jar

准备开服

现在创建MC服务运行的根目录,我选在/home/minecraft/server

cd ~
mkdir server
cp spigot/spigot-1.11.2.jar ./server/
cd server

先手动执行一次:

java -Xmx512M -Xms512M -jar spigot-1.11.2.jar

参数-Xmx512M -Xms512M设置jvm运行时最大和初始化内存,可以根据在线人数更改为1G或者更多,spigot推荐值是1G。

这时出现提示:

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

当然了,去看一下eula.txt这个文件:

懒癌晚期当然没去看人家eula,直接改为eula=trueOK~

好了,为了方便起见,开服当然需要一个脚本,我命名为start.sh

#!/bin/sh
trap "exit" 2
while true
do
java -Xmx512M -Xms512M -jar spigot-1.11.2.jar
done

trap "exit" 2 是在console中如果捕获到ctrl-c就退出脚本。

万事俱备,只欠东风:

chmod +x start.sh
./start.sh

看到这里就表示我们的服务开好了:

第一次开启生成地图需要的时间比较长,后面再启动时就会很快。然而我们现在没有安装任何插件,还是很普通的一个裸服。在实用的时候,开服务必用minecraft用户先打开一个tmux session再运行start.sh,这样可以保证随时随地很方便地管理控制台,避免了有时手滑不小心杀掉了java进程。

在日常游戏中我们可能会使用很多插件,而当服务器环境搭建好之后安装兼容的插件是一件很容易的事情了,我这里列举一些我在使用的插件:

# 本地认证管理
AuthMe.jar
# Essential系列,必备插件
EssentialsAntiBuild.jar  
EssentialsGroupManager.jar  
EssentialsProtect.jar  
EssentialsGeoIP.jar
Essentials.jar
EssentialsSpawn.jar
# 谁动了我的箱子
lockette.jar
# 谁动了我的地盘
Residence.jar
# 谁动了我的钱
Vault.jar
# 让砍树成为一件轻松的事
ChopTree3.jar
# 喜欢RPG么,来试试这个
mcMMO.jar
SkinsRestorer-v12.9.7.jar  
WorldEdit.jar

配置

为了适合腐竹们不同的需求,spigot的默认配置显然不能满足所有人,我们一点一点来配置。 首先分析服务端根目录下的server.properties文件,这是minecraft server默认提供的配置文件,这里简要说明一下部分参数的含义:

#Minecraft server properties
gamemode=0
# 游戏模式,0=生存,1=创造,2=极限
difficulty=1
# 游戏难度,默认为1,0为和平,不同难度会影响一些怪物的行为
pvp=true
# 允许pvp,如果不想玩家互掐的话可以关了
max-players=5
# 最大玩家数量,限制同时可以在线的玩家数目,默认20
network-compression-threshold=128
# 封包压缩阈值,超过这个大小的封包进行压缩,适当改小可以减少网络延迟,默认256
server-port=25590
# 服务端监听哪个端口,默认25565,防止其他人陌生人扫描或者尝试登录可以改成其他值
server-ip=
# java监听IP,默认全部IP,多网卡服务器可以指定一个
view-distance=10
# 游戏中视野距离,影响玩家在游戏中的可见距离,越大越占用服务器资源,在spigot.yml中的配置会覆盖这里
online-mode=true
# online模式,防止盗版用户连接服务器
level-seed=
# 地图种子,留空会随机生成一个,如果有好图可以指定
motd=A Minecraft Server
# 服务器motd,喜欢什么写什么

spigot会有一套自己的配置文件spigot.yml,这里简要说明一下可以优化的项目,其他偏好设置一般默认即可:

entity-tracking-range:
默认值: players: 48  animals: 48   monsters: 48   misc: 32   other: 64

实体追踪距离,可以认为是实体可见范围,对服务器性能影响不是特别大,如果有配置较低的客户端可以适当减小数值。

entity-activation-range:
默认值:animals: 32   monsters: 32   misc: 16

实体活跃范围,将会根据这个设置来确定实体是否被计算。misc一般指掉落物品,可以适当改小获得性能提升,另外moster如果过于小会导致难度大幅降低,在人数少的服务器上可以把animals和misc设置为16和8,保证难度。

hopper:
默认值 hopper-transfer: 8 hopper-check: 1  hopper-amount: 1

控制漏斗速度,如果有熊孩子制造了大量的漏斗传送,那么身为腐竹可以考虑修改这个参数。transfer确定漏斗在传送物品的tick间隔;amount确定一次性传送多少个物品;check参数可以认为是空漏斗扫描上层空间的间隔,如果hopper-alt-ticking设为false,那么这个参数将会失效。例如,如果想将漏斗设置为一次传送3个物品但是总效率不变的话,可以把hopper-transfer设置为24,hopper-amount设置为3。

random-light-updates:
默认值:false

随机光照更新,服务器会随机选取一些chunk修正光照,1.7之后也控制是否在初始tick重新计算chunk光照,设置为false可以大幅提升性能。

max-entity-collisions:
默认值:8

实体碰撞阈值,设置更小的值可以减少过于密集的实体群造成服务器卡顿的现象,可以设置为2。

view-distance
默认值:10

spigot.yml中的配置会覆盖掉server.propertiesview-distance的配置,服务器会根据这个值来加载区块,加载区块的数量和视距是二次方增长关系,因此可以设置为6或者7,人数很多的情况下可以设置为4或者5。如果视距过于小的话会导致在游戏中地图边缘消失、显示不正常的问题。

max-bulk-chunks
默认值:10

每个TCP封包传送多少个chunk,我之前抓包测试,感觉在通信过程很多包都是TCP报头占用了大小,适当提高数值可以减小网络压力,在按照流量计算的情况下会略微减缓流量消耗,可以设置为16,如果设置过大可能会导致客户端崩溃。

单人在线时服务器的负载情况:

在1C1G的环境下,同时3-5人同时在线没有熊孩子行为的正常游戏,CPU利用率峰值一般会在40%-50%左右(这个锅java不背),除掉一些系统基本服务和CVM的服务插件占用,基本游戏性能完全满足。当然很多插件的配置也会多少影响到服务器的性能,但是只要插件不涉及密集实体群,高频电路等,主要的性能影响还是在spigot基本配置之中。 这样一个环境完美地解决了个人电脑运行服务器电费高、运营商对个人用户提供的上传带宽不足以及服务器管理复杂等诸多问题。

服务器地图备份

游戏服务器运行在CVM上数据安全性当然很高,但是也避免不了有时手滑保不住数据,一旦地图数据没了,花了很多天辛辛苦苦盖好的大房子还要重来实在是一件很坑爹的事。 毕竟从快照恢复也不见得能够适合所有场景,那么我们自己简单的做一个腐竹自用备份好了,当然这个备份和服务器运行环境处于同一块虚拟盘上面,有条件的话可以将备份文件保存在另外一块虚拟数据盘上面:

#!/bin/sh

# MC server目录
MC=/home/minecraft/server
# 设置需要备份的world,如果有多个world按需添加
WORLD=$MC/world
NETHER=$MC/world_nether
ENDER=$MC/world_the_end

# 备份文件存放路径
BAK_DIR=$MC/../mcworldbak
if [ ! -e $BAK_DIR ]
then
  mkdir $BAK_DIR
elif [ ! -d $BAK_DIR ]
then
  echo not a directory $BAK_DIR
  exit 1
fi

date=`date +%Y%m%d`

# 按照日期打包地图文件
tar -czf $BAK_DIR/world-$date.tar.gz $WORLD $NETHER $ENDER

# 删除15天以前的旧备份
find $BAK_DIR -mtime +15 -exec rm {} \;

完成之后可以把脚本添加到minecraft用户crontab根据需要定期运行。因为服务器开的时间越久,熊孩子们扩展的地图面积越大,地图文件需要的存储空间也越大,所以一般每3-5天执行一次也可以,必要的时候也可以手动执行一次备份。 shell小白欢迎各路大神批评指正~

流量监控统计

本人咸鱼,购买的是按照使用流量付费的CVM(我才不会说是因为上线人少时间不长所以固定带宽不划算),即使在云控制台可以监控网络IO流量,但是统计并不是很直观,所以需要直接统计MC服务所消耗的流量,原理是利用Linux iptables的统计。

因为懒,没开什么别的服务,就没有配置任何防火墙规则:

iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

现在开始配置流量统计:

iptables -A INPUT -p tcp -m tcp --dport 25590
iptables -A OUTPUT -p tcp -m tcp --sport 25590

指定这两条规则并没有添加任何-j参数,就是什么都不做,只是统计。

查看一下现在的统计情况:

iptables -L -vnx
Chain INPUT (policy ACCEPT 596 packets, 44446 bytes)
    pkts      bytes target     prot opt in     out     source               destination
       0        0            tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:25590

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 551 packets, 105537 bytes)
    pkts      bytes target     prot opt in     out     source               destination
       0        0            tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:25590

可以看到现在都是0,因为没有产生任何流量。

现在做个简单的测试,打开客户端连接到服务器,再来看一下:

iptables -L -vnx
Chain INPUT (policy ACCEPT 7587 packets, 462745 bytes)
    pkts      bytes target     prot opt in     out     source               destination
    3858   176744            tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:25590

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 8326 packets, 2938336 bytes)
    pkts      bytes target     prot opt in     out     source               destination
    4943  2258942            tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:25590

可以明显的看到pkts和bytes增加了一些。

那么,为了方便直观,我们再来写个简单脚本统计流量:

#!/bin/sh

now=`date +%H`
/sbin/iptables -vxn -L OUTPUT 1 | awk '{print ($2/1024/1024)"M"}' |\
sed "s/^/`date +%H:%M`  /" >> /root/flow/flow-`date +%Y%m%d`

if [ $now -eq 0 ]; then
/sbin/iptables -Z OUTPUT 1
/sbin/iptables -Z INPUT 1
fi

这里根据个人需求,我只是统计了出网流量,加了OUTPUT 1参数,只统计OUTPUT链第一条规则-A OUTPUT -p tcp -m tcp --sport 25590的流量,根据实际情况修改为相应的值。

收集到的流量记录大致如下:

13:00  98.1303M
14:00  128.938M
15:00  183.525M
16:00  313.937M
17:00  388.81M
18:00  439.315M
19:00  689.058M
20:00  838.762M
21:00  1085.85M
22:00  1429.42M
23:00  1761.62M

因为根据个人需求,我这里是通过crontab每小时0分执行一次统计,并且在0点的时候通过iptables -Z清空流量统计,每天0点按日期生成一个新的统计文件。这样就可以监控大致每天不同时段的流量情况,如果服务器上有其他公网玩家的腐竹使用流量计费的CVM也可以通过这个方式了解到流量使用情况。

写在最后

Minecraft是一部非常不错的创造性游戏,当然最有趣还是要和好JI友一起,无论在游戏世界还是服务器环境,大家分工合作共创美好生活什么的…… 毕竟个人能力有限,在配置环境以及脚本执行过程中难免疏漏,欢迎各位老司机批评指正。 最后来一张合影吧

# 生命不息,折腾不止 # 为了您和好JI友的方便,请综合选择离大家最近的CVM节点(土豪们请忽略) # 支持正版游戏,抵制不良软件

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

陈润泽的专栏

1 篇文章1 人订阅

我来说两句

1 条评论
登录 后参与评论

相关文章

来自专栏架构师小秘圈

利用顶层框架,秒变微服务专家

jHipster(J潮客)其亮点: 风头超劲,席卷欧美,最新全能Java Web开发程式产生器 (java web generator)。 由Java专...

3546
来自专栏程序人生

手把手教你做个生成静态网页的小工具:podgen

程序人生之图穷匕见的podcast发了四期(三期正式的)后,有几个读者说在微信上听效果不好,又没法暂停(停下后再听又从头开始了),能不能在iTunes 播客里面...

3329
来自专栏安恒网络空间安全讲武堂

WIFI干扰器制作

WIFI干扰器制作 ? emmmm 不能瞎玩啊 被隔壁邻居举报了我不负责的 Esp8266的工作原理 Esp8266的工作原理,知乎有位大佬的回答: 解析一键配...

5609
来自专栏企鹅号快讯

python程序员开发必备的5大工具,你用过几个?

随着python的火热,不少的程序员业余时间都会研究这门编程语言。 利用python开发,大牛用vim,接了2个显示器写python,气场甚是强大。 有些程序员...

2037
来自专栏SDNLAB

如何向ONOS社区贡献代码

ONOS是业界首个面向运营商业务场景的开源SDN控制器平台,主要面向服务提供商和企业骨干网。由于ONOS是完全开源的项目且面向全球的开发者开放,对于项目的管理有...

3247
来自专栏FreeBuf

帮女神修手机的意外发现:隐匿在iOS文件系统中的隐私信息

说明: 1. 本文仅供安全学习及教学用途,提及的部分技术带有攻击性,请确保合法使用。 2. “这些都不是我干的,我就负责说出来。” 3. 图片仅供参考。 4. ...

3159
来自专栏酷玩时刻

微信公众号开发之现金红包

在使用现金红包之前,请前往开通现金红包功能。操作路径:【登录微信支付商户平台——>产品中心——>现金红包——>开通】。

973
来自专栏AI科技大本营的专栏

AI 技术讲座精选:如何创建 R 包并将其发布在 CRAN / GitHub 上?

前 言 大多数受欢迎的编程语言都有个共同点——他们都是“开源”。开源是一种分散的开发模式,它基于社区参与。社区成员推动这种编程语言的发展,所得成果向所有人开放。...

2765
来自专栏全栈架构

开源BI工具Metabase简介

Metabase 是一个简单、开源的方式,通过给公司成员提问,从得到的数据中进行分析、学习。

724
来自专栏极乐技术社区

微信小程序+和风天气完成天气预报

花半天时间完成简单的小程序应用。适合小程序初学者。

2987

扫码关注云+社区