騰訊雲技術社區-簡書主頁持續爲你們呈現雲計算技術文章,歡迎你們關注!java
做者:陳潤澤shell
首先,本人是一隻喜歡瞎折騰的鹹魚,帶有輕微的強迫症,同時也是Minecrafter。 然而別人建立好的xxxx懶人/整合服務端有時候並非本身喜歡的東西,在強迫症和好動症的逼迫下本身瞎折騰出一套適合本身的Minecraft服務端。安全
至於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=true
OK~
好了,爲了方便起見,開服固然須要一個腳本,我命名爲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.properties
中view-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服務器