注意
本教學內不包含伺服器安全性設定與維護教學,若照著本教學進行設定遇上系統崩潰或駭客入侵等嚴重問題,本人不負任何責任。
本教學是以安裝完linux前提進行,所以不會附上linux安裝教學。
minecraft伺服器安裝教學這裡也不會附上。
建議有一定的linux基礎後才進行以下教學,不然可能會看到頭昏眼花。
這篇文章是因為朋友開了minecraft伺服器,他提出了想用網頁而非ssh之類的方式來達成遠端開啟或關閉伺服器,因為測試成功後,所以寫一篇教學。
範例環境 – CentOS 8.3(已EOS)
事先需安裝的軟體
- Apache(httpd)
- PHP
- minecraft伺服器
第一部份-架設web server
畢竟是用網頁來操作開啟或關閉
當然需要架web server
這邊還需要php來對文字檔案做寫入
至於文字檔案的用處底下會說明
至於文字檔案的用處底下會說明
開始可以先轉root身分(若沒轉root以下指令請都加上sudo)
sudo su -
或是
su -
首先先更新系統
yum -y update
安裝必要軟體
yum install httpd php php-fpm
接下來設定防火牆允許網頁伺服器通過
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
啟動並且每次開機都會自動啟動Apache(httpd)和php-fpm
systemctl enable --now httpd
systemctl enable --now php-fpm
確認是否正常啟動
systemctl status httpd
systemctl status php-fpm
如果你是內網環境,不知自己外部IP的話
可以從這裡獲得外部IP
或是你是純文字介面的話輸入
curl ifconfig.me
得到的IP在手機或是其他裝置的瀏覽器上輸入
成功連到測試頁面就可以下一部份
成功連到測試頁面就可以下一部份
第二部份-設置首頁檔
寫首頁檔
因為Apache的預設頁面是叫index
而且我們是用php
所以首頁檔命名為index.php
index.php代碼如下
<?php
if ($_GET['start']) {
$str = "open";
$file = fopen("/var/www/html/test.txt","a+");
fwrite($file,$str);
fclose($file);
$txt="Start MC Server";
}
if ($_GET['stop']) {
$str = "stop";
$file = fopen("/var/www/html/test.txt","a+");
fwrite($file,$str);
fclose($file);
$txt="Stop MC Server";
}
?>
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<body>
<h2>MC Server control</h2>
<a class = "start-button" href="?start=true" onclick="start()">Start</a>
<a class = "stop-button" href="?stop=true" onclick="stop()">Stop</a>
<p><?php echo $txt ?></p>
</body>
</head>
</html>
<style>
h2{
text-align: center;
}
a {
margin:20px auto;
display: block;
width: 115px;
height: 25px;
padding: 10px;
text-align: center;
border-radius: 5px;
color: white;
font-weight: bold;
line-height: 25px;
}
.start-button{
background: #4eaf6b;
}
.stop-button{
background: #921515;
}
p{
text-align: center;
}
</style>
網頁介面長這樣,相當簡潔
接下來要把首頁檔放在Apache的預設路徑
Apache預設路徑如下
/var/www/html/
所以放進去應該會是這樣/var/www/html/index.php
還需要創建一個test.txt的檔案來提供寫入
touch /var/www/html/test.txt
測試能夠正確顯示寫好的網頁後
接下來就要更改SELinux安全性本文
雖然直接關閉SELinux最方便,但沒有因為SELinux卡到奇怪問題的前提下
我是不會選擇關閉,能用調整就用調整的
下以下指令修改本文
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/index.php'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/test.txt'
restorecon -Rv '/var/www/html/'
然後修改檔案擁有者及權限
chown -R apache:apache /var/www/html/
chmod 766 /var/www/html/test.txt
之後再次進入網站來(前面用外部ip進入網站)
試著點選Start或Stop後
test.txt裡面是否有寫入文字(start或stop)
cat /var/www/html/test.txt
有的話
那麼至此為止都成功,可以進行最後一部份了(好長)
最後的部份-執行與排程
最後我們需要寫一個shell script檔
那個shell script檔是用來判斷/var/www/html/test.txt中的文字是start還是stop
那個shell script檔是用來判斷/var/www/html/test.txt中的文字是start還是stop
來決定是要開啟還是關閉伺服器
執行後清除test.txt的內容
等待下次寫入(就是等你在網頁按按鈕)
然後用cron排程不斷執行shell script來檢查test.txt內容
我這邊用vim去編寫shell script(這邊的家目錄是root的)
vim ~/mcserver.sh
需寫入的shell script檔內容如下
if cat /var/www/html/test.txt | grep open
then
echo "excluted" > /var/www/html/test.txt
/usr/bin/screen -S MC & java -Xmx3096M -Xms1024M -jar /root/forge-1.16.5-36.1.16.jar nogui
fi
if cat /var/www/html/test.txt | grep stop
then
echo "excluted" > /var/www/html/test.txt
killall java
fi
我的伺服器執行檔是在root的家目錄
為了執行方便
雖然已經是root了,不過保險起見還是給它執行權限
chmod u+x ~/mcserver.sh
搞定了這shell script之後就可以用cron來不斷執行這個shell script了
先確定cron有沒有啟動
systemctl status crond
若沒啟動就啟動它
systemctl start crond
開始編輯cron排程內容
crontab -e
輸入以下
*/1 * * * * sh /root/mcserver.sh >> /var/www/html/out.txt 2>&1
設定完成建議重啟一下cron確保設定生效
systemctl restart crond
cron生效了之後就會每一分鐘檢查/var/www/html/test.txt內容為何
由於cron到底有沒有在運作實在是不好檢查
所以把它運作的結果導到/var/www/html/out.txt去
如果cron沒有運作便可以去/var/www/html/out.txt檢查為何沒運作
到這邊整個設定就完成了
最後的最後
如果有理解這些到底在做什麼的話
應該會有不少疑問,也有可能有必須知道的問題
所以這邊做點說明
Q:為何不直接用php執行shell script就好?
A:我試了很多,在最後的最後minecraft伺服器執行時會報錯
貌似是因為沒有權限去訪問它啟動所需的檔案
SELinux關閉、檔案權限全開(777)、檔案擁有者全給Apache這些都沒用
只好用文章所寫的方式去完成。
Q:如果我在網頁上按了stop又按start的話,結果會如何?
A:我的shell script上是第一個if是找start的,所以這樣會執行的會是start,
可以通過修改shell script調整偵測順序等等。
Q:minecraft伺服器直接這樣killall java會不會地圖檔損毀
A:我這邊測試是用模組伺服器來用(執行檔和一般的不太一樣),至少我這邊直接killall它是會存檔的,但是我朋友用kill有遇上地圖檔損毀,
所以如果擔心的話shell script可以把killall java改成/usr/bin/screen -x MC -X stuff "`echo -ne \"stop\r\"`"
這樣就是把stop傳進去start的時候開的screen(stop指令能讓minecraft伺服器端存檔結束)
網路上說不定有別人做更好的方式,
甚至是做到監控硬體資源,管理遊戲內部狀況等等,
但這是用我朋友的想法去測試到成功的,
也算是屬於我們的破方法吧。
如果沒有特別要求用圖形化介面開關的話,
使用ssh遠端開關當然是更簡單的方法,
搞這麼麻煩其實也只是算玩玩而已。
那麼本教學就到此結束啦!