文章11
标签16
分类0
Minecraft JAVA版服务器踩坑

Minecraft JAVA版服务器踩坑

时间线

朋友看了TIS的视频心潮澎湃,打算拉着我和几个小伙伴开个Minecraft服务器玩玩,于是有了这个计划;

一开始打算采用Zerotier建立虚拟局域网连接,但无奈对方校园网络环境太差,NAT层层套娃,体验极其差,最终只得选择云服务器进行搭建。

2019/12/19 初代

阿里云学生机 X2
具体配置:1核2G1M(自然是Mbps),9元/月,一台开服一台转发流量缓解带宽压力
初代人数:6人
服务器核心:原版1.14.4
体验:极差

2020/01/13 二代目

百度云服务器 X3
具体配置:乘着年终采购活动买到了1折的云服务器,分别为
2核4G1M,238元/年
1核2G2M,151元/年
1核1G1M,84元/年
一台开服,另外两台作转发缓解带宽压力
二代目人数:9人
服务器核心:Spigot1.14.4
体验:一般

2020/02/15 三代目

阿里云服务器 X7
具体配置:因疫情肆虐,阿里助力上云,白嫖6个月ECS(可免费延期至1年),发动小伙伴一人一台。2核4G1M带宽,1台开服,剩下全作转发缓解带宽压力
三代目人数:11人
服务器核心:PaperSpigot1.14.4
体验:一般

动手过程

这里以阿里云ECS为例,百度云配置方式太过傻瓜

购买云服务器

  1. 注册登录阿里云/百度云,进行实名认证(和学生认证);
  2. 购买(白嫖)2核4G的云服务器,年末年初优惠力度较大。选择地域杭州,操作系统Centos7.5,其他默认;
  3. 初始化,设置密码(一开始忘记设置,死活登录不上);
  4. 安全组规则修改,放行25565端口(MC默认端口,没打算改)入站流量;
    安全组规则
  5. 安装Xshell&Xftp软件,连接云服务器;

准备工作

  1. 安装 Screen 和 Java:
    yum -y install screen
    yum -y install java-1.8.0-openjdk
    
    Note:Screen 可以保持本地和服务器断开后,程序继续在服务器上运行,防止退出shell会话后mc服务端进程自动结束。
  2. 由于服务器网络原因,本地下载Minecraft原版服务器端,用xftp丢进云服务器里;
  3. 添加新用户minecraftserver(其实只是搭建私人小服的话不添加直接用root账户也可以):
    adduser minecraftserver
    
  4. 设置密码:
    passwd minecraftserver
    

正式搭建

  1. 由于服务器网络原因,在本地下载完服务端再用Xftp丢进服务器。
    Mojang原版
    下载链接可以在 中文Minecraft WiKi 内找到(Gamepedia速度过慢可以换用部署在Bilibili的 中文Minecraft WiKi 镜像站 )
    单独版本的WiKi地址:https://wiki.biligame.com/mc/版本号
    比如1.14.4就为:https://wiki.biligame.com/mc/1.14.4
    Spigot
    官网:https://spigotmc.org
    下载地址:https://hub.spigotmc.org/jenkins/job/BuildTools/
    PaperSpigot
    官网:https://papermc.io
    Github:https://github.com/PaperMC/Paper
    下载地址:https://papermc.io/downloads

  2. 如果是原版,直接打开Xftp,连接服务器,进入新建用户minecraftserver的目录 /home/minecraftserver/ ,把下载下来的文件 server.jar 丢进去;
    如果是Spigot/Paperspigot,下载下来的是 buildtools.jarpaper.jar ,要先进行本地构建。构建完后把构建好的jar改个名字,改为 server.jar ,和原版一样丢进服务器。

  3. 服务器同目录下新建脚本 start.sh ,填写如下的玄学内容:

    #!/bin/sh  
    screen -dmS mc java -Xms2G -Xmx2G -XX:+AggressiveOpts -XX:+UseCompressedOops -jar /home/minecraftserver/server.jar
    

    Note 1:关于screen
    Note 2:-Xms初始内存 -Xms最大内存 -XX:+AggressiveOpts引入实验性的优化 -XX:+UseCompressedOops压缩指针

  4. 如果是在Windows下编辑,需要确保文档格式为Unix:
    Notepad++修改文档格式: 编辑 -> 文档格式转换 -> 转为Unix (LF)
    Vim修改文档格式:

    cd /home/minecraftserver
    vim start.sh
    

    进入修改界面,键入 :set ff ,最底下显示 fileformat=unix 则正常,若显示 fileformat=dos,则需要进一步输入 :set ff=unix ,完事后再输入 :set ff 确认文档格式已为Unix,最后 :wq 保存退出;
    Note:关于Vim

  5. 第一次启动,用用户minecraftserver登入,运行刚刚整好的脚本:

    cd /home/minecraftserver
    ./start.sh
    
  6. 第一次会报错,同目录下找到eula.txt并修改 eula=falseeula=true ;又为了允许盗版玩家加入,找到server.properties并修改 online-mode=trueonline-mode=false ,完事后重新启动;

  7. 作为一个盗版玩家心怀惭愧和感激,加入游戏。
    EULA

