ETH官方钱包

切換
舊版
前往
大廳
主題

用網頁來遠端開關minecraft伺服器(Linux系統)

Yukiarashi | 2021-05-19 08:17:09 | 巴幣 4 | 人氣 738

注意
本教學內不包含伺服器安全性設定與維護教學,若照著本教學進行設定遇上系統崩潰或駭客入侵等嚴重問題,本人不負任何責任。

本教學是以安裝完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
來決定是要開啟還是關閉伺服器
執行後清除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遠端開關當然是更簡單的方法,
搞這麼麻煩其實也只是算玩玩而已。


那麼本教學就到此結束啦!

創作回應

更多創作