【教程】如何开出像Shanwer那样的Minecraft服务器
本文最后更新于 1293 天前,其中的信息可能已经有所发展或是发生改变。
建议
建议你使用手机横屏模式或者电脑浏览此页面以获得更优质的阅读体验
警告
请确保你具有理性对待问题与独立解决问题的能力后再阅读下文,否则请按右上角的红叉×关闭
本博客已与百度达成合作协议,许多常见的问题你都可以在百度解决。此外,Bing也是你的备用解决方案,请在这两个伙伴都无力解决你的问题后再致电

1.前言

警告
如果你想要节约时间,这段话可以不看

我见过许多人租不起昂贵的云服务器因而放弃开服,还有人说,穷鬼不配开服。额,我的观点是,如果你开服是为了赚钱的话,我会对你表现出深深的鄙视厌恶。如果你是为了维护Minecraft社区生态而贡献自己的一份力量,很好,给你点赞,有问题可以直接找问。(前提你得自己用搜索引擎来试图解决问题)反正,商业服给爷爬,请直接按右上角红叉。然后,至于那些说“穷鬼不配开服”诸如此类言论的,一般拉黑,常规操作。不要因为几个lowbee而放弃。

这篇文章在你拥有理性对待问题独立解决问题的能力的前提下,能够教你开出像Shanwer一样的服务器

教程并不详细,主要是指路,你搜索引擎都解决不了再找

我为什么一直强调用搜索引擎独立自主解决问题,你要知道,如果你想担当起腐竹这个称号的话,不是网上下点什么开服包拿过来跑个批处理就完事的。如果是这样,相信你在服务器遇到崩溃与性能问题时必将,手足无措,删库跑路。

为什么本文使用WSL?

警告
本文”WSL“特指”WSL1

Windows的任务计划程序想要开机自启,如果选择“不管用户是否登录都要运行”时,你的控制台任务会以System用户身份执行,因而,这是一个系统进程,会在后台执行,无法控制控制台。如果“只在用户登录时执行”时,顾名思义,你得登录你的账户,很麻烦,个人认为还不如Win+R+shell:startup来的方便(虽然可以开机自动登录你的账户,但是,不安全,控制台也运行在桌面,不能用ssh,远程桌面控制占用带宽)。我这里提供了两种优雅的方法。

这样的操作不会显示控制台,而也只有这样才能免登录开机执行计划任务
  • WSL+Tmux配合任务计划程序(本文指导这个方法)
    • 服务器在Windows上运行,无须担心wsl带来的性能损耗,而可以使用ssh来控制服务器(别急,方法就在下面教你)
      • 这个方法来自Agendakiwi指导,对他表示由衷的感谢
  • MCSManger+HTTP GET API控制自动开关服务器实例(本博客提供本人编写的程序实现其API控制开关服务器以做到自动化)
    • MCSManger提供一个漂亮的网页管理面板对你的服务器进行控制,不过像我的群组服控制不同服务器比较麻烦,ssh性能也比网页面板快,Tmux命令行也操作确实优雅快捷。所以教你第一个方法。
    • 至于MCSManger随服务器开启自动启动Minecraft服务器依靠API实现。
      • 别担心,你不会写代码?我帮你写了一个!API实现请转到本文章最下方或者在博客中搜索:Java实现MCSManger HTTP GET API,直接把程序喂给你,java -jar xxx.jar就能跑喽(记得改jar里的config!)源代码我不好意思放出来,本人是萌新(雾),有需求研究自行Idea反编译(你有这功夫不如去看MCSManger的API文档)

好处

  • 一般的,你的服务器性能会比绝大多数几十甚至几百/月的云服务器性能都高,然后,还很省钱
  • 不同于一般的24*7开服,省电,保护硬件寿命(由于自动开关机&服务器),还节省远程控制时的带宽占用(WSL的openssh server)
  • 自己可以用自己的专属加速IP:127.0.0.1,断网了也能玩的那种(大雾)
  • 就没了,我还没想到
  • (反正穷鬼这样做就对了!)

