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

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


做者:陈润泽shell

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

前提

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

OK开搞

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

安装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用户:session

root@Mercury:~# useradd -m -s /bin/zsh minecraft
复制代码

我习惯于使用zsh,这里能够不指定,直接使用系统默认shell,-m参数建立用户主目录,不须要设置密码。dom

如今直接切换到minecraft用户,切换到主目录:jvm

root@Mercury:~# su minecraft
Mercury% cd
Mercury% pwd
/home/minecraft
复制代码

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

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服务器


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

相关文章
相关标签/搜索