Minecraft Server 搭建简易教程(基于 CentOS 系统)

(Phoenix Emik) #1

前言

为骗顶群搭建 Minecraft 服务器。
我只熟悉使用 RPM 的系统,不常用 Debian 或 Ubuntu。
因此本文基于 CentOS 7.6。
本 Minecraft Server 搭建教程基于官方 Wiki 引用的外部文章,详见参考。

需求

  1. VPS 一台,内存 2 GB 以上,带宽 10 M 以上。所在地首选中国,次选香港,确保网络连通性良好。
  2. 本地终端,推荐 MobaXterm
  3. Google 搜索,以便自行解决问题。
  4. 若干鸽子群友,帮忙测试。

服务器环境准备

  1. 防火墙面向公网开放 TCP:25565 端口,这个端口是 Minecraft 服务端所监听的端口。
  2. (可选)升级到最新的 CentOS 版本,以获得最新的安全更新,提高安全性。
  3. (可选)升级到最新内核并启用 BBR 拥塞控制算法,提高 TCP 连接的稳定性。
  4. (可选)将 ssh 服务监听端口修改为非 22 端口,避免被黑客扫描,避免带宽被黑客占用,提高安全性。

Minecraft 服务端安装

新建用户及用户组

groupadd -r minecraft
useradd -r -g minecraft -d "/var/minecraft" -s "/bin/bash" minecraft
mkdir -p /var/minecraft/{backup/server,build/spigot,build/mcrcon,server}

minecraft:minecraft 用户用于执行 Minecraft 服务端进程,以提高安全性。
该用户以 /var/minecraft/ 目录作为主目录,主目录将用来存放 Minecraft 服务端相关文件。

确认已经创建了对应用户及用户组。

编译安装 Spigot

我们将使用非官方构建的 Minecraft Server 版本 Spigot,原因是相比官方 Server,Spigot 性能更好,且支持插件扩展。同样可以选择 Sponge 作为服务端,搭建原理类似。
由于版权问题,Spigot 需要自己编译,编译过程需要使用至少 1 GB 内存,否则可能无法编译或出错。

1. 安装 OpenJDK, Git 及其依赖,用于编译及执行服务端

yum -y install java git

2. 创建 Spigot 构建脚本,并为脚本授予执行权限

touch /var/minecraft/build/spigot/update.sh
chmod +x /var/minecraft/build/spigot/update.sh

使用 vim 或任意编辑器来编辑脚本,

vim /var/minecraft/build/spigot/update.sh

复制内容如下:

#!/bin/env bash

HOME="/var/minecraft"

# Download
wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar -O ${HOME}/build/spigot/BuildTools.jar &> ${HOME}/build/spigot/lastdl.log && echo "Download Successful"

# Build
java -Xmx1G -jar ${HOME}/build/spigot/BuildTools.jar --rev ${1:-latest} &> ${HOME}/build/spigot/lastbuild.log && echo "Build Successful"

# Backup
mv ${HOME}/server/spigot.jar ${HOME}/backup/server/$(date +"%Y-%m-%H-spigot.jar") && echo "Backup Successful"

# Install
mv ${HOME}/build/spigot/spigot*.jar ${HOME}/server/spigot.jar && echo "Install Successful"

3. 编译 Spigot

/var/minecraft/build/spigot/update.sh

编译过程中还会下载各种依赖以及原版服务端,时间可能需要 20 分钟以上。
输出 "Install Successful" 时则代表编译成功,并将服务端安装在预期目录内。
以下命令可用于查看编译日志:

tailf /var/minecraft/build/spigot/lastbuild.log

打印上述日志后则代表编译完成。

配置 Minecraft 服务端

编辑 /var/minecraft/server/server.properties 配置文件,详细配置含义请参考官方配置文档

