【小白学云计算】搭建属于自己的Minecraft服务器

2,465 阅读12分钟

腾讯云技术社区-简书主页持续为大家呈现云计算技术文章,欢迎大家关注!


作者:陈润泽

首先,本人是一只喜欢瞎折腾的咸鱼,带有轻微的强迫症,同时也是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节点(土豪们请忽略) # 支持正版游戏,抵制不良软件

相关阅读: 【腾讯云的1001种玩法】利用云服务器资源进行网络服务 如何购买腾讯云服务器 腾讯云搭建多终端《你画我猜》Socket服务器


此文已由作者授权腾讯云技术社区发布,转载请注明文章出处,获取更多云计算技术干货,可请前往腾讯云技术社区