端口转发-打通内网

单个云服务器的带宽属实不够,网络压缩得太狠服务器vCPU又顶不住,又因为阿里云内网流量带宽上限够大,且不计入外网流量内,同区域内VPC内网连接即使是跨账号也不花钱,于是下定决心找服里的小伙伴各自创建账号再买(嫖)一台云服务器做转发。

下面以MAIN-ECS和NAT-ECS代指两个阿里云ECS实例(实际上是7个…):
注:百度云同账号同地域服务器默认内网互通,无需以下操作;而跨账号内网默认不通,即使是同地域也不行,必须充钱才能变得更强。

  1. 进入阿里云Main服务器控制台,进入其所在的专有网络(VPC),创建 云企业网(CEN) 并将同账号下MAIN-ECS实例加载进该云企业网,并记录下账号ID、专有网络(VPC)实例ID、云企业网(CEN)实例ID;
    加载同账号VPC实例
  2. 登新号,购买(白嫖)新ECS,选择相同地域,初始化,安全组内开放25565端口(或自行设置其他端口),并记录下账号ID、专有网络(VPC)实例ID;
  3. 跨账号VPC授权,将NAT-ECS所在VPC 授权给 MAIN-ECS所在VPC加入的CEN;
    跨账号授权入口
  4. 加载跨账号VPC实例,将NAT-ECS所在VPC 加载到 MAIN-ECS所在VPC加入的CEN 中,也就是让NAT-ECS和MAIN-ECS各自所在的VPC网络实例处于同一个CEN实例内,CEN会自动配置路由规则;
    加载跨账号VPC实例
  5. Xshell分别打开两个云服务器,互相ping对方的内网ip,ping通说明成功;

小插曲-网段冲突

在把所有VPC加入云企业网时,出现有一个VPC下的云服务器无法ping通的故障,刚开始还以为是加入云企业网的VPC实例数量达到上限了,查找过相关帮助文档后发现并没有超过限额。最后在云企业网下的路由表发现冲突项,原来是这个VPC和已经在云企业网内的另外一个VPC发生了网段冲突。

解决方法:

  1. 记录一下所有VPC的网段,然后在发生冲突的其中一个VPC内新建同地域交换机,网段要避开已有的;
    VPC内创建新交换机
  2. 停止ECS实例,在网络与安全组下点选修改私网ip;
  3. 交换机选择刚刚新建的交换机,然后修改私网ip;
  4. 重启实例,重新将该ECS实例所在VPC加入云企业网。

参考链接:https://yq.aliyun.com/articles/710358

端口转发-配置转发

做TCP端口转发有很多方法,可以用nginx,可以用iptables,可以用firewall,鉴于iptables配置起来比较麻烦,在Centos7下还被阉割掉了,而nginx还得装,所以这里选择用自带的firewall来做TCP端口转发。
Note:用firewall做TCP端口转发会导致Minecraft服务器无法获得玩家真实ip,如果有这方面需求的话需要使用nginx。

  1. Xshell打开NAT-ECS,查看firewalld服务状态:
    systemctl status firewalld
    
    如果是dead状态,需要先开启firewalld服务:
    systemctl start firewalld
    
  2. 让firewalld服务开机启动,以防止服务器意外宕机后需要重新配置:
    systemctl enable firewalld.service
    
  3. 开启ip伪装功能,zone可以改:
    firewall-cmd --permanent --zone=public --add-masquerade
    
    检查是否成功:
    firewall-cmd --query-masquerade
    
  4. 开放Minecraft默认使用的25565端口,如果改为其他的话服务端也需要要改:
    firewall-cmd --zone=public --add-port=25565/tcp --permanent
    
  5. 端口转发:
    firewall-cmd --add-forward-port=port=NAT-ECS端口(本机端口):proto=tcp:toaddr=MAIN-ECS内网ip地址(要把流量转发到的地址):toport=MAIN-ECS端口(要转发到的端口)
    
    举个例子,开服用的MAIN-ECS的内网ip是111.111.111.111,公网ip为222.222.222.1,开服时设置的端口为25565;转发用的NAT-ECS公网ip为222.222.222.2,开启的端口是12345,则输入
    firewall-cmd --add-forward-port=port=12345:proto=tcp:toaddr=111.111.111.111:toport=25565  
    
  6. 继续用上面的例子:
    客户端输入 222.222.222.1 (因为:25565是MC默认端口所以不用输入,会自动填充) 就可以直接连接到MAIN-ECS上的服务器;
    客户端输入 222.222.222.2:12345 (因为:12345不是MC默认端口,所以要自行输入) 就可以通过NAT-ECS间接连接到MAIN-ECS上的服务器。
  7. 补充
    如果想要关闭firewalld服务,输入 systemctl stop firewalld 即可;
    如果想禁用firewalld服务开机启动,输入 systemctl disable firewalld.service 即可。

服务器优化

本文作者:.torrent
本文链接:https://blog.hitachimako.top/2020/mc-java-server/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可