#Minecraft server properties
#(File Modification Datestamp)
spawn-protection=16
max-tick-time=60000
generator-settings=
force-gamemode=false
allow-nether=true
enforce-whitelist=false
# 游戏模式,0 为生存,1 为创造,2 为冒险,3 为旁观
gamemode=0
enable-query=false
player-idle-timeout=0
# 难度等级,0 为和平,依此类推
difficulty=1
# 怪物刷新开关
spawn-monsters=true
broadcast-rcon-to-ops=true
op-permission-level=4
pvp=true
snooper-enabled=true
level-type=DEFAULT
hardcore=false
enable-command-block=false
max-players=20
network-compression-threshold=256
resource-pack-sha1=
max-world-size=29999984
# 服务器监听端口,保留默认
server-port=25565
debug=false
# 服务器 IP,可以直接留空
server-ip=
# 村民刷新开关
spawn-npcs=true
allow-flight=false
level-name=world
view-distance=10
resource-pack=
# 动物刷新开关
spawn-animals=true
white-list=false
generate-structures=true
max-build-height=256
# 在线模式开关,false 时离线玩家可连
online-mode=false
level-seed=
prevent-proxy-connections=false
use-native-transport=true
# 开启 rcon 支持,端口设置为 25575,密码自行设定
enable-rcon=true
rcon.port=25575
rcon.password=设定 rcon 密码
# 服务器名
motd=A Minecraft Server

(可选)编译安装 mcrcon

mcrcon 是一个 Minecraft Server 的命令行控制台。

# 安装 gcc,tmux 终端复用工具及各种依赖
yum -y install gcc tmux
# 通过 git 克隆源码并编译
cd /var/minecraft/build/mcrcon
git clone git://git.code.sf.net/p/mcrcon/code mcrcon-code
cd mcrcon-code
gcc mcrcon.c -o mcrcon
# 将编译好的可执行档移动到主目录下
cp mcrcon /var/minecraft/
# 创建 tmux 分屏控制台脚本
touch /var/minecraft/minecraftcontrol.sh
chmod +x /var/minecraft/minecraftcontrol.sh

脚本内容如下:

#!/bin/sh
tmux new-session -d -s minecraftcontrol '/var/minecraft/mcrcon -H localhost -P 25575 -p rcon密码 -t'
tmux bind-key -n Escape kill-session
tmux rename-window 'Minecraft Control Center'
tmux split-window -h
tmux send-keys 'journalctl -f -u minecraft -o cat -n 40' 'C-M'
tmux select-pane -l
tmux -2 attach-session -t minecraftcontrol

更改目录所有者为 minecraft 用户

chown minecraft.minecraft -R /var/minecraft/

确保 minecraft 用户能获取主目录 /var/minecraft/ 下的所有文件权限,以便通过 systemd 控制。

编写 systemd 单元配置文件

我们将使用 systemd 来控制 Minecraft Server Service 的开启和关闭。

1. 创建 minecraft.service 配置文件

touch /etc/systemd/system/minecraft.service
chmod +x /etc/systemd/system/minecraft.service

2. 编辑配置文件如下,记得替换 rcon 密码:

[Unit]
Description=Minecraft Spigot Server

Wants=network.target
After=network.target

[Service]
User=minecraft
Group=minecraft
Nice=5
EnvironmentFile=-/var/minecraft/unit.conf
KillMode=none
SuccessExitStatus=0 1

ProtectHome=true
ProtectSystem=full
PrivateDevices=true
NoNewPrivileges=true
PrivateTmp=true
InaccessibleDirectories=/root /sys /srv -/opt /media -/lost+found
ReadWriteDirectories=/var/minecraft/server
WorkingDirectory=/var/minecraft/server
ExecStart=/usr/bin/java -Xmx1536M -Xms1024M -jar spigot.jar --noconsole
ExecStop=/var/minecraft/mcrcon -H localhost -P 25575 -p rcon密码 stop

[Install]
WantedBy=multi-user.target

3. 重新加载 systemd 单元

systemctl daemon-reload

之后便可以通过以下命令来控制 Minecraft 服务端:

systemctl start minecraft # 启动服务端
systemctl stop minecraft # 停止服务端
systemctl status minecraft # 查看服务运行状态
systemctl enable minecraft # 设置开机自启 Minecraft 服务端

Minecraft 服务端运行

执行 systemctl start minecraft 启动服务端。

查看 Minecraft 运行状态

systemctl status minecraft

如图所示,active 表明服务运行正常。

如果无法启动,错误信息提示如下:

则需要先同意 EULA 协议,即编辑 eula.txt 文件中的值为 true:

/var/minecraft/server/eula.txt
# 将 false 修改为 true
eula=true

然后再次启动 Minecraft 服务端。

查看端口是否监听

# 使用 ss 查看端口监听
ss -nlp | egrep '25565|25575'
# 也可以使用 netstat
netstat -nlp | egrep '25565|25575'

