MineCraft 这种游戏还是人多了好玩,以前的服务器放在同学的Windows电脑上,每次我们想玩的时候就让让去打开,但是总是有一些原因,想玩的时候服务器没开着,不想玩的时候服务器空开着费电。昨天一狠心,在阿里云买了个服务器,跑上了MineCraft。
服务端的选择
看了看原版的服务器,大概[spigot]是一个不错的选择,不过第三方的服务器的话[cuberite]看起来不错,试了试,性能的确完爆原版,很遗憾使用的随机数种子算法不是原版的,选不了想要的地图,放弃了,最终决定还是使用spigot。
服务器的配置
spigot 官方貌似并不提过给你下载,貌似是因为版权原因吧. 所以需要自己编译
第一步
安装java,直接在服务器操作了
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
第二步
编译spigot
wget "https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar" -O BuildTools.jar
java -jar BuildTools.jar #由于国内的网络原因,编译经常失败,多试几次
跑起来服务器
先说结论,MineCraft还是挺吃内存的,至少2G,否则根本别想玩,对延迟的要求也不低,建议40ms 左右,否则会非常不爽。
具体折腾过程是这样的,首先是来自遥远的日本的768M内存的VPS,到北京的Ping大概那就像放上去试试吧:
Java -Xms512M -Xmx512M -jar spigot.jar nogui
果然很快崩溃了
然后在Vultr的日本机房买了一个1G的服务器,这次内存给了768M,坚持了一会,但是玩的过程中明显感觉到了卡。。
方块这些静态的东西都没啥问题,但是像羊和鸡这样的Mob就有问题了,经常飞来飞去的,尤其是打怪的时候,关键的几刀总是打不出去,这就没法玩了。当然最不能忍的是最终还是崩溃了,看来还是得上2G的服务器
最终在阿里云买了一个2G 1Mbps的VPS,把服务器跑好之后直接
Java -Xms1024M -Xmx512M -jar spigot.jar nogui
果然玩的飞起,一点也不卡,而且也没有再崩溃了
让Minecraft服务其长时间运行(Daemonize the MineCraft Server)
玩过Linux的一定知道如果你ssh进去开了一个程序的话,当你挂断链接的时候这个服务就关掉了,因为你开的东西都相当于你这个shell的子进程
一般的程序,我们用nohup就好了
./server.sh
nohup ./server.sh &
但是MineCraft的服务器真是奇葩啊,试了好几次用nohup启动都登陆不进去了,研究了半天日志终于发现,原来这个服务器启动以后是需要持续的霸占stdin的,导致没法正确运行,这个也好解决,我们用tmux就好了。
tmux是terminal multiplexer的缩写,也就是终端复用器的意思,就是能把一个shell分成好几个shell 啦,当然我们要用到的功能是,如果我们在tmux里面打开一个进程之后,还可以detach下来,而这个shell和他的子进程都不会被销毁,太棒了
具体步骤是这样的
进入tmux,敲了tmux回车就好了
敲上你启动服务器的命令
按Ctrl+b,松开两个键再按d(detach的意思)
如果你想把服务其关掉的话
敲上tmux a(attach的意思)
你又回到了Minecraft服务器的后台了,这时候按Ctrl+c就好了
另外还有一个坑爹之处,minecraft服务器启动的时候当前工作目录必须有一个eula.txt 而且是必须放在一起的
简单吧,其实还可以更简单
我们可以把这两步都写成脚本, 据小伙伴测试还可以把这个脚本加到启动脚本里, 实现开机启动哦~
#!/bin/sh
SPIGOT_PATH=/var/mc/spigot.1.8/
start() {
tmux has-session -t minecraft
if [ $? != 0 ]
then
tmux new -s minecraft -d
tmux send-keys -t minecraft "cd $SPIGOT_PATH" C-m
tmux send-keys -t minecraft "java -Xmx1024M -Xms1024M -jar spigot.jar nogui " C-m
fi
echo Server started
}
stop() {
tmux send-keys -t minecraft C-c
tmux kill-session -t minecraft
}
attach() {
tmux a -t minecraft
}
status() {
tmux has-session -t minecraft
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|restart}" >&2
exit 1
;;
esac
[spigot]
[cuberite]