Spigot 架設多人遊玩的 Minecraft 伺服器-以 Ubuntu 環境中示範
Spigot(也稱為SpigotMC;中文稱為水龍頭)是一個很受歡迎的Minecraft伺服器架設軟體,經由Bukkit伺服器mod的另一個分支,但因為Spigot性能和穩定方面來得比Bukkit好,且還保留了與Bukkit插件的相容性,所以就成為架設Minecraft伺服器首選之一。雖然Minecraft遊戲的官方Mojang也有推出他們家的Minecraft伺服器(Vanilla Server),但很可惜的就是他們所推出的伺服器版本,是無法安裝插件的,而Spigot是可以裝上插件(Plugin),所以你需要為Minecraft遊戲世界添加額外的功能時,那就可以經由插件來進行添加你要的功能,來讓遊戲的功能更加完善,當然Spigot也是有缺點的,就是無法安裝Mod(模組),假如你要玩的遊戲內容需要經由Mod來添加的話,那Spigot就不適合了。筆者在前面就有說到Spigot和Bukkit兩者所使用的插件是相容的,所以在他們兩個網站上看到的插件資源,幾乎都可以使用,而且現在有好多開發者貢獻了很多不同功能的插件,來滿足Minecraft世界的遊戲性,甚至Minecraft遊戲的管理者也可以經由插件所提供的管理功能來管理Minecraft遊戲的世界。
本文教學主要指引使用者如何在Debian/Ubuntu環境中使用SpigotMC架設多人遊玩的Minecraft遊戲伺服器。本文教學操作過程的指令,僅適用於Debian/Ubuntu環境(筆者此篇教學是在Ubuntu 18.04 LTS版本上操作),如果你是使用其他的Linux發行版,當然也是可以參考本教學,但在某些指令方面你需要自行更改以調整至適用你自己系統的環境。
**如果你想要在本機實作的話,那可以考慮安裝虛擬機器軟體來進行實作,虛擬機器方面可以選擇VirtualBox,然後安裝好Ubuntu作業系統,及設定好VirtualBox的Port轉發功能(Minecraft預設Port為25565),就可以按照本篇教學的步驟,來將Minecraft伺服器架設好。
**如果你要架設Minecraft伺服器與多位朋友一起遊玩的話,那筆者個人是比較推薦租用VPS主機,比較不建議使用自己的電腦來當伺服器。因為VPS主機幾乎都有提供固定的IP位址,穩定的網路,如果遇到資源不足的問題,要升級主機時也比較好升級,還有VPS主機都是全天運作的,所以你的電腦也就不用一直開著了,只是在有需要管理伺服器時,才需要使用你的電腦來使用SSH協定遠端管理你的Minecraft伺服器,還有就是現在的VPS主機費用都很便宜,比如用Linode和Vultr這兩家來說,以每月10美元就可以租用到2GB記憶體、1vCPU、Vultr是55GB;Linode是50GB的SSD硬碟儲存空間、每月有2TB流量和一組IPv4位址的規格,而且這兩家都有在日本佈局機房,也就說離台灣這邊很近,這樣台灣這邊的玩家在玩Minecraft遊戲時比較不容易出現延遲的問題。
**Spigot的伺服器硬體規格方面,官方建議要有1024MB可用的記憶體(目前新的BuildTools編譯工具,至少要有可用的512MB的記憶體,如果記憶體不足,會無法編譯成功),假如你跟筆者一樣是使用,如:Linode、Vultr等等之類的VPS主機來架設的話,那建議你可以選擇10美元方案或以上的主機規格會比較穩,以Linode和Vultr來說,每月10美元規格的記憶體都是2GB,這大概可以承受10位左右的玩家可以一起同時遊玩Minecraft遊戲及伺服器上也可以執行一些插件。
1)安裝Spigot會用到的相關套件。
Step 1:將Debian/Ubuntu系統的套件資訊與版本更新到最新。
sudo apt-get update && sudo apt-get upgrade -y
Step 2:安裝等下會用到的相關套件。
sudo apt-get install git screen -y
Step 3:因為Spigot需要在Java環境中執行,所以接著要在系統中安裝好JRE。以下指令,筆者是安裝了開源版本的OpenJDK。
**如果你要安裝Oracle的JRE版本,那也是可以的哦。
sudo apt-get install git openjdk-11-jre-headless -y
**如果你系統是Debian 9(Stretch),目前Debian 9官方軟體包中僅有提供OpenJDK 8。
sudo apt-get install git openjdk-8-jre-headless -y
Step 4:輸入『java -version』,來測試Java環境是否安裝好。
java -version
如出現下面類似的訊息,則表示你的系統已正確安裝好Java環境。
openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)
2)為主機新增Swap(虛擬記憶體)。(非必要)
Step 1:為了防止系統出現記憶體不足的問題,建議可以為系統新增Swap(虛擬記憶體),如下面所示的指令可以先來查看系統中是否已經有設定好Swap。
sudo swapon -s
如果沒輸出結果,則表示你的系統還未設定好Swap;如果有出現『/swapfile』或『/swap.img』等等的跟Swap字眼相關的輸出結果,那則表示系統已經設定好Swap了,就不用在設定,直接到下一個第3大項。
Step 2:如果系統上還未設定好Swap,那接著可以來建立一個Swap檔案,如以下的指令是建立一個2GB大小的Swap檔案。
sudo dd if=/dev/zero of=/swapfile count=2048 bs=1M
輸入好以上的指令之後,可以看到類似如以下的輸出結果:
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 6.11921 s, 351 MB/s
Step 3:接著設定權限,將swapfile的權限僅允許root的權限來讀寫。
sudo chmod 600 /swapfile
Step 4:格式化剛剛所建立的swapfile。
sudo mkswap /swapfile
你應該可以看到類似如以下所示的輸出結果:
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=3e1c82f0-511d-4704-b7f6-07bd76773b97
Step 5:接著來啟用剛剛所建立的swapfile吧。
sudo swapon /swapfile
Step 6:你可以再次使用『swapon -s』指令來查看你系統上的Swap了。
sudo swapon -s
如以下的輸出結果,則表示系統上已經有Swap了。
Filename Type Size Used Priority
/swapfile file 2097148 0 -2
Step 7:最後還有很重要的就是要讓系統在開機或重啟時,自動啟用剛剛所建立好的swapfile,而你可以使用你習慣的文字編輯器來編輯『fstab』設定檔。以下指令為筆者使用Vim編輯器來編輯『fstab』設定檔:
sudo vim /etc/fstab
然後接著在『fstab』檔案的最下面加入以下的內容及儲存,你系統上的Swap就設定完成了。
/swapfile none swap sw 0 0
3)新增一個名稱為minecraft的使用者及賦予sudo權限。
**本篇教學從這部分開始,架設Minecraft伺服器過程,以及包含伺服器的管理,一律都使用minecraft使用者的權限,為了方便你在參考本篇教學過程不會出錯,建議你取跟筆者一樣的minecraft使用者名稱。
Step 1:在你的系統上新增一個『minecraft』為名稱的新使用者。
sudo adduser minecraft
Step 2:然後接著按照系統的要求來輸入兩次minecraft新使用者的密碼,及其他的帳號相關資訊。
**主機如果是有公開在網路上的,請記得將minecraft使用者的密碼設定複雜一些。
Step 3:賦予minecraft使用者sudo權限。
sudo usermod -aG sudo minecraft
Step 4:新使用者建立完成之後,你就可以將目前的身份來切換至剛剛所建立好的minecraft使用者了。
sudo su - minecraft
Step 5:檢查minecraft使用者是否有root權限。如果輸出為『root』則表示minecraft使用者已具備sudo權限。
sudo whoami
4)下載與編譯Spigot,以及更改Minecraft在首次執行時需要同意EULA授權合約的設定。
Step 1:新增一個編譯用的目錄,及cd至剛剛新增好的目錄位置。
mkdir ~/build && cd ~/build
Step 2:下載BuildTools.jar至你的主機。
wget -c https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
Step 3:開始進行編譯。
如果沒要指定Minecraft版本,那可以直接輸入以下的指令,BuildTools預設會編譯最新穩定版本的Minecraft。
java -Xmx1024M -jar BuildTools.jar
如果要指定Minecraft版本,那可以輸入:
java -Xmx1024M -jar BuildTools.jar --rev <版本號>
比如本文教學在撰寫時,Minecraft最新版本為『1.13.2』:
java -Xmx1024M -jar BuildTools.jar --rev 1.13.2
**編譯開始時如果出現『BuildTools requires at least 512M of memory to run (1024M recommended), but has only detected XXXM.』錯誤訊息,則表示你系統可用的記憶體不足,解決方法就是提升或升級你系統可用的記憶體。
Step 4:Spigot成功編譯完成之後,是會輸出類似如以下的訊息:
Success! Everything compiled successfully. Copying final .jar files now.
Copying craftbukkit-1.13.2-R0.1-SNAPSHOT.jar to /home/minecraft/build/./craftbukkit-1.13.2.jar
- Saved as ./craftbukkit-1.13.2.jar
Copying spigot-1.13.2-R0.1-SNAPSHOT.jar to /home/minecraft/build/./spigot-1.13.2.jar
- Saved as ./spigot-1.13.2.jar
Step 5:需要將編譯好的『.jar』檔案移動到server目錄下,因為還未建立好server目錄,所以需要先建立一個server目錄,建立好之後cd到server目錄。
mkdir ~/server && cd ~/server
Step 6:接著就將編譯好的『.jar』檔案移動到server目錄,並將檔案名稱重新命名為『spigot.jar』。
mv ../build/spigot-1.*.jar spigot.jar
Step 7:開始執行剛剛所編譯好的Spigot檔案吧。
java -Xms1024M -Xmx1536M -jar spigot.jar
Step 8:因為還沒同意EULA授權合約,所以你會看到類似如以下執行失敗的訊息:
: Failed to load eula.txt
: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
: Stopping server</code></p>
Step 9:接著使用你習慣的文字編輯器,來編輯『eula.txt』檔案。以下指令為筆者使用Vim編輯器來編輯『eula.txt』檔案:
vim /home/minecraft/server/eula.txt
接著就將『eula=false』改成『eula=true』。
**如果你將EULA授權合約改成『true』的話,則表示你已同意了MINECRAFT使用者授權合約。
eula=true
5)從GitHub下載shell script,以可以方便管理Minecraft伺服器及讓Spigot程式在伺服器開機時能自動執行。
Step 1:編譯及安裝好Spigot之後,接下來為了可以方便管理Minecraft伺服器,所以可以來建立一個shell script,你可以直接從GitHub下載作者Nav Vasky所撰寫的shell script,且由筆者二次編輯好的spigotmc-startup-script.sh(中文版本)至你的『/etc/init.d』目錄,並將名稱更改為『minecraft』。
sudo wget -O /etc/init.d/minecraft https://raw.githubusercontent.com/KJieGitHub/spigotmc-startup-script/master/zh-hant-version/spigotmc-startup-script.sh
如果你要英文版本的spigotmc-startup-script.sh,那可以輸入以下的指令,將shell script下載至你的主機。
sudo wget -O /etc/init.d/minecraft https://raw.githubusercontent.com/KJieGitHub/spigotmc-startup-script/master/spigotmc-startup-script.sh
Step 2:將其下載好的shell script設定為可執行的權限。
sudo chmod +x /etc/init.d/minecraft
Step 3:重新載入systemd。
sudo systemctl daemon-reload
Step 4:設定主機在開機或重啟時能自動執行Spigot。
sudo update-rc.d -f minecraft defaults
Step 5:以後管理Minecraft伺服器時,所輸入的指令格式如下:
/etc/init.d/minecraft <指令>
指令分別有:
啟動Spigot
/etc/init.d/minecraft start
停止Spigot
/etc/init.d/minecraft stop
重啟Spigot
/etc/init.d/minecraft restart
備份Spigot程式、Minecraft地圖以及伺服器所安裝的第三方插件
/etc/init.d/minecraft backup
查看Minecraft伺服器目前執行的狀態
/etc/init.d/minecraft status
Step 6:都設定完成之後,接著可以來首次執行你架設好的Minecraft伺服器了。
/etc/init.d/minecraft start
6)Minecraft遊戲世界的伺服器端設定。
Step 1:Minecraft的伺服器端有提供一個稱為『server.properties』的設定檔,這個設定檔可以讓Minecraft伺服器管理者來調整多人遊戲所有參數的檔案。在開始編輯『server.properties』檔案之前,建議你可以先將『server.properties』檔案複製一份,以免日後不小心編輯錯誤時,你還可以參考這份備份檔,或來進行覆蓋。
cp /home/minecraft/server/server.properties /home/minecraft/server/server.properties.bak
Step 2:接著使用你習慣的文字編輯器,來編輯及更改『server.properties』設定檔參數至你要的遊戲模式。以下指令為筆者使用Vim編輯器來編輯『server.properties』檔案:
vim /home/minecraft/server/server.properties
Step 3:關於『server.properties』設定檔中文版本,可以參考Gamepedia-Minecraft網站的server.properties,裡面有說明每個設定值有哪些參數,及每個參數的描述。
Step 4:如果你有更動到『server.properties』設定檔,請記得要重啟你的Minecraft伺服器,這樣你的設定才會生效。
/etc/init.d/minecraft restart
7)使用Screen來操控Minecraft伺服器。
**如果你的Minecraft伺服器有在使用防火牆,請記得將Minecraft所使用的預設Port『25565』或者是你指定的Port加入至iptables中,以Debian/Ubuntu來說,最常使用的防火牆為UFW,那可以輸入『sudo ufw allow 25565/tcp』指令來允許外面的連線經由port 25565或者是你指定的Port來連結至你的Minecraft伺服器。
sudo ufw allow 25565/tcp
Step 1:為了防止在中斷SSH連線時,進而導致Spigot終止執行情況下,所以一般都會使用Screen來讓Spigot能在後台執行及管理者自己也可以隨時來連回minecraft的session來管理Minecraft遊戲的世界。為了可以讓使用者自己試著來使用Screen的一些指令,你可以先啟動好Minecraft伺服器。
/etc/init.d/minecraft start
Step 2:如果Minecraft伺服器已啟動,那接著可以使用Screen來連上minecraft的session。
screen -r
**如果你在輸入『screen -r』指令時出現『Cannot open your terminal '/dev/pts/1' - please check.』訊息,原因是因為你此次使用SSH連線是使用root或sudo權限來切換至minecraft身份而造成的,你可以輸入『script /dev/null』來解決此次無法連上session的問題。
Step 3:在連上minecraft的session之後,你就可以即時看到你Minecraft伺服器的狀況了,比如說有哪些玩家連上你的Minecraft伺服器,或離開了遊戲等等的資訊,還有你也可以直接從你連上的minecraft session這邊輸入指令(包含你安裝在Spigot上的插件相關指令)來控制Minecraft遊戲世界,還有很重要的就是,如果你日後有在Spigot上安裝插件,假如有某個插件出現錯誤或不相容的情形,那也可以直接從minecraft的session這邊看到是哪個插件出現錯誤訊息。
Step 4:這邊筆者列出比較常用到的Screen指令與快捷鍵。
Screen指令:
連結目前的session。
screen -r
如果你無法連上session,那可以使用這個指令來列出目前所有的session。
screen -ls
如果你使用『screen -ls』指令,有出現多個session的話,那就要使用這串指令『screen -r 』來指定session,例如:『screen -r minecraft』。
screen -r
Screen的鍵盤快捷鍵:
如果需要離開Screen畫面,你可以按下鍵盤『Ctrl+A』與『D』就可以離開當前的Screen畫面,需要注意的是,請勿直接按下鍵盤的『Ctrl+C』,因為這會造成Minecraft伺服器也一併終止執行。
8)調整Minecraft伺服器可用的記憶體。
Step 1:如果你使用本文教學所提供的shell script,那在shell script裡面的記憶體設定中,筆者預設僅有設定1.5GB的記憶體(在有2GB記憶體規格的主機上),如果你的主機有更多可用的記憶體資源,那你可以將Minecraft伺服器可用的記憶體調整多一些,這樣你的伺服器可以同時容納更多的玩家,及也可以安裝更多的有趣的插件,在調整記憶體之前,你需要先停止Minecraft伺服器。
**如果你不知道你的主機有多少MB的記憶體,那可以輸入『free』指令來查看你主機上有多少MB的記憶體。
/etc/init.d/minecraft stop
Step 2:接著你可以編輯shell script來調整記憶體了。以下指令為筆者使用Vim編輯器來編輯minecraft的shell script檔案:
sudo vim /etc/init.d/minecraft
Step 3:在shell script檔案中,大約在26及27行當中,可以分別調整『MAXHEAP』和『MINHEAP』的記憶體數值,分別意思為:MAXHEAP是可用的記憶體最大數值,MINHEAP是可用的記憶體最小數值。比如以一部2GB記憶體的主機規格來說,建議調整MAXHEAP數值為『1536』,而MINHEAP數值為『1024』。
**shell script檔案的記憶體『MAXHEAP』和『MINHEAP』兩者數值是使用MB單位計算,每1GB轉換成MB單位是『1024』。
Step 4:重新載入systemd。
sudo systemctl daemon-reload
Step 5:啟動Minecraft伺服器。
/etc/init.d/minecraft start
9)備份Minecraft伺服器及設定crontab排程來自動備份Minecraft伺服器。
Step 1:如果你使用本文教學所提供的shell script,那在shell script中也已編寫好Spigot的備份設定,你只需要輸入指令就可以同時備份好『spigot.jar』、『server.properties』、『Minecraft主世界(The Overworld)』、『地獄(The Nether)』和『終末之界(The End)』。首先你需要手動新增一個備份Spigot的目錄:
**plugins目錄(插件安裝的目錄)在shell script是被註解的,因為筆者發現到備份插件的話(在有安裝多個插件的情況下),很容易造成備份檔肥大的問題,所以就將plugins目錄備份的那行註解掉,如果你有要備份plugins目錄,那可以自行去編輯shell script,大約在116行將備份plugins目錄那行取消註解。
mkdir ~/mcserver_backup
Step 2:接著可以試著輸入指令來試看備份過程有沒有輸入錯誤。以下為備份Spigot的指令:
/etc/init.d/minecraft backup
如有逐步輸出下面的各個訊息,則表示是有成功備份好Spigot所有資料。
spigot.jar is running... suspending saves
Backing up minecraft world...
Backing up spigot.jar
spigot.jar is running... re-enabling saves
Compressing backup...
Done.
Step 3:除了手動輸入指令來備份Spigot之外,建議可以使用Linux的crontab排程,讓系統在你所安排好的時間來自動備份好Spigot。首先可以來開啟好crontab排程的設定檔。
sudo crontab -e
Step 4:比如說筆者想要讓Minecraft伺服器每6個小時備份一次,那指令可以參考如下:
**關於Cron的時間設定可以查看維基百科。
1 */6 * * * /etc/init.d/minecraft backup
10)更新Spigot至你要的版本。
**如果Minecraft有釋出最新的正式版本,那Spigot的伺服器版本也不一定會立即釋出Minecraft的最新版本,這可能需要等好幾天Spigot才會釋出比較穩定的伺服器版本,你可以從SpigotMC首頁來查看Spigot目前最新的版本。
**如果你要更新Spigot版本,有一個需要注意的事,就是你在Minecraft伺服器上所安裝的插件,因為隨著Spigot不同的版本,那可能會有些插件出現版本不相容的問題,還有並不是每個插件都能獲得插件的作者長久更新,也就表示可能會有某個插件,在你更新完Spigot程式後,可能作者沒有繼續維護,而導致插件出現錯誤,也就造成你Minecraft某些功能無法正常使用,所以建議的就是在你更新完Spigot時,不要忘記也要檢查與確定每個插件是否在最新版本,且所有插件的功能是都可以正常使用的。
**如果某個插件真的出現錯誤,作者也沒有意願繼續更新插件,且那個插件的功能對你的Minecraft伺服器上來說是很重要的話,那建議你不要更新Spigot程式會比較好。
**如果你要查看插件過去有沒有發生錯誤,除了可以經由『screen -r』來即時檢視Minecraft伺服器狀態之外,其實也可以經由過去Log檔來查看記錄,包含日後如果你遇到Minecraft伺服器崩潰,你也可以經由過去的Log檔,來查找蛛絲馬跡,而Log檔存放的目錄位置為『/home/minecraft/server/logs/』目錄下。
Step 1:如果你要更新Spigot的版本,那可以按照本部分的步驟,來手動更新你主機的Spigot版本,在更新Spigot版本之前,可以先停止Minecraft伺服器。
/etc/init.d/minecraft stop
Step 2:還有在更新Spigot版本,需要先備份好Minecraft伺服器。
/etc/init.d/minecraft backup
Step 3:接著cd至之前下載好的BuildTools.jar檔案目錄位置。
cd ~/build
Step 4:開始進行編譯。
java -Xmx1024M -jar BuildTools.jar
如果要指定Minecraft版本,那可以輸入:
java -Xmx1024M -jar BuildTools.jar --rev <版本號>
比如筆者以Minecraft最新版本『1.14.4』來說:
java -Xmx1024M -jar BuildTools.jar --rev 1.14.4
**如果你使用以上的編譯指令出現此訊息『**** Your BuildTools is out of date and will not build the requested version. Please grab a new copy from https://www.spigotmc.org/go/buildtools-dl』,那就表示你的BuildTools編譯工具是舊版本,你可以將舊的BuildTools刪除掉及重新下載最新版本的BuildTools編譯工具:
rm BuildTools.jar && wget -c https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
Step 5:等待編譯完成。編譯完成後是會輸出類似如以下所示的成功編譯訊息:
Success! Everything compiled successfully. Copying final .jar files now.
Copying spigot-1.14.4-R0.1-SNAPSHOT.jar to /home/minecraft/build/./spigot-1.14.4.jar
- Saved as ./spigot-1.14.4.jar
Step 6:Spigot編譯完成之後,需要將編譯好的『.jar』檔案移動到server目錄下,所以需要cd至『server』的目錄位置。
cd ~/server
Step 7:接著就將剛剛編譯好的『.jar』檔案移動到server目錄,並將檔案名稱重新命名為『spigot.jar』。
mv ../build/spigot-1.*.jar spigot.jar
Step 8:更新完成後,接著就可以來啟動Minecraft伺服器了。對了,除了更新好Minecraft伺服器之外,也要記得通知玩家要將遊戲程式更新至跟你Minecraft伺服器的Spigot程式一樣的版本,比如說在這部分,筆者將Spigot更新至『1.14.4』版本,那遊戲端的Minecraft也是要『1.14.4』版本,這樣才能順利登入伺服器,及繼續遊玩Minecraft遊戲。
/etc/init.d/minecraft start
11)架設Minecraft伺服器其他補充事項:
如果你要為Minecraft伺服器設定域名及更改Minecraft伺服器的Port號,那可以參考筆者延伸寫的這篇為Minecraft伺服器設定域名及SRV記錄教學。
使用Spigot來架設Minecraft伺服器主要好處就是可以安裝插件,而插件安裝的教學可以參考筆者延伸寫的這篇在Spigot架設的Minecraft伺服器中安裝需要的插件教學。
如果你的Minecraft伺服器是公開在網路上,且你的伺服器僅限跟朋友一起遊玩的話,那一定要啟用Minecraft提供的白名單功能,而白名單機制就是讓管理者可以控制誰可以加入你所架設的Minecraft伺服器,來避免你的Minecraft世界被陌生人破壞,關於whitelist啟用的指令請參考Gamepedia-指令-whitelist,文章裡有詳解whitelist指令有哪些,指令方面一樣使用Screen連到minecraft的session那邊操作。如果某個玩家未被加入白名單,那他進入你所架設的伺服器時,是會出現『You are not whitelisted on this server!』訊息,而你需要手動將那位玩家加入至白名單。
使用Linux來架設伺服器,且你的伺服器有公開在網路上,那主機的安全性方面也是要考量的,這方面你可以參考網路上專業的文章,比如說這篇How to Secure Your Server(如何防護你的主機-內容為英文),而此篇文章裡有提到Linux主機的基本防護。