如图所示,服务器已正常监听 TCP:25565TCP:25575 端口。

找群友帮忙测试

image

(可选)搭建北美用户专线

目的

提高北美用户连接 Minecraft 服务器的体验。

原理

使用 nginx 搭建一个 TCP 反向代理。

流程简述

1. 安装 nginx

参考 http://nginx.org/en/linux_packages.html 或网上教程,官方预编译包已满足 TCP 反向代理需求,故直接使用 yum 安装即可。

2. 配置 nginx

编辑 /etc/nginx/nginx.conf 配置文件,将内容替换如下,注意替换 Minecraft 服务器 IP:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

stream {
    server {
        listen 25565;
        proxy_pass Minecraft服务器IP:25565;
    }
}

该配置的作用是,通过 nginx 将 25565 的流量转发至后端 Minecraft 服务器上的 25565 端口,形成反向代理。

3. 启动 nginx

systemctl start nginx

TCP:25565 端口正常监听,则服务正常。

(可选)使用 frp 转发流量

目的

若 Minecraft Server 搭建在内网环境(如本地虚拟机),可以使用 frp 将端口转发到公网服务器上,通过公网服务器 IP 进行访问。

流程简述

frp 服务端

1. 安装

下载预编译包,并将可执行文件和配置复制到相应目录中:

wget https://github.com/fatedier/frp/releases/download/v0.28.2/frp_0.28.2_linux_amd64.tar.gz -O frp.tar.gz
tar -xvf frp.tar.gz
cd frp_0.28.2_linux_amd64
cp frps /usr/local/bin/frps
mkdir /etc/frp
cp frps.ini /etc/frp/frps.ini

创建 frps.service 单元配置文件并编辑:

vim /usr/lib/systemd/system/frps.service
[Unit]
Description=frp Server Daemon
After=network.target
Wants=network.target

[Service]
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.ini
Restart=always
RestartSec=20s
User=nobody

[Install]
WantedBy=multi-user.target

2. 配置

编辑服务端配置文件 frps.ini

vim /etc/frp/frps.ini
[common]
token = 设置token
bind_port = 7000

3. 启动

systemctl daemon-reload
systemctl start frps

frp 客户端

1. 安装

下载预编译包,并将可执行文件和配置复制到相应目录中:

wget https://github.com/fatedier/frp/releases/download/v0.28.2/frp_0.28.2_linux_amd64.tar.gz -O frp.tar.gz
tar -xvf frp.tar.gz
cd frp_0.28.2_linux_amd64
cp frpc /usr/local/bin/frpc
mkdir /etc/frp
cp frpc.ini /etc/frp/frpc.ini

创建 frpc.service 单元配置文件并编辑:

vim /usr/lib/systemd/system/frpc.service
[Unit]
Description=frp Client Daemon
After=network.target
Wants=network.target

[Service]
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini
Restart=always
RestartSec=20s
User=nobody

[Install]
WantedBy=multi-user.target

2. 配置

编辑客户端配置文件 frpc.ini

vim /etc/frp/frpc.ini
[common]
token = 与服务端设置的token相同
server_addr = 服务器IP
server_port = 7000
login_fail_exit = false

[minecraft]
type = tcp
local_ip = 127.0.0.1
local_port = 25565
remote_port = 25565

3. 启动

systemctl daemon-reload
systemctl start frpc

使用

当 frp 的服务端和客户端都启动后,便可以直接通过公网服务器的 IP 访问运行在内网环境里的 Minecraft Server。

参考文献

  1. Setting up a Minecraft server using Systemd, https://teilgedanken.de/Blog/post/setting-up-a-minecraft-server-using-systemd/
  2. Minecraft Server Command Center Script, https://teilgedanken.de/Blog/post/minecraft-server-command-center-script/
  3. server.properties – Official Minecraft Wiki, https://minecraft.gamepedia.com/Server.properties
  4. TCP and UDP Load Balancing, https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer/
  5. frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet., https://github.com/fatedier/frp
(410762241) #2

我也开着一个1.13.2的spigot,生存玩完了开始放飞自我

(Phoenix Emik) #3

還是你比較閒…

(假熊猫) #4

看成MicroSoft Server了

(Phoenix Emik) #5

MC 畢竟被 MS 收購…

(Phoenix Emik) #6

预计更新本地架设服务器+frp转发思路

(Phoenix Emik) #7

更新完成