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]