1.前言
我见过许多人租不起昂贵的云服务器因而放弃开服,还有人说,穷鬼不配开服。额,我的观点是,如果你开服是为了赚钱的话,我会对你表现出深深的鄙视与厌恶。如果你是为了维护Minecraft社区生态而贡献自己的一份力量,很好,给你点赞,有问题可以直接找我问。(前提你得自己用搜索引擎来试图解决问题)反正,商业服给爷爬,请直接按右上角红叉。然后,至于那些说“穷鬼不配开服”诸如此类言论的,一般拉黑,常规操作。不要因为几个lowbee而放弃。
这篇文章在你拥有理性对待问题与独立解决问题的能力的前提下,能够教你开出像Shanwer一样的服务器。
教程并不详细,主要是指路,你搜索引擎都解决不了再找我。
我为什么一直强调用搜索引擎独立自主解决问题,你要知道,如果你想担当起腐竹这个称号的话,不是网上下点什么开服包拿过来跑个批处理就完事的。如果是这样,相信你在服务器遇到崩溃与性能问题时必将,手足无措,删库跑路。
为什么本文使用WSL?
Windows的任务计划程序想要开机自启,如果选择“不管用户是否登录都要运行”时,你的控制台任务会以System用户身份执行,因而,这是一个系统进程,会在后台执行,无法控制控制台。如果“只在用户登录时执行”时,顾名思义,你得登录你的账户,很麻烦,个人认为还不如Win+R+shell:startup来的方便(虽然可以开机自动登录你的账户,但是,不安全,控制台也运行在桌面,不能用ssh,远程桌面控制占用带宽)。我这里提供了两种优雅的方法。
- WSL+Tmux配合任务计划程序(本文指导这个方法)
- 服务器在Windows上运行,无须担心wsl带来的性能损耗,而可以使用ssh来控制服务器(别急,方法就在下面教你)
- 这个方法来自Agenda的kiwi指导,对他表示由衷的感谢
- 服务器在Windows上运行,无须担心wsl带来的性能损耗,而可以使用ssh来控制服务器(别急,方法就在下面教你)
- 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文档)
- 别担心,你不会写代码?我帮你写了一个!API实现请转到本文章最下方或者在博客中搜索:Java实现MCSManger HTTP GET API,直接把程序喂给你,java -jar xxx.jar就能跑喽(记得改jar里的config!)源代码我不好意思放出来,
好处
- 一般的,你的服务器性能会比绝大多数几十甚至几百/月的云服务器性能都高,然后,还很省钱
- 不同于一般的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仓库与切换中文就不教了,必备的是软件包是tmux与openssh-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来提升权限,否则你的修改将没有权限保存。
wsl -d Ubuntu-20.04 -u shanwer /etc/init.wsl start
上面是你Windows系统上执行init.wsl的bat的配置,就这么简单
之后笔者就如法炮制,把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上安装多个子系统,例如Debian,CentOS,Arch等
- -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
- 实例:minecraft
- 一个实例可拥有多个窗口,并可在窗口间任意切换
- javaagent:authlib.jar为我服务器的外置登录需要用到的程序,你也可以自己整一个!(不做详解,给你指路Blessing-skin,就在GitHub上,开源、免费)
5.Windows配置任务计划程序
这部分很简单,你只需要任务计划程序中开机启动你刚刚编写完的bat程序即可。记得安全选项和触发器要像我这样配置。
6.配置DDNS
普通的家庭用户现在能有公网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
7.1被唤醒端配置
你需要确认以下几个设置已被配置为图中选项
此外,你还要关闭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,使用方法也在那上面
Linux定时唤醒你的远程计算机的计划任务使用crontab即可。教程…自己百度去
8.测试你的服务器
如果你看懂了这篇文章,那基本上就大功造成了,体验不一样的自动化酸爽吧!
你可以手动发送用来唤醒的魔法数据包,观察服务器无人值守时的自动任务。
9.结尾
如果你有疑问,可以在这里留言提问
附1:调优Tips
WSL不仅可以tmux套娃,其实tomcat8+guacamole也跑得妥妥的,GoAccess也是,此外,netdata也可以在wsl上运行(除了无法检测电源状态什么的小bug)【都是本人亲测】
牛批
厉害!
谢谢shanwer,孩子睡得很香🙏🏻🌹🌹🌹
Shanwer666!
谢谢shanwer已经用上了,麻麻再也不担心我开腐了。
移动宽带是二级运营商,弄不到公网ip……
那就用FRP吧,咱电信反正申请到公网动态IP了
新疆联通获取公网IP大失败,客服会直接给你装傻不知道公网IP 🙁
那就frp凑合吧()
也不是,网上话还是挺多的