2.准备工作

  • 硬件
    • x86_64架构的计算机(奔腾也不是不可以,你能跑Windows 10 64位就行)
    • 4GB以上RAM(DDR3也行,Windows 10 64位肯定要 4GB 以上RAM才能流畅运行呀)
    • 网线连接的计算机(不管你什么网线,主要是因为网线的电流大到足以唤醒主板,WOL需要它)
    • 别的其实也没了,你自己应该有的
      • 如果可以的话,最好有UPS
  • 软件
    • Windows 10 64位(1903以上吧,反正你能用WSL就行,WSL子系统马上教你,安装的教程就在下一章)
  • 其它
    • 稳定的供电环境(不确定的话可以用UPS)(没有的话…小心突然停电丢数据就行了,本人BE服务器使用每日备份√)
    • 稳定的互联网连接(上行…你要带10个人,10M总该有吧)
    • 公网IPv4地址
      • 10.xxx.xxx.xxx开头的!你没有公网IP地址!建议和你的ISP(网络运营商)对线。
      • 192.168.xxx.xxx开头的!这也不是公网IP地址,这是你家的局域网!
      • 对线的话,温和一点就说你装个监控摄像头要个公网IP地址。强硬一点就直接拿工信部或者法律威胁它,公网IPv4是你的权力,不要让ISP撅了你的羊毛!
      • 你要怂的话…真丢人,去用FRP(内网穿透)或者自建FRP服务器吧,阿里亚太全时100M对等流量包了解一下(ECS ONLY),FRP同时也是解决跨运营商的好方法,因为许多大型ECS都在BGP机房(中国的网络环境质量…哎)
  • 最后,你一定要有理性对待问题独立解决问题能力,不要遇到一点小问题就放弃跑路,我也是百度过来的,你为什么就不能百度/Bing呢?

3.环境配置

在这里就开始教你安装WSL。

首先,你要在控制面板中的启用或关闭Windows功能启用适用于Linux的Windows子系统,然后重启Windows系统来应用你的操作。

之后你需要在Win10应用商店安装Ubuntu 20.04 LTS分发(笔者就使用此系统)

如果 Microsoft Store 应用不可用,则可以通过单击该链接来下载并手动安装 Linux 发行版:https://docs.microsoft.com/zh-cn/windows/wsl/install-manual

修改apt仓库与切换中文就不教了,必备的是软件包是tmuxopenssh-server

sudo apt install 还需要教吗?我想不要了,不会自己去百度。

4.WSL中配置服务器与init.wsl

WSL是一个神奇的东西,服务LxssManager负责控制WSL,重启/关闭此服务,WSL便被重启/关闭,而不是使用shutdown

同样的,你可爱的openssh-server更不会随着开机自启而自启,经过搜索引擎整合的资料,要使它开机自启,你肯定不能每次自己手动输一遍sudo service ssh start,搜索引擎得到的结果是vim修改/etc/init.wsl,把这货当sh使用,然后再依靠Windows的任务计划程序使用wsl命令执行init.wsl脚本(按照我目前的理解,它应该是一个脚本)。下面给出示例。

echo "your-admin-user-password"|sudo -S service ssh start

上面是/etc/init.wsl的配置,其中引号内的便是你的管理员账户密码(不是Windows是Linux的!)vim修改时记得用sudo vim来提升权限,否则你的修改将没有权限保存。

警告
openssh-server请注意自行修改配置,例如启用密码登录(否则你登录不上)或是修改端口(你的Windows可能先前也配置过openssh-server而占用了22端口)
你无需配置iptables,因为它在WSL上不存在,你只需要配置你的路由器防火墙/端口映射与你的Windows系统上安装的防火墙, 笔者在这里推荐火绒,自从有了它,我总算能看到撞上我防火墙的日志了(不过火绒的防火墙貌似会和Windows Defender的防火墙并存,请注意)
wsl -d Ubuntu-20.04 -u shanwer /etc/init.wsl start

上面是你Windows系统上执行init.wsl的bat的配置,就这么简单

警告
init.wsl一般只适合编写自启Linux服务的脚本!原因在下文解释

之后笔者就如法炮制,把tmux的自启脚本也写进去了,init.wsl长下面这样

