如果想搭建一个 Minecraft 多人服务器供你和朋友游玩,本片文章将提供很多帮助。最终,我将部署一个离线玩家也能进入的小型原版生存服务器,同时通过一些 mod 的帮助,实现离线模式下不会出现”盗号“的问题。
本文基于自购云服务器(拥有公网 IP 的便利)展开,在技术选择上:
- 操作系统选择 CentOS 的续作 Rocky Linux 9.0
- 服务管理选择 Docker 容器化技术
- Minecraft 版本选择目前最新的 1.20.6 版本,使用 Fabric 服务端
- Java 21 环境
📝 服务器配置要求
根据经验,要满足 10+ 以上的玩家进行游戏,需要网络带宽、CPU、内存达到一定的性能指标。
1. 网络带宽
根据文章的估算,1Mbps 的带宽可以供 4 名玩家正常游戏,这里使用的云服务器选择了 5Mbps 的带宽配置,理论上最多可以同时容纳 20 名玩家在线。
这里使用
speedtest-cli
工具测试带宽:sudo dnf install -y speedtest-cli
speedtest-cli
speedtest-cli
Retrieving speedtest.net configuration... Testing from Unknown (117.72.77.186)... Retrieving speedtest.net server list... Selecting best server based on ping... Hosted by Radius-NET (Ulan-Ude) [1959.23 km]: 265.1 ms Testing download speed................................................................................ Download: 11.83 Mbit/s Testing upload speed...................................................................................................... Upload: 6.02 Mbit/s
可以看到带宽满足需求,在网络较好的情况下还有剩余。
2. CPU
查看CPU:
cat /proc/cpuinfo
processor : 3 vendor_id : GenuineIntel cpu family : 6 model : 85 model name : Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz stepping : 4 microcode : 0x1 cpu MHz : 2394.374 cache size : 16384 KB physical id : 0 siblings : 4 core id : 1 cpu cores : 2 apicid : 3 initial apicid : 3 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti ibrs ibpb fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa itlb_multihit bogomips : 4788.74 clflush size : 64 cache_alignment : 64 address sizes : 46 bits physical, 48 bits virtual power management:
经测试发现 CPU 单核性能和核心数都是满足要求的。
3. 内存
由于原版生存服没有很多玩法扩展的需求,服务器的内存消耗更多在玩家数量和玩家行为上,后面将分配 6GB 的内存,后续看情况适当增加。
查看服务器的内存信息:
free -mh
total used free shared buff/cache available Mem: 15Gi 232Mi 14Gi 9.0Mi 463Mi 14Gi Swap: 0B 0B 0B
这里我想更进一步了解云服务器使用的内存硬件信息,所以使用
dmidecode
工具帮忙查看:sudo dnf install dmidecode
dmidecode
sudo dmidecode -t memory
# dmidecode 3.5 Getting SMBIOS data from sysfs. SMBIOS 2.8 present. Handle 0x1000, DMI type 16, 23 bytes Physical Memory Array Location: Other Use: System Memory Error Correction Type: Multi-bit ECC Maximum Capacity: 16 GB Error Information Handle: Not Provided Number Of Devices: 1 Handle 0x1100, DMI type 17, 40 bytes Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: Unknown Data Width: Unknown Size: 16 GB Form Factor: DIMM Set: None Locator: DIMM 0 Bank Locator: Not Specified Type: RAM Type Detail: Other Speed: Unknown Manufacturer: Red Hat Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Rank: Unknown Configured Memory Speed: Unknown Minimum Voltage: Unknown Maximum Voltage: Unknown Configured Voltage: Unknown
可以看到
Error Correction Type
为 Multi-bit ECC
,更加稳定🛠️ 防火墙设置
由于 minecraft 不指定端口下默认使用 25565 作为多人游戏通信端口,这里增加 25565 端口的通行规则:
🐳 Docker 安装
首先确保所有系统包是最新的:
sudo dnf update -y
安装一些必要的依赖包,以确保Docker能够正确安装和运行:
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
使用以下命令添加Docker的官方仓库:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
从Docker的官方仓库中安装Docker CE(Community Edition):
sudo dnf install -y docker-ce docker-ce-cli containerd.io
安装完成后,启动Docker服务并设置开机自动启动:
sudo systemctl start docker sudo systemctl enable docker
运行以下命令,验证Docker是否正确安装并运行:
sudo docker run hello-world
📦 启动 Minecraft 容器
多亏社区的力量,已经有现成的镜像供我们部署:
推荐使用 Docker compose 部署,首先选择合适的位置进行我们的后续操作
mkdir -p ./mc/docker cd mc/docker/ pwd
然后创建
docker-compose.yml
:vim docker-compose.yml
这是我提前写好的内容:
services: mc: image: itzg/minecraft-server container_name: Ct ports: - 25565:25565 environment: EULA: "TRUE" TYPE: "FABRIC" ONLINE_MODE: "True" SERVER_NAME: "CT" MOTD: " §9§l「 C§f§lT 」\n §7Play and build with friends !" OVERRIDE_SERVER_PROPERTIES: "TRUE" tty: true stdin_open: true restart: unless-stopped volumes: # attach a directory relative to the directory containing this compose file - ./minecraft-data:/data
docker-compose.yml
可以查看Docker和该镜像的文档了解具体含义保存退出后,还是在该目录下运行:
docker compose up -d
-d
去掉。等待一段时间,期间我们查看容器的状态:
docker ps -a
当状态从
health: starting
变为 healthy
,你已经部署完成了。🍎 添加LOGO
再次查看我们的 ./mc/docker 目录,发现多了 minecraft-data 目录,这是绑定容器内 data 目录的数据卷对应的文件夹。我们通过 SFTP 上传一张服务器 logo,名字为:
修改
docker-compose.yml
,增加 ICON
: "/data/Ct.png"
,现在你的文件应该看起来像这样:services: mc: image: itzg/minecraft-server container_name: Ct ports: - 25565:25565 environment: EULA: "TRUE" TYPE: "FABRIC" ONLINE_MODE: "True" ICON: "/data/Ct.png" SERVER_NAME: "CT" MOTD: " §9§l「 C§f§lT 」\n §7Play and build with friends !" OVERRIDE_SERVER_PROPERTIES: "TRUE" tty: true stdin_open: true restart: unless-stopped volumes: # attach a directory relative to the directory containing this compose file - ./minecraft-data:/data
保存并重新部署:
docker compose up -d
现在我们启动游戏并添加服务器,地址即服务器的IP,可以看到:
🥄 配置域名
当你还没来得及进去看看就迫不及待地把服务器IP发给你的朋友时,你会发现直接暴露 IP 的方式非常不好记忆,而且解析起来很慢很慢。不仅如此,你的服务器 IP 应该和你的家庭地址一样是隐私信息,直接暴露 IP 十分危险。
刚好我购买了一个域名,假设是 test.com,在域名提供商的配置面板上进行配置:
现在使用 mc.test.com 即可访问搭建好的服务器
📴 让离线玩家能够访问
还记得我们的目标吗?我们想让离线玩家也可以加入服务器,但如果你现在尝试进入会发现:只有正版登录的玩家能够加入,而离线的玩家将被拒绝。
原因是我们在
docker-compose.yml
中设置了需要正版验证:ONLINE_MODE: "True"
改为 False 即可解决,但是这么做我们将命令另一个问题:由于离线模式的服务器不再验证玩家的真实性,玩家随时可以被冒名顶替,其中的危险在于任何人都可以使用拥有 OP 权限的账号,这对服务器来说十分危险(为什么会这样不多赘述)。
这里我找到一个 Fabric 下的 mod,加装这个 mod 即可使我们的正版验证模式的服务器也可以面向离线玩家,下载这个 mod 以及它的前置 mod:
将它们上传到 minecraft-data 目录下的 mods 文件夹内:
重启 Ct 容器:
docker restart Ct docker ps
即可实现正版玩家不用游戏内再次登录验证、离线玩家需要用密码验证身份了。
📐 更改配置
考虑到进入游戏后的要阅读英语提示,很容易把我们累死,这里进行手动汉化:
cd cd ./mc/docker/minecraft-data/config/EasyAuth/ ls
修改
main.conf
max-login-tries: 5 reset-login-attempts-timeout: 60
修改
extended.conf
allow-chat: true allow-movement: true
修改
translation.conf
进入游戏,确认已经给自己 OP 权限,使用
/auth reload
指令进行配置文件重载,退出再次进入即可看到变成中文提示了。