VPSにマイクラサーバ構築 (Rocky Linux)
はじめに
久しぶりにマイクラがやりたくなったので、Minecraft サーバーをVPS上に構築しました!
構築手順を備忘録として残します。
環境情報、ソフトウェアバージョン
今回はcontaboでVPSを購入します。
以下が今回構築に使用した仮想マシンのスペックになります。
リソース | スペック |
---|---|
CPU | 4コア |
メモリ | 6GB |
SSD | 600GB |
以下が使用するソフトウェアのバージョンになります。
ソフトウェア | バージョン |
---|---|
minecraft_server | 1.21.1 |
minecraft | 1.21.1 |
java | 21 |
VPS購入
まずは以下のサイトからVPSを購入していきます。
VPSのOS、スペックなどを選択していきます。
1.Select your term lengthでは契約期間を指定します。期間が長いほどお得になります。
2.Regionはサーバが配置されている地域を指定します。使用地域が近いほどレスポンス速度が速くなります。レスポンス速度をそこまで重視しない使用方法であればどこでも問題ないので、私は無料のヨーロッパを選択しました。
3.Storage TypeではSSDかNVMeの選択と容量を選択します。
私は600GBのSSDを選択しました。
4.ImageではVPSのOSを選択します。私はRocky Linux9を選択しました。
好きなものを選択してください
5.Login & password for your serverではrootユーザのログインを選択します。推測されにくいパスワードを設定してください。
残りの項目は必要であれば選択してください。基本デフォルトで問題ないです。
Nextをクリックし購入処理に進みます。
購入後、サーバが構築されるとメールでサーバ情報が送られてくるので、しばし待ちましょう。
サーバ情報が届いてからサーバ構築を行います。
サーバ構築
構築後送信されるメールに接続先IPアドレスの記載があるのでそれを基にssh接続します。
[IP-address]にはメールに記載された接続先IPアドレスを入れ、以下のコマンドでssh接続します。
Tera Term等を用いてssh接続しても良いです。
ssh -l root [IP-address]
接続できれば以下のような画面が表示されます。
ログインユーザ、マイクラ用ユーザの作成
サーバに接続できたところでログインユーザとマイクラを起動させるユーザを作成します。
ログインユーザ作成
まずはログインユーザを作成します。rootで直接ssh接続できるのはセキュリティ的によろしくないので、代わりにログインするユーザを作成します。以下のコマンドを実行します。
[username]の部分は適当な名前に置き換えてください。
# ユーザを追加
useradd [username]
# パスワードを設定
passwd [username]
# sudo権限付与
usermod -aG wheel [username]
# 確認
id [username]
uid=1000([username]) gid=1000([username]) groups=1000([username]),10(wheel)
上記ユーザにはwheelグループに入れることでsudo権限を付与してます。
sudoersファイルの以下部分が同じようになっていることを確認してください。
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
新しく作成したユーザでssh接続できるか確認します。
[username]は上記で作成したユーザ名に[IP-address]は接続先IPに変更してください
ssh -l [username] [IP-address]
マイクラ起動ユーザ作成
マイクラサーバを起動させる用のユーザを作成します。このユーザはssh接続でログインするのを禁止します。
ログインユーザを作成したときと同じように以下のコマンドを実行していきます。
# minecraftユーザを追加
useradd minecraft
# パスワードを設定
passwd minecraft
# 確認
id minecraft
uid=1000(minecraft) gid=1000(minecraft) groups=1000(minecraft)
/etc/ssh/sshd_configを編集し、minecraftユーザのssh接続を禁止させる設定を入れます。
vi /etc/ssh/sshd_config
以下の設定を設定ファイルに追加します。[username]は先ほど作成したログインユーザ名が入ります
AllowUsers [username]
変更できたらsshdを再起動して設定を反映させます。
# 設定を反映
systemctl restart sshd
minecraftユーザでssh接続できないことを確認してください。
ssh -l minecraft [IP-address]
rootユーザーのssh接続を禁止する
ログインユーザでsshの接続を確認できたらrootのssh接続を禁止します。
sshd_configファイルのPermitRootLoginをnoに変更します。以下のコマンドで設定ファイルを編集します。(rootユーザで実行)
vi /etc/ssh/sshd_config
以下のようにコメントアウトを外して編集します。
#変更前
PermitRootLogin yes
↓
# 変更後
PermitRootLogin no
変更できたらsshdを再起動して設定を反映させます。
# 設定を反映
systemctl restart sshd
# ログアウト
exit
rootユーザでssh接続できないことを確認してください。
ssh -l root [IP-address]
ファイヤーウォールの設定
ファイアウォールの設定をしていきます。
今回はマイクラの使用ポートを許可する設定を追加します。
まずはファイアウォールの状態を確認します。
# rootに昇格(現在rootであれば実行不要)
su - root
# 状態確認
systemctl status firewalld
Active: inactive (dead)となっている場合はファイアウォールが無効になっています。
無効になっている場合は以下のコマンドで有効化します。
# 起動
systemctl start firewalld
# 確認
systemctl status firewalld
# 自動起動
systemctl enable firewalld
# 確認
systemctl is-enabled firewalld
現状、許可されているサービスとポートを確認します。
# 許可されているサービスの確認
firewall-cmd --list-services --zone=public --permanent
# 許可されているポートの確認
firewall-cmd --list-ports --zone=public --permanent
マイクラで使用するデフォルトポート(25565番)を許可します。
# 25565番を許可
firewall-cmd --add-port=25565/tcp --zone=public --permanent
# リロードして反映
firewall-cmd --reload
# 許可されているポートの確認
firewall-cmd --list-ports --zone=public --permanent
本来、セキュリティ的には最低限sshのポート変更したり、ssh接続をパスワードで接続することを禁止し、公開鍵を使って接続させるようにするなどする必要がありますが、面倒なので今回は設定しません。以前に別のサーバで設定したの以下の記事を参照してください。
ソフトウェアのインストール
minecraft_serverの起動に必要なソフトウェアをインストールしていきます。
tmux,jdk,minecraft_server.jarのインストールを行います。
TMUX
tmuxでセッションを作成し、バックグラウンドでMinecraftサーバーを実行します。
tmuxを用いることでユーザーがターミナルを閉じたり、SSH接続が切断されたとしてもセッションは維持され、常にバックグラウンドでMinecraftサーバーが実行され続けます。
以下のコマンドでインストールします。(rootユーザで実行)
# -yオプションをつけてインストール
dnf -y install tmux
Java
バージョン1.21.1のMinecraftサーバを動作させるためにはJava21が必要なためインストールします。
以下のコマンドでインストールします。(rootユーザで実行)
# -yオプションをつけてインストール
dnf -y install java-21-openjdk
# 確認
java --version
minecraft_server.jar
マイクラサーバのjarをインストールします。
インストールするjarを配置するためのディレクトリを作成します。
# ディレクトリ作成
mkdir /usr/local/minecraft
# 確認
ls /usr/local/minecraft
それでは作成したディレクトリに移動し、インストールします。
まずは以下のサイトからjarのダウンロードリンクを確認します。
右クリックでリンクアドレスのコピーからダウンロードリンクをコピーします。
以下のようなリンクがクリップボードにコピーされると思います。
https://piston-data.mojang.com/v1/objects/59353fb40c36d304f2035d51e7d6e6baa98dc05c/server.jar
以下のコマンドでインストールします。[Download-Link]には上記でコピーしたリンクを貼り付けてください
# ディレクトリ移動
cd /usr/local/minecraft
# jarをインストール
curl -LO [Download-Link]
# バージョンを含むようにファイル名変更
mv server.jar minecraft_server.1.21.1.jar
/usr/local/minecraftの所有者とグループをminecraftユーザに変更します。
# 所有者・グループ変更
chown -R minecraft:minecraft /usr/local/minecraft
# 所有者・グループ変更確認
ls -l /usr/local
起動設定
それでは一時起動してみます。以下のコマンドを実行します。
マイクラサーバはminecraftユーザで起動することに注意してください
# minecraftユーザにログイン
su - minecraft
# 確認
whoami
# ディレクトリ移動
cd /usr/local/minecraft
# 起動
java -Xmx1024M -Xms1024M -jar minecraft_server.1.21.1.jar nogui
以下のようにEULAへの同意が行われていないためエラーで初回起動は失敗します。
自動生成されているeula.txtを編集し、EULAへの同意を行います。
vi /usr/local/minecraft/eula.txt
以下のように変更します。
#変更前
eula=false
↓
#変更後
eula=true
それではもう一度サーバを起動させます。
java -Xmx1024M -Xms1024M -jar minecraft_server.1.21.1.jar nogui
起動できていそうなのでクライアントからサーバに接続してみます。
クライアントのバージョンがサーバと同じバージョンであることを確認してください。私の場合は1.21.1になります。
無事に接続できました!
起動スクリプト作成
それではtmuxを用いてバックグラウンドでサーバを起動させるシェルスクリプトを作成し、実行します。とりあえずサーバを停止させます。
# サーバ停止
stop
スクリプト内で使用しているpgrepコマンドがない場合はインストールします。(rootで実行)
# pgrepを含むパッケージ群
dnf -y install procps-ng
シェルスクリプトを作成します。(minecraftユーザでファイル作成)
# ディレクトリ移動
cd /usr/local/minecraft
# スクリプト作成
vi minecraft_script.sh
以下のようなスクリプトを作成します。
minecraft_script.sh
#!/bin/bash
#
# mincraft_server start/stop/status script
#
# mincraft_serverの実行ユーザ
USERNAME='minecraft'
# tmuxのsession名
TMUX_SESSION_NAME='minecraft'
# minecraft_serverディレクトリ
SERVER_PATH='/usr/local/minecraft'
# 実行するminecraft_server.jar
SERVICE="$SERVER_PATH/minecraft_server.1.21.1.jar"
# ヒープメモリの最大最小値の設定
XMX='4096M'
XMS='4096M'
cd $SERVER_PATH
# 実行ユーザの確認
ME=`whoami`
if [ $ME != $USERNAME ]; then
echo "Please run as $USERNAME"
exit
fi
# Minecraft 起動処理
start() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "$SERVICE is already running!"
else
echo "Starting $SERVICE..."
tmux new-session -d -s $TMUX_SESSION_NAME
tmux send-keys -t $TMUX_SESSION_NAME:0 "java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui" Enter
fi
}
# Minecraft 停止処理
stop() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "Stopping $SERVICE"
tmux send-keys -t $TMUX_SESSION_NAME:0 "say You have 10 seconds to stop the server. Saving..." Enter
tmux send-keys -t $TMUX_SESSION_NAME:0 "save-all" Enter
sleep 10
tmux send-keys -t $TMUX_SESSION_NAME:0 "stop" Enter
sleep 10
echo "Stopped minecraft_server"
else
echo "$SERVICE is not running!"
exit
fi
while :
do
if
pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "Stopping $SERVICE"
sleep 10
else
tmux kill-session -t $TMUX_SESSION_NAME
echo "Stoped $SERVICE"
break
fi
done
}
# Minecraft 状態確認処理
status() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "$SERVICE is already running!"
exit
else
echo "$SERVICE is not running!"
exit
fi
}
case "$1" in
start)
echo "Minecraft Server Start"
start
;;
stop)
echo "Minecraft Server Stop"
stop
;;
status)
echo "Minecraft Server Check Status"
status
;;
*)
echo "Invalid!!"
echo $"Usage: $0 {start|stop|status}"
esac
上記のスクリプトは、Minecraftサーバーの起動、停止、および状態の確認を行うためのものです。
部分的に説明します。下記の部分で、スクリプトで使用するために実行ユーザ、jarの配置ディレクトリ、tmuxのsession名、メモリの最大値と初期起動時メモリ量を変数として設定しています。
# mincraft_serverの実行ユーザ
USERNAME='minecraft'
# tmuxのsession名
TMUX_SESSION_NAME='minecraft'
# minecraft_serverディレクトリ
SERVER_PATH='/usr/local/minecraft'
# 実行するminecraft_server.jar
SERVICE="$SERVER_PATH/minecraft_server.1.21.1.jar"
# ヒープメモリの最大最小値の設定
XMX='4096M'
XMS='4096M'
起動処理について
minecraftユーザーによってminecraft_server.1.21.1.jarのプロセスが存在するかどうかを確認するし、あればメッセージを出力する。
プロセスない(サーバが起動していない)場合はtmuxで新しいセッションを作成し、そこでサーバを起動させている。
start() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "$SERVICE is already running!"
else
echo "Starting $SERVICE..."
tmux new-session -d -s $TMUX_SESSION_NAME
tmux send-keys -t $TMUX_SESSION_NAME:0 "java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui" Enter
fi
}
停止処理について
minecraftユーザーによってminecraft_server.1.21.1.jarのプロセスが存在するかどうかを確認し、なければメッセージを出力し終了する。
プロセスある(サーバが起動している)場合はサーバが起動しているセッションに"save-all"コマンドを送信しデータの保存を行い、続いて"stop"コマンドを送信することでサーバを停止させている。
サーバ停止後、起動していたセッションを削除し処理を終了している。
stop() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "Stopping $SERVICE"
tmux send-keys -t $TMUX_SESSION_NAME:0 "say You have 10 seconds to stop the server. Saving..." Enter
tmux send-keys -t $TMUX_SESSION_NAME:0 "save-all" Enter
sleep 10
tmux send-keys -t $TMUX_SESSION_NAME:0 "stop" Enter
sleep 10
echo "Stopped minecraft_server"
else
echo "$SERVICE is not running!"
exit
fi
while :
do
if
pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "Stopping $SERVICE"
sleep 10
else
tmux kill-session -t $TMUX_SESSION_NAME
echo "Stoped $SERVICE"
break
fi
done
}
スクリプトの権限を変更し、起動させます。
# 権限変更
chmod 740 minecraft_script.sh
# 確認
ls -l minecraft_script.sh
# 起動
./minecraft_script.sh start
# 起動していることを確認
./minecraft_script.sh status
# 停止
./minecraft_script.sh stop
# 停止していること確認
./minecraft_script.sh status
TMUXセッションへのアクセス
サーバが起動しているへの接続は以下のコマンドを実行します。(minecraftユーザで実行)
# セッション確認
tmux ls
# セッションへ接続
tmux a -t minecraft
切断は「Ctrl + b」+ 「d」でセッションから抜けます。
マイクラ使用ポートの変更
マイクラのデフォルトポートは25565番ですが、デフォルトポートは狙われやすいためセキュリティ的には変更したほうがいいです。そのためマイクラで使用するポート番号を変更します。
設定するポート番号は1~65534の範囲であればなんでもいいですがウェルノンポートやその他サービスで使用しているポートは避けてください。server.propertiesを編集し、変更します。(minecraftユーザで実行)
vi /usr/local/minecraft/server.properties
以下のように変更します。
# 変更前
server-port=25565
↓
# 変更後
server-port=35566
次にファイヤーウォールの設定を変更します。
# rootに昇格(現在rootであれば実行不要)
su - root
# 25565番を許可しないように変更
firewall-cmd --permanent --remove-port=25565/tcp --zone=public --permanent
# 35566番を許可
firewall-cmd --add-port=35566/tcp --zone=public --permanent
# リロードして反映
firewall-cmd --reload
# 許可されているポートの確認
firewall-cmd --list-ports --zone=public --permanent
マイクラにアクセスするときは以下のように接続先を指定してください。
[IP-address]:35566
自動起動設定
Minecraftサーバを自動起動させるためにサービスを作成し、systemdで起動できるようにします。
# rootに昇格(現在rootであれば実行不要)
su - root
# サービスファイルの作成
vi /etc/systemd/system/minecraft.service
以下の内容を記載します。
[Unit]
Description=Minecraft Server
[Service]
Type=forking
User=minecraft
WorkingDirectory=/usr/local/minecraft/
ExecStart=/bin/bash /usr/local/minecraft/minecraft_script.sh start
ExecStop=/bin/bash /usr/local/minecraft/minecraft_script.sh stop
[Install]
WantedBy=multi-user.target
適切に設定されているか起動と停止を確認します
# 起動
systemctl start minecraft.service
#確認
systemctl status minecraft.service
# 停止
systemctl stop minecraft.service
#確認
systemctl status minecraft.service
# 起動&自動起動設定
systemctl enable --now minecraft.service
# 確認
systemctl status minecraft.service
systemctl is-enabled minecraft.service
おわりに
最後にもう一度クライアントから接続します。
無事接続できました!構築完了です!
はじめてマイクラサーバを構築しましたが、tmuxやシェルスクリプトのことを学べて楽しかったです!
参考
Discussion