echo "your-admin-user-password"|sudo -S service ssh start
tmux new-session -d -s minecraft
tmux new-window -n JE-Survive -t minecraft cmd.exe
tmux new-window -n JE-Lobby -t minecraft cmd.exe
tmux new-window -n JE-Bedwar -t minecraft cmd.exe
tmux new-window -n JE-Practice -t minecraft cmd.exe
tmux new-window -n JE-Group -t minecraft cmd.exe  
tmux new-window -n BE-Survive -t minecraft cmd.exe
tmux new-window -n BE-MiniGame -t minecraft cmd.exe
tmux send-keys -t minecraft:JE-Survive "chcp 65001" C-m 
tmux send-keys -t minecraft:JE-Survive "cd /d E:\Server\Minecraft\JE-Server\Survive" C-m
tmux send-keys -t minecraft:JE-Survive "java -Dfile.encoding=utf-8 -javaagent:authlib-injector-1.1.29.jar=https://skin.shanwer.top/api/yggdrasil -jar Mohist-1.12.2-b69b720-server.jar" C-m  
tmux send-keys -t minecraft:JE-Lobby "chcp 65001" C-m   
tmux send-keys -t minecraft:JE-Lobby "cd /d E:\Server\Minecraft\JE-Server\Lobby" C-m
tmux send-keys -t minecraft:JE-Lobby "java -Dfile.encoding=utf-8 -javaagent:authlib-injector-1.1.29.jar=https://skin.shanwer.top/api/yggdrasil -jar paperclip.jar" C-m
tmux send-keys -t minecraft:JE-Bedwar "chcp 65001" C-m 
tmux send-keys -t minecraft:JE-Bedwar "cd /d E:\Server\Minecraft\JE-Server\Bedwar" C-m 
tmux send-keys -t minecraft:JE-Bedwar "start.bat" C-m
tmux send-keys -t minecraft:JE-Practice "chcp 65001" C-m 
tmux send-keys -t minecraft:JE-Practice "cd /d E:\Server\Minecraft\JE-Server\Practice" C-m 
tmux send-keys -t minecraft:JE-Practice "java -Dfile.encoding=utf-8 -javaagent:authlib-injector-1.1.29.jar=https://skin.shanwer.top/api/yggdrasil -jar PaperSpigot-1.8.8.jar" C-m
tmux send-keys -t minecraft:JE-Group "cd /d E:\Server\Minecraft\JE-Server\Waterfall" C-m
tmux send-keys -t minecraft:JE-Group "java -Dfile.encoding=utf-8 -javaagent:authlib-injector-1.1.29.jar=https://skin.shanwer.top/api/yggdrasil -jar Waterfall.jar" C-m
tmux send-keys -t minecraft:BE-Survive "chcp 65001" C-m 
tmux send-keys -t minecraft:BE-Survive "cd /d E:\Server\Minecraft\BE-Server\Birch_Forest_BE" C-m
tmux send-keys -t minecraft:BE-Survive "start.bat" C-m
tmux send-keys -t minecraft:BE-MiniGame"chcp 65001" C-m 
tmux send-keys -t minecraft:BE-MiniGame "cd /d E:\Server\Minecraft\BE-Server\Birch_Forest_MiniGames" C-m
tmux send-keys -t minecraft:BE-MiniGame "bedrock_server.exe" C-m

你可能会对这一串命令感到头疼,这里先不做解释。

因为,这是不可用的,当我写完这个脚本,嘴角微微上扬,重启测试时,确实发现形势一片大好,等到tmux send-keys -t minecraft:BE-MiniGame “bedrock_server.exe” C-m执行完时,tmux进程便卡死了,你无法对控制台进行交互,控制台也终止日志输出。

后来经过研究,我认为init.wsl只适合启动服务,想要做别的操作最好使用Windows的wsl命令向你的Linux系统发送命令,便是wsl -d Ubuntu-20.04 -u your-linux-user xxxcommand,我在下面给出了我目前使用的实例。

init.wsl(/etc/init.wsl)[Linux]

echo "your-admin-user-password"|sudo -S service ssh start

wsl自启脚本(任意名称).bat(任意可执行位置)[Windows]

wsl -d Ubuntu-20.04 -u shanwer /etc/init.wsl start
wsl -d Ubuntu-20.04 -u shanwer tmux new-session -d -s minecraft
wsl -d Ubuntu-20.04 -u shanwer tmux new-window -n JE-Survive -t minecraft cmd.exe
wsl -d Ubuntu-20.04 -u shanwer tmux new-window -n JE-Lobby -t minecraft cmd.exe
wsl -d Ubuntu-20.04 -u shanwer tmux new-window -n JE-Bedwar -t minecraft cmd.exe
wsl -d Ubuntu-20.04 -u shanwer tmux new-window -n JE-Practice -t minecraft cmd.exe
wsl -d Ubuntu-20.04 -u shanwer tmux new-window -n JE-Group -t minecraft cmd.exe  
wsl -d Ubuntu-20.04 -u shanwer tmux new-window -n BE-Survive -t minecraft cmd.exe
wsl -d Ubuntu-20.04 -u shanwer tmux new-window -n BE-MiniGame -t minecraft cmd.exe
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Survive "chcp 65001" C-m 
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Survive "cd /d E:\Server\Minecraft\JE-Server\Survive" C-m
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Survive "java -Dfile.encoding=utf-8 -javaagent:authlib-injector-1.1.29.jar=https://skin.shanwer.top/api/yggdrasil -jar Mohist-1.12.2-b69b720-server.jar" C-m  
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Lobby "chcp 65001" C-m   
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Lobby "cd /d E:\Server\Minecraft\JE-Server\Lobby" C-m
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Lobby "java -Dfile.encoding=utf-8 -javaagent:authlib-injector-1.1.29.jar=https://skin.shanwer.top/api/yggdrasil -jar paperclip.jar" C-m
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Bedwar "chcp 65001" C-m 
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Bedwar "cd /d E:\Server\Minecraft\JE-Server\Bedwar" C-m 
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Bedwar "start.bat" C-m
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Practice "chcp 65001" C-m 
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Practice "cd /d E:\Server\Minecraft\JE-Server\Practice" C-m 
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Practice "java -Dfile.encoding=utf-8 -javaagent:authlib-injector-1.1.29.jar=https://skin.shanwer.top/api/yggdrasil -jar PaperSpigot-1.8.8.jar" C-m
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Group "cd /d E:\Server\Minecraft\JE-Server\Waterfall" C-m
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:JE-Group "java -Dfile.encoding=utf-8 -javaagent:authlib-injector-1.1.29.jar=https://skin.shanwer.top/api/yggdrasil -jar Waterfall.jar" C-m
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:BE-Survive "chcp 65001" C-m 
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:BE-Survive "cd /d E:\Server\Minecraft\BE-Server\Birch_Forest_BE" C-m
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:BE-Survive "start.bat" C-m
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:BE-MiniGame"chcp 65001" C-m 
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:BE-MiniGame "cd /d E:\Server\Minecraft\BE-Server\Birch_Forest_MiniGames" C-m
wsl -d Ubuntu-20.04 -u shanwer tmux send-keys -t minecraft:BE-MiniGame "bedrock_server.exe" C-m

简单讲解,第一行你可以直接改改就抄(其实都可以)

想要开群组服的腐竹也可以参考脚本看看一个JE群组服一般需要哪些功能的子服务器。

  • wsl -d Ubuntu-20.04 -u shanwer
    • -d 的参数Ubuntu-20.04指的是你的子系统名称,你可在Windows上安装多个子系统,例如DebianCentOSArch
    • -u 的参数shanwer指的是你子系统中的用户,即Linux账户,将以xxx身份执行这个命令
  • tmux send-keys -t minecraft:BE-MiniGame “bedrock_server.exe” C-m
    • tmux?你还不会用吗?这里建议百度,5分钟上手教程√
    • tmux强大的地方便在于提供了实例与窗口这两个概念,相比于screen,还有很多好用的快捷键。
      • 实例:minecraft
        • 窗口:BE-MiniGame
        • 窗口:BE-Survive
        • 窗口:JE-Group
        • 窗口:xxx
    • 一个实例可拥有多个窗口,并可在窗口间任意切换
  • javaagent:authlib.jar为我服务器的外置登录需要用到的程序,你也可以自己整一个!(不做详解,给你指路Blessing-skin,就在GitHub上,开源、免费)

5.Windows配置任务计划程序

这部分很简单,你只需要任务计划程序中开机启动你刚刚编写完的bat程序即可。记得安全选项触发器要像我这样配置。

6.配置DDNS

这一段没有公网IP且不想和电信对线可以跳过,不过本人没有测试过frp套娃wol

普通的家庭用户现在能有公网IP已经很不错了。你的公网IP一般都是流动的,非固定。因而需要一个固定的域名来解析动态的IP地址。这种技术手段被称作DDNS

DDNS一般挂在你的路由器上,本人的路由器陈旧,DDNS仅花生壳可选,这里笔者提示,免费用户没人权,DDNS服务器坏了可能要一天才能恢复解析,到时候就只能干瞪眼。

你的路由器原生支持阿里云的DNS解析服务最好,我认为这个相比花生壳不知道要高到哪里去了。这里也提供高端操作的指路方案。

内网下使用旧手机/树莓派自动执行这个node.js程序(诶?可以跑node.js吗,我不知道,不行的话你可以试试别的语言的自动程序,记得申请阿里的API来获得权限更改DNS A记录,当然喽,你还得有一个域名)

笔者既没有旧手机(自己现在还在用晓龙800与16G的三星Note 3,一小时没电的那种),也没有树莓派,路由器又十分陈旧(欢迎给我打钱),只能用花生壳(用于WOL唤醒),而给玩家使用的是阿里云域名。因为服务器被唤醒后,开启后不就能用node.js使用阿里API来进行动态域名解析了嘛。

7.配置WOL

其实wol只是自动开机的一种,只是过程可控并且开机方便,你也可以尝试定时开机与AC再来电唤醒

7.1被唤醒端配置

你需要确认以下几个设置已被配置为图中选项

Realtek PCIe GbE Family Controller为你的有线网卡驱动程序

此外,你还要关闭Windows快速启动


BIOS(CMOS)中,你需要关闭ErP最优化,并且打开类似于“允许被PCIE设备唤醒”,“WOL唤醒”,“幻数据包唤醒”的选项,这是一项二十多年的老技术,一般主板都支持这个功能,如果不会,建议百度,关键词:WOL唤醒


路由器配置中,你需要先给你的服务器分配一个静态的内网IP地址(将IP与MAC绑定),然后端口映射/虚拟服务器(接受协议为ALL或者UDP)或者启用DMZ主机,既然你开服,这些一般是基本常识,此外,还需要静态ARP绑定。这样才算配置完成。

7.2唤醒端配置

你可以使用网上的wol程序,我自己也使用Java写了一个WOL程序以方便Linux命令行操作,开源库https://github.com/Shanwer/S_Wand,使用方法也在那上面

警告
WOL并不安全,仅少数主板支持WOL带密码协议,所以请不要轻易泄露你的有线网卡硬件MAC地址!否则任何人理论上可以唤醒你的服务器!有条件的话还是部署在内网为妙!(笔者穷鬼部署在香港服务器(本站点的服务器)唤醒…)

Linux定时唤醒你的远程计算机的计划任务使用crontab即可。教程…自己百度去

8.测试你的服务器

如果你看懂了这篇文章,那基本上就大功造成了,体验不一样的自动化酸爽吧!

你可以手动发送用来唤醒的魔法数据包,观察服务器无人值守时的自动任务。

9.结尾

如果你有疑问,可以在这里留言提问


附1:调优Tips

WSL不仅可以tmux套娃,其实tomcat8+guacamole也跑得妥妥的,GoAccess也是,此外,netdata也可以在wsl上运行(除了无法检测电源状态什么的小bug)【都是本人亲测】

评论

  1. 乐色桶
    Android Chrome
    4年前
    2020-8-09 19:14:23

    牛批

  2. Windows Edge
    4年前
    2020-8-11 23:33:11

    厉害!

  3. 你家van桑
    Android Chrome
    4年前
    2020-8-16 0:01:50

    谢谢shanwer,孩子睡得很香🙏🏻🌹🌹🌹

  4. Gaodgiaogiao
    Windows Edge
    3年前
    2021-2-16 22:13:36

    Shanwer666!

  5. Dishwer
    iPhone AppleWebKit
    3年前
    2021-2-17 21:42:17

    谢谢shanwer已经用上了,麻麻再也不担心我开腐了。

  6. YiFeng
    Windows Chrome
    3年前
    2021-3-04 11:24:01

    移动宽带是二级运营商,弄不到公网ip……

    • 博主
      YiFeng
      Windows Chrome
      3年前
      2021-3-06 0:03:55

      那就用FRP吧,咱电信反正申请到公网动态IP了

  7. Gaodgiaogiao
    Windows Edge
    2年前
    2022-9-01 17:34:44

    新疆联通获取公网IP大失败,客服会直接给你装傻不知道公网IP 🙁

    • 博主
      Gaodgiaogiao
      Android Chrome
      2年前
      2022-9-01 17:35:59

      那就frp凑合吧()

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