Yuan Tuo
文章29
标签27
分类12
搭建 Minecraft 服务器

搭建 Minecraft 服务器

准备服务器

突然想玩 Minecraft 联机,于是就捣鼓了一下。首先肯定要准备服务器,想起之前做过一期视频,然后打开阿里云的学生机页面。

结果非常 Amazing 啊

曾经的 https://promotion.aliyun.com/ntms/act/campus2018.html 这个页面转跳到了开发者成长计划 (aliyun.com)

就是说原来的活动没有了,换了个新活动。

仔细看看,似乎价格还不错

等到要付款才发现根本没有优惠,于是想起来腾讯也有这么一个活动。

还是腾讯香,二话不说马上买了一个

经过坚苦的找资料,终于把mc给装上了

现在才发现远没有想的那么难

开始安装

准备java环境

1
2
3
4
#安装 Java
yum install java-1.8.0-openjdk
#检查版本
java -version

下载游戏服务器端文件

1
2
3
4
#创建个mc运行目录
cd /
mkdir minecraft
cd minecraft

然后下载游戏服务器端文件

  1. Download server for Minecraft Minecraft
  2. Downloads for Minecraft Forge for Minecraft
  3. SpigotMC - High Performance Minecraft
1
2
#下载服务器端文件
wget https://launcher.mojang.com/v1/objects/1b557e7b033b583cd9f66746b7a9ab1ec1673ced/server.jar

如果你是使用非原版版本,下载完成后,还需要手动构建,命令如下

1
2
3
4
5
6
#安装forge
java -jar forge-1.16.5-36.1.25-installer.jar --installServer

#构建水桶服务器
(超级久)
java -Xmx1024M -jar BuildTools.jar --rev 1.16.5

防火墙放行

在配置页面找到对应的页面放行 25565 端口(Minecraft联机默认端口)

如果安装了宝塔面板之类的程序,也需要放行端口。

启动服务器

执行下方指令即可,其中1024指的是启动内存,2000指的是最大内存。

1
java -Xms1024m -Xmx2000m -jar server.jar

第一次启动后要同意协议,操作如下:

  1. 在shell中输入 vim eula.txt 编辑 eula.txt 文件
  2. i 键,进入编辑模式
  3. eula=false 改为 eula=true
  4. Esc 键,输入 :wq 保存退出(冒号是命令的一部分,记得输入哦)

然后再次执行启动命令

1
java -Xms1024m -Xmx2000m -jar server.jar

准备连接

复制服务器的公网ip,粘贴到Minecraft中即可连接

更多设置

打开 server.properties 文件进行修改即可,下面是几个常用的设置:

  • player-idle-timeout 玩家多久没动被踢出服务器 (0 表示不限制,单位秒)
  • pvp 玩家互相伤害
  • enable-command-block 启用命令方块
  • max-players 最大玩家数
  • server-port 连接端口,默认25565
  • online-mode 是否开启正版验证
  • motd 服务器页面表语

修改后要记得保存并重启服务才可生效

进一步优化

24h不间断开服

当你把终端关闭时,服务器也会随之停止,这时候就需要安装一个 screen 来解决这个问题

1
2
3
4
5
#安装screen
yum install -y screen
#创建一个新screen
screen -R Minecraft
#按Ctrl+A+D退出当前screen

运维脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/bin/bash

# Latest edit : 2021-07-13
# Coded by yzy
# Updated by LC
# Updated by Yuan_Tuo<yuantuo666@gmail.com>

USERNAME='root'
BIN_PATH='/minecraft'

MAX_MEM='2000M'
MIN_MEM='1024M'
LOG="$BIN_PATH/record_status.log"

dir=$(ls -l ${BIN_PATH}/mojang/ awk '/^d/ {print $NF}')

WAITING_TIME=5

ME=`whoami`

#-----------------------------------------

if [ $ME != $USERNAME ] ; then
echo "Please run the $USERNAME user."
exit
fi

usertip(){
echo "Support version:"
for i in $dir
do
echo $i
done
echo "Usage: $0 [start/stop/restart/status/direct/cleanMinecraftItem] [version]"
}

if [ ! -f "${BIN_PATH}/mojang/$2/server.jar" ];then
echo "Not exist $2."
usertip
exit
fi

BOOT_PATH="mojang/$2"
NAME="Minecraft_$2"

direct(){
cd "${BIN_PATH}/${BOOT_PATH}"
java -Xmx$MAX_MEM -Xms$MIN_MEM -jar "${BIN_PATH}/${BOOT_PATH}/server.jar" nogui
}

start(){
if pgrep -u "$USERNAME" -f "$NAME" > /dev/null ; then
echo "$NAME is already running!"
exit
fi

echo "Starting $NAME..."

cd "${BIN_PATH}/${BOOT_PATH}"
screen -AmdS "$NAME" java -Xmx$MAX_MEM -Xms$MIN_MEM -jar "${BIN_PATH}/${BOOT_PATH}/server.jar" nogui

echo $(date +%Y/%m/%d-%H:%M)_Start $NAME >> "$LOG"
exit
}

stop(){
if pgrep -u "$USERNAME" -f "$NAME" > /dev/null ; then
echo "$NAME has stopped."
else
echo "$NAME is not running!"
exit
fi

screen -S "$NAME" -X eval 'stuff "stop"\015'

echo $(date +%Y/%m/%d-%H:%M)_Stop $NAME >> "$LOG"
exit
}

restart(){
if pgrep -u "$USERNAME" -f "$NAME" > /dev/null ; then
screen -S "$NAME" -X eval 'stuff "stop"\015'
fi

echo "Please wait $WAITING_TIME seconds for restarting."
sleep $WAITING_TIME

cd "$BIN_PATH"
screen -AmdS "$NAME" java -Xmx$MAX_MEM -Xms$MIN_MEM -jar "$BIN_PATH/$BOOT_FILE" nogui
echo "$NAME has restarted."

echo $(date +%Y/%m/%d-%H:%M)_Restart $NAME >> "$LOG"
exit
}

status(){
if pgrep -u "$USERNAME" -f "$NAME" > /dev/null ; then
echo "$NAME is running."
exit
else
echo "$NAME is not running."
exit
fi
}

cleanMinecraftItem(){
if pgrep -u "$USERNAME" -f "$NAME" > /dev/null ; then
screen -S "$NAME" -X eval 'stuff "say 30s 后将会清空掉落物,请捡起重要物品!"\015'
sleep 30
screen -S "$NAME" -X eval 'stuff "kill @e[type=minecraft:item]"\015'
fi
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
direct)
direct
;;
cleanMinecraftItem)
cleanMinecraftItem
;;
*)
usertip
esac

[2021-07-13 00:07]更新了下脚本,搞成了版本分离的样子,整理工作由 lc 完成。准备研究 PHP 控制服务器启动。(挖坑)

本文作者:Yuan Tuo
本文链接:https://blog.imwcr.cn/2021/06/08/%E6%90%AD%E5%BB%BA-minecraft-%E6%9C%8D%E5%8A%A1%E5%99%A8/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×