后浪云Minecraft Wiki教程:前言[ ]
该页面的内容不代表Mojang Studios或Minecraft Wiki的官方意见。
此特性为Java版独有。
此条目仍需完善。
你可以帮助我们扩充关于该主题的更多信息。
目录
- 1 前言
- 1.1 警告
- 2 开始之前
- 2.1 需求
- 2.2 DNS和DDNS的配置
- 2.3 软件配置
- 2.3.1 Java
- 2.3.2 操作系统
- 2.4 硬件配置
- 3 正式开始
- 3.1 Fabric
- 3.2 Forge
- 3.3 其他
- 4 拓展内容
- 4.1 配置服务器
- 4.2 管理服务器
- 4.3 Mcdreforge
- 5 更进一步
- 5.1 从其他服务端迁移至Mod服务端
- 5.2 Mod服务器的原理
- 5.3 服务器基础知识速查表
- 5.4 JVM启动参数
前言[ ]
Minecraft的Mod服务器是一个可供多个玩家联机游戏的虚拟空间,玩家可以通过使用各种Mod来扩展和改变游戏内容,以进行更多的活动、创造更多的物品和体验更多的游戏玩法,并与其他玩家互动。
Minecraft Java版的服务器可以根据其结构分为四种类型:
- 原版服务器,指使用官方Java版服务端开设的服务器。
- Mod服务器,指使用Mod服务端(例如Fabric、Forge、Quilt)开设的服务器。
- 插件服务器,指使用插件服务端(例如Paper、Pufferfish、Purpur)开设的服务器。
- 插件及Mod混合服务器,指使用混合服务端(例如Sponge)开设的服务器。
本教程将指导你如何开设自己的Mod服务器。
本教程目前适用于Windows。
警告[ ]
关于网络安全
开设服务器可能会导致你的电脑更容易受到网络攻击(常见如分布式拒绝服务攻击:DDoS),因此,开设服务器时请将网络安全放在第一位;最好使用防火墙等设施来预防网络攻击。
鉴于你正在一步步地开启你自己的服务器,你应该要注意所有可能出现的危险性。运行下面的所有教程正常情况下应不会导致你的系统出错,但是由于Minecraft Wiki的开放性,且编者对于你的系统配置与软件运行情况并不了解,因此并不能保证稳定性。
为了确保你根据下面的教程架设服务器并将出现问题的概率降至最低,我们强烈推荐你至少要知道以下的内容:
- 基本的网络搭建术语(IP、端口等);
- 关于电脑硬件的基础知识;
- 命令行的使用;
- 你的网络环境;
- 你的系统配置。
如果对上述内容不明白,可以查看服务器基础知识速查表。
开始之前[ ]
注意文章所用游戏版本
为了避免版本更新而带来的变化导致本教程失去意义,截止至本教程内容最后一次更新,Java正式版最新版本为1.20.1。
架设服务器之前,最好先阅读完本段的所有内容并确保你的电脑完成了下面的“网络”和“Java”栏。
另外,我们建议你准备一个有语法高亮功能的文本编辑器,如VSCode,Windows自带的记事本和写字板查看配置文件(如.json和.config文件)的效果可能不尽人意。
需求[ ]
在架设服务器前,你需要先明确你的需求,这里有一个较为笼统的分类:
- 如果你想游玩无任何插件、Mod的原版服务器,请参阅教程/架设服务器。这种服务器一般不可添加拓展。
- 如果你想开设纯净服务器,请选择Mod服务器并阅读本篇文章。这种服务器的拓展性比插件服低,但保留所有原版特性。
- 如果你想开设小游戏服务器或对游戏特性做出改变,亦或启用某些资源包,请选择插件服务器,参阅教程/架设Spigot服务器。这种服务器一般拓展性最强、优化最好,但可能会使一些原版特性失效(如刷沙)。
- 网络配置
运行Minecraft服务器所需的最低网络带宽为每秒1Mbps的上下行速度,也就是大约 125KB/s。然而,这只是最低要求,如果你的服务器有多个同时在线的玩家或者使用了许多插件和Mod,你可能需要更高的带宽来保证良好的游戏体验。通常来说,为每位玩家提供至少1.5Mbps至2Mbps的带宽是比较稳妥的选择,并且保证服务器所在的机器拥有足够的CPU处理能力来处理游戏数据流量。此外,如果你想提供玩家更加流畅的网络体验,你可以考虑选择能够提供更高速度的网络带宽,如10Mbps或以上。
此外,你还需要IP或使用内网穿透。
- 公网
- 如果你使用的是局域网或者无线局域网(统称内网),和你不在同一局域网的玩家无法连接到你的服务器,因为局域网是封闭的。这时,就需要一个公网IP。公网IP分为动态和静态两种。动态公网IP会随时间不定期改变(重启光猫时一定改变),而静态公网IP的则是固定的。
-
无论你有没有公网IP或配置内网穿透,和你在同一局域网内的设备都可通过连接服务器的
内网IP地址进入服务器,而即使未连接互联网,本机也可以通过连接localhost(IPv4)、127.0.0.1(IPv4)、::1(IPv6)进入服务器。 -
你也可以通过内网穿透来达到相似效果,参阅 下文。
- 检查
-
- 如果你需要确认是否已经获取了公网IP,可以使用搜索引擎查询IP地址(例如 这个),然后将查询结果与公网IP地址段进行对比。
- 静态和动态
-
- 如果你需要为自己的服务器申请公网IP,就需要知道静态公网IP和动态公网IP的区别。静态公网IP需要申请或者购买专线(详情请咨询你的运营商),这一般十分昂贵,所以建议你申请动态公网IP。
- 能否从运营商处申请到公网IP及其步骤由运营商的相关政策决定。你可以咨询你的运营商或在网络上搜索以获取相应内容,通常来说IPv4较IPv6来说更难申请因为数量更少。如果你要使用动态公网IP,则一般需要配置动态域名服务(DDNS),方法可见下文,也可自行搜索。
- 内网穿透
-
- 原理是通过让你的电脑连接到另一台有公网IP的电脑,数据从玩家到这台电脑再到你的服务器,这种方式通常适用于实在没有办法申请公网IP的人。因为提供内网穿透的服务商通常会对流量收费且一般延迟较高,所以若非别无他法否则不推荐。
DNS和DDNS的配置[ ]
如果您希望他人可以使用域名来访问您的服务器,你需要配置DNS或DDNS。DNS主要用于域名到IP地址的静态映射,而DDNS主要用于动态IP地址的映射。
- DDNS(动态域名系统)配置
DDNS(Dynamic DNS / Dynamic Domain Name System)的功能是将用户的动态IP地址映射到一个固定的域名解析服务上。如果你使用动态公网IP,并且希望玩家能够通过域名加入服务器,你需要进行DDNS配置。以下是一些常用的DDNS配置教程供参考:
- 对于使用DnsPod的用户,可以参考这篇文章。
- 对于使用阿里云的用户,可以参考这篇文章。
对于其他提供商的域名服务,请自行搜索相应的配置方式。
- DNS(域名系统)配置
DNS(Domain Name System)的功能是将用户的IP地址映射到一个固定的域名解析服务上。如果您使用静态公网IP,并且希望玩家能够通过域名加入服务器,你需要进行DNS配置。通常你可在域名服务商的网站找到这项功能。
软件配置[ ]
Java[ ]
Java是一种面向对象的编程语言,用于编写在JVM(Java Virtual Machine,简称JVM,Java虚拟机)上运行的程序。Minecraft服务端和客户端都运行在JVM上,所以也需要Java。
- 选择
严肃的警告
Oracle JDK是Sun公司推出的商业版本JDK,需订阅才可在生产环境中(如开设盈利性服务器)使用,否则可能承担法律责任。
Sun公司在推出需订阅的Oracle JDK的同时也推出了基于协议GPL开源的JDK即OpenJDK,Oracle JDK和OpenJDK的区别是Oracle JDK有一些额外的功能。同时,也有一些其他公司基于OpenJDK源码进行修改后构建了自己的JDK,如Azul,微软等。简单来说,可以将OpenJDK比作100%基于AOSP的原始的安卓系统,Oracle JDK比作经谷歌修改的安卓系统,其他JDK比作如Colour OS,MIUI这类经第三方修改的安卓系统。不同的Java发行版性能特点不同,如Zulu较为全能而OpenJ9较省内存。
JDK和JRE的关系:JDK包含JRE;JDK(Java Development Kit,简称JDK,Java开发工具包)一般用于开发Java程序,JRE(Java Runtime Environment,简称JRE,Java运行环境)用于运行Java程序;一般你只需使用JRE即可,但由于某些插件或Mod可能需要用到JDK的一些功能,所以建议安装JDK。
无头Java实际上是普通Java的删减版,它去除了对图形界面或鼠标、键盘方面的支持,所以可以节省计算机资源,适合在服务器等不需要图形界面的场合使用。如果你使用Java的图形功能那可以选择安装无头Java。
各个正式版所需Java版本 | |
---|---|
游戏版本 | Java版本需求 |
1.0 - 1.5 | Java6 |
1.6 - 1.8 | Java7 |
1.9 - 1.12 | Java8 |
1.13 - 1.16 | Java8或更高版本 |
1.17 | Java16或更高版本 |
1.18-pre2以上 | Java17或更高版本 |
虽然一般版本越高Java会有越好的性能,但某些插件可能与之不兼容(如在版本为1.17的服务器上使用Java18,服务器能正常运行但插件报错)。
- 快速选择
如果你完全不知道应该选择哪个版本的Java,那么请下载OpenJDK 8的最新版本和OpenJDK 17(版本须大于等于17.0.3),这可以覆盖目前任何版本的需求。
- 查看安装
为了检查Java是否已被正确安装及其版本,你需要执行java -version
查看JRE版本,或执行javac -version
查看JDK版本。
- 为了减少出错的概率,Java的安装路径请不要包含中文。
- 常见发行版下载
- Oracle JDK下载
- Oracle JDK 8u202或更早版本
- 微软推出的OpenJDK
- Azul推出的OpenJDK
- 订阅Oracle JDK
甲骨文官方的Java在Java8u202以后如需商用要订阅后才可使用,因此为了避免纠纷建议使用甲骨文官方Java的服主在开服前查看自己使用的Java的版本;一般来说,甲骨文Java商用订阅是针对商业客户提供的,以公司或组织为单位进行购买。如果只是个人用户或者仅用于非商业用途,可以使用免费的开源Java发行版,例如OpenJDK。
你可以在以上Java发行版中根据你所要架设的Minecraft服务器版本自行选择,也可自行搜索其他版本。
操作系统[ ]
本教程讨论范围仅限于Windows,MacOS及Linux。
- 选择
注意更新
无论你使用何种操作系统,我们都建议你时刻更新至最新版本。
- Windows:最常见的操作系统,简单直观易上手,推荐Windows Server而不是普通Windows(包括专业版、家庭版、教育版、长期支持版等)。
- Linux:最小众的操作系统,入门门槛高,系统较稳定,某些纯命令行版耗费系统资源较少。
- MacOS:硬件门槛高,软件资源较少。
- 快速选择
如果你使用的是Windows主机且没有任何Linux系列系统操作基础,我们推荐使用Windows Server。
硬件配置[ ]
对于想自己架设的服务器的你,这里有一些关于服务器配置的建议。
如果你了解电脑的配置,并确信它已经达到了能够运行服务器的需求,可以选择跳过这一节。
- 服务器的配置不需要很高,例如1核心的处理器加上2GB的内存就足够支持一个的小型服务器。
- 处理器:推荐选择主频较高且架构较新的处理器。由于Minecraft是单线程运行的,所以主频更重要。选择架构更新主频更高的处理器,可以更好地支持多个玩家同时在线游戏。
- 由于Minecraft单线程的特性,在不使用其他优化手段的情况下,CPU性能再强也终将有瓶颈,若想进一步了解Minecraft单线程运行的原因,可以参考这篇文章。
- 硬盘:推荐选择企业级硬盘,特别是固态硬盘(SSD)。企业级硬盘的故障率较低,可以提供更好的可靠性和数据保护。无论使用何种硬盘,都要记得经常备份存档,以免数据丢失。
- 内存:内存建议使用具有ECC纠错功能的内存(DDR5自带ECC纠错),这可以减少宕机的几率。
- 显卡:对于Minecraft服务器来说,显卡的需求相对较低,只要能进入系统即可,不需要购买高端显卡。
- 网络:至少需要1Mbps的上下行速度,以确保玩家可以流畅地连接和游玩。如果预计有更多的玩家或使用大量插件和Mod,可能需要更高的带宽。
- 云服务器:如果不想在家中架设服务器,可以考虑使用云服务器。这样可以免去维护硬件的烦恼,但需要支付一定的费用。
正式开始[ ]
注意:本教程对Mod服务器的讨论范围仅限于编写此文章时仍然存在的Forge和Fabric,停止更新的或其他小众的Mod加载器等均不在讨论范围之内。此处以推出Fabric为界(1.14),之前的版本称为老版本,1.14及其后的版本称为新版本。
- 选择Mod加载器
Fabric
Forge
首先确认你要假设的服务器版本,1.14版本之前由于Fabric兼容性差,推荐使用Forge,1.14及以后版本由于Forge优化较差(主要体现在加载速度慢)及主流Mod开发者逐渐转移至Fabric,建议使用Fabric。
Fabric[ ]
- 兼容
Fabric服务器常见于1.14及以后的版本,但这并不意味着1.14前的版本无法使用Fabric,你依然通过某些兼容手段使用Fabric,貌似需要添加特定的JVM参数。
“
理论上,没有什么能阻止你在任何版本的 Minecraft 上,在任何混淆层下,运行 Fabric 的模组加载器,一直到 c0.0.11a 。然而,这些版本大多没有 Yarn 映射──因此,制作模组的过程变得……有点儿复杂。
” ——
Fabric中文百科
- 一般安装
此方法较纯命令行安装为容易,但步骤较多。
- 本方法不适用于纯命令行的操作系统,如果你使用的是这种系统,请参考无GUI安装。
- 你也可以参考Fabric官方服务器安装教程。
Fabric下载页面
1. 你需要前往Fabric下载页面以下载安装器(Fabric-installer,以下简称安装器)或JAR安装器(Universal JAR installer,简称JAR安装器)。
- 如果你使用的是Windows系统,那么建议下载安装器,点击“Download for Windows”即可;如果是其他系统,请下载JAR安装器(这是一个JAR文件,需要Java8运行),点击下方的“Download universal jar”即可;这两个文件图形界面的外观和功能是完全一致的。
Fabric安装器界面,版本0.11.2
2. 打开你下载的名为exe/jar文件,选择服务器选项卡,然后选择游戏版本和加载器版本,一般来说,我们建议你选择最新的加载器。
- 如果想安装快照版本,选中旁边有“显示快照版本”字样的复选框即可。
3. 选择安装位置后点击安装,不存在的文件夹会被安装器创建,为避免出错,服务端的安装路径不要包含中文,安装完成后该路径内文件应如下所示:
- 文件夹
- libraries
- net
- 略
- org
- 略
- net
- fabric-server-launch.jar
- libraries
- 如果该文件夹已经有和你下载版本一样的fabric-server-launch.jar文件,那安装器将不会重复下载(安装器会自动补全缺失的文件),而是会直接在检查后弹出服务端安装成功,即跳到下一步。
Fabric安装器弹出的窗口
4. 如果你没有提前在该文件夹放入对应版本的Minecraft官方服务端的jar文件,Fabric安装器会弹出一个窗口提示“找不到有效的 版本 服务端”,点击下载服务端即可快捷的下载,你也可以选择去官方网站下载,下载完成后应该会多出一个名为server.jar的文件,此时该路径内文件应如下所示:
- 文件夹
- libraries
- net
- 略
- org
- 略
- net
- fabric-server-launch.jar
- server.jar
- libraries
5. 启动服务器需要命令,你可以选择每次启动服务器都重复输入命令,或是使用启动脚本。
- 快捷方法:在安装器弹出的窗口中点击生成启动脚本,该文件夹内应多出两个文件,一个名为start.sh,另一个是satrt.bat,Windows点击.bat文件,Linux和MacOS点击.sh文件即可开服。
- 方法二:自行编写启动脚本。
* Windows系统官方示例代码如下java -Xmx2G -jar fabric-server-launch.jar nogui
编写后保存为.bat文件即可。
* Linux和MacOS官方示例代码如下#!/usr/bin/env bash
编写后保存为.sh文件即可。
java -Xmx2G -jar fabric-server-launch.jar nogui - 你也可以尝试最为热门的第三方启动脚本Aiker's Flag,如下:
java -Xms10G -Xmx10G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar fabric-server-launch.jar nogui
根据你的系统选择保存的文件格式。如果你在启动脚本中使用的内存超过12GB,请调整以下内容:
-XX:G1NewSizePercent=40
-XX:G1MaxNewSizePercent=50
-XX:G1HeapRegionSize=16M
-XX:G1ReservePercent=15
-XX:InitiatingHeapOccupancyPercent=20 - 使用图形操作系统的服务器在服务器崩溃后命令行窗口会即刻关闭,不方便查看日志,可在代码后加上
pause
。示例:java -Xmx2G -jar fabric-server-launch.jar nogui
。这可以使服务器崩溃后命令行窗口仍留存。
pause
启动脚本中-Xmx
后跟的数字为服务器最大使用内存大小,单位为M或G,保存后点击即可开服。更详细的JVM启动参数解释,可参考JVM启动参数。
关于服务端JAR文件的选项要写在命令中的-jar fabric-server-launch.jar
后面。你可以在后面加上--help
查看所有可以被传递给服务端的参数。下方列出了一些可用的命令行选项。
--bonusChest
- 在初次生成世界时,是否生成奖励箱。
--demo
- 指定服务器是否在演示模式下运行(给玩家显示一个“演示版”弹出信息。且演示结束后,玩家不能破坏、放置方块或者吃东西)。
--eraseCache
- 清除光照缓存等。与优化单人游戏世界时的选项相同。
--forceUpgrade
- 强制升级所有区块到服务器目前的版本(单人游戏世界也可用)。
--help
- 显示此帮助。
--initSettings
- 只初始化
server.properties
和eula.txt
,然后退出。
- 只初始化
--nogui
- 启动服务器时不显示图形界面。
- 你仍然可以与你的服务器交互,但如果启用,必须使用cmd或终端。
nogui
与此选项作用相同,主要用于向后兼容非常旧的服务器版本,但更加推荐使用--nogui
更可取,因为这与其他选项的格式匹配
--port <整数>
- 指定服务器监听的端口,而无论在
server.properties
中设置的是什么(默认值为-1)。
- 指定服务器监听的端口,而无论在
--safeMode
- 加载存档时只使用原版数据包。
--serverId <字符串>
- 为服务器指定一个服务器ID。
--singleplayer <字符串>
- 指定服务器以离线模式运行(<字符串>需要指定一个值,但此值的具体用途未知,可能是由Mojang内部所使用的)。
--universe <字符串>
- 指定查找world文件夹的位置(默认为
.
,即当前目录)。
- 指定查找world文件夹的位置(默认为
--world <字符串>
- 指定一个
level.dat
所在文件夹的名称。
- 指定一个
- 旧命令行选项
一些选项能在旧版中使用,但是已在新版本中被移除或被替换了。
-o true
- 使服务器以在线模式运行,只有经过认证的用户才能进入(新版本中,将
server.properties
中的online-mode
改为true等同于此选项)。
- 使服务器以在线模式运行,只有经过认证的用户才能进入(新版本中,将
- 方法三:使用命令行,在命令行界面输入
java -Xmx2G -jar fabric-server-launch.jar nogui
,Xmx后跟的数字为服务器最大使用内存大小,即可开服。- 如果你直接打开了server.jar文件,它会生成一些文件和文件夹,会多出的文件如下:
- 多出的文件
- libraries(已有文件夹)
- com(已有文件夹内新增)
- 略
- commons-io(已有文件夹内新增)
- 略
- io(已有文件夹内新增)
- 略
- it(已有文件夹内新增)
- com(已有文件夹内新增)
- logs
- latest.log
- version
- 你的服务端版本
- server-你的服务端版本.jar
- 你的服务端版本
- eula.txt
- server.properties
- libraries(已有文件夹)
- 当出现“Done!”字样,代表服务器已经成功初始化。
需同意EULA
- 第一次启动时报错“You need to agree to the EULA in order to run the server. Go to eula.txt for more info.”是正常的,这意味着你需要同意Minecraft最终用户许可协议,请打开服务器文件夹内新生成的名为eula.txt的文件,将false改为true并保存即可。
6. 在第一次启动服务器时服务端会在文件夹内创建一些文件,在服务器控制台输入stop或restart即可关闭服务器。
7. 现他人应该可以通过连接你的IP或所映射的域名加入服务器。
- 即使你没有公网IP也未配置内网穿透,和你处在同一局域网的设备也可以通过连接服务器的IP来加入服务器,而即使未联网,本机也可以通过连接localhost、127.0.0.1(IPv4)、::1(IPv6)进入服务器。
- 使用命令行安装
- 你也可以参考Fabric官方服务器命令行安装教程。
- 需求
这种安装方法用于在不支持GUI的机器上架设Fabric服务器。
- 依赖
Minecraft 1.16.X或更早版本,所需的Java版本是8+对于Minecraft 1.17.X,所需的Java版本是16+,对于Minecraft 1.18.X或更高版本,所需的Java版本是17+你也需要一个能把文件下载到你自己的机器上的方法。你可以使用某些文件传输工具如curl或wget。
- 安装依赖
名称 | 注 | Debian (Ubuntu, Mint, …) | Fedora |
---|---|---|---|
Java | 必需 | apt install openjdk-8-jre-headless | dnf install java-1.8.0-openjdk-headless |
Curl | 可选 | apt install curl | dnf install curl |
Wget | 可选 | apt install wget | dnf install wget |
- 步骤
- 创建并进入一个目录以放置你的Minecraft服务器。
- 将最新版本的Fabric Installer放在同一目录下。
- 使用Curl:在你的Minecraft服务器目录下运行安装器。curl -o installer.jar <把链接复制于此,不含尖括号>。
- 使用Wget:在你的Minecraft服务器目录下运行安装器。wget -o installer.jar <把链接复制于此,不含尖括号>。
- 文件传输软件:将JAR安装器传输到你的Minecraft服务器所在的目录下。
- 运行Fabric Installer。java -jar installer.jar server -mcversion <Minecraft版本,不含尖括号>。
- 现在在Minecraft服务器的目录下应该出现一个名为fabric-server-launch.jar的文件。现在你可以把Fabric Installer删除了。
- 运行命令文件来启动你的Minecraft服务器。
注意
如果你不能在你的机器上运行任何命令,你可以在本地电脑上执行这些操作,最后将所有文件一并上传到你的服务器上。
- 示例(使用Debian)
# 下载依赖 sudo apt install openjdk-8-jre-headless curl # 创建用于放置Minecraft服务器的目录并进入这个目录 mkdir fabric cd fabric # 下载Facric Installer curl -o installer.jar <installer jar url> # 运行Fabric Installer java -jar installer.jar server -mcversion 1.16.5 -downloadMinecraft # 删除Fabric Installer rm installer.jar # 重命名Jar文件 mv server.jar vanilla.jar mv fabric-server-launch.jar server.jar echo "serverJar=vanilla.jar" > fabric-server-launcher.properties # 启动Minecarft服务器 java -jar server.jar
Forge[ ]
其他[ ]
拓展内容[ ]
配置服务器[ ]
- server.properties
主条目: server.properties
server.properties是储存原版多人游戏(Minecraft或Minecraft Classic)服务器所有设置的文件。
管理服务器[ ]
Mcdreforge[ ]
MCDR(Mcdreforge,简称MCDR)是一种挂载在服务端以外的一种服务端管理插件,基于Python,可以在不对Minecraft服务端进行修改的情况下,通过可自定义的插件系统,提供对服务端的管理能力,由于它的插件是由Python语言所编写而成,所以相较于Mod开发和插件开发,开发MCDR插件会方便许多。若你想安装MCDR或开发插件,请参阅官方的帮助文档。
- 安装Python
MCDR需要Python 3.6或以上版本。Linux发行版和MacOS通常情况下自带Python,除非你使用的系统较旧(例如CentOS 7),一般的发行版的Python版本已足以运行MCDR。
如果需要更新,建议使用系统对应的软件包管理命令(例如apt和yum等)。你也可以通过下载源代码进行编译安装,请前往Python官网,此处亦可以下载Windows平台下可直接安装的.exe格式文件。
若在你的电脑中Python 2与Python 3并存,那么下文的pip
请改为pip3
。
- 下载安装MCDR
在命令行中执行pip install mcdreforged
以下载并安装MCDR,中国大陆用户可使用国内的PyPI镜像(例如清华开源软件镜像站所提供的镜像源)来加速MCDR的下载。
- 初始化MCDR
若你想在某个文件夹中启动MCDR,通过cd xxx
可进入名为xxx
的文件夹,执行cd ..
可返回上一级文件夹,最后在所在文件夹内执行python -m mcdreforged init
在此初始化MCDR。
命令执行完毕以后文件结构如下所示:
- 文件夹
- config/
- logs/
- MCDR.log
- plugins/
- server/
- config.yml
- permission.yml
- 启动
首先将你服务端的全部文件移动至MCDR的server
文件夹中。如果你在服务端文件夹中直接初始化MCDR,那么某些文件或目录可能会被覆盖,此时你需要在server
文件夹中新建一个文件夹,并将正确的服务端文件复制至此,然后在MCDR初始化的目录中执行python -m mcdreforged
启动服务器。
此时你服务端的某些设置需要在MCDR的permission.yml
中进行更改。你可以执行pip install --upgrade mcdreforged
来更新MCDR。
- 安装插件
你可以前往MCDR插件仓库进行下载,或是查阅MCDR官方文档并尝试自行编写。
插件请放置至plugins
文件夹。
更进一步[ ]
从其他服务端迁移至Mod服务端[ ]
- 插件服务器
- 原版服务器
Mod服务器的原理[ ]
服务器基础知识速查表[ ]
名称 | 标准解释 | 通俗解释 |
---|---|---|
IP | 全称为Internet Protocol(网络协议),计算机在互联网中的唯一地址,用于标识互联网或本地网络上的设备。 | 别人要找到你家需要你家的地址,IP相当于电脑在互联网上的地址,他人的电脑访问你的电脑需要知道你电脑的IP。 |
广域网IP(公网IP) | 广域网IP是指以公网连接Internet上的非保留地址。广域网的计算机和Internet上的其他计算机可随意互相访问。 | 有了公网IP他人的电脑才能准确找到你的电脑。 |
端口 | 端口是英文port的意译,可以认为是设备与外界通讯交流的出口。分为虚拟端口和物理端口,虚拟端口指计算机或交换机路由器内的端口,不可见。例如计算机中的80端口、25565端口等。物理端口又称为接口,是可见端口,如计算机背板的RJ45网口。虚拟端口是一个16位的二进制数字,范围从0到65535。 | 端口相当于一扇门,电脑上不同的应用程序就像房子,每个房子有自己的门,端口号就是门的编号。当一个应用程序需要与其他设备或者网络交流时,就通过它自己的“门”(端口号)来传递数据。 |
电脑硬件基础知识 | 包括电脑的构成和主要硬件部件的作用,例如中央处理器(CPU)、内存、硬盘、显卡、声卡等。 | 初步入门可参考这篇文章 |
命令行 | command-line interface,缩写:CLI。命令行是一种通过命令执行操作的用户界面,它可以让用户通过输入指定的指令来操作计算机。 | 如Windows的Cmd.exe入门,MacOS默认的zsh shell入门或Bash,Linux常见如Bash、Zsh、Fish入门等。也有许多新兴命令行软件,如PowerShell,但功能对于本教程多余故不列举。 |
JVM启动参数[ ]
了解JVM启动参数有助于编写适合自己的服务器启动脚本。
参数 | 作用 | 解释 |
---|---|---|
-Xmx | 设置JVM堆内存的最大值 | 指定Java应用程序可用的最大堆空间大小。 |
-Xms | 设置JVM堆内存的初始值 | 指定Java应用程序最初分配的堆空间大小。 |
-Xmn | 设置新生代堆内存的大小 | 指定年轻代(Eden区、Survivor区)的空间大小。 |
-Xss | 设置线程栈的大小 | 指定每个线程的栈空间大小。 |
-cp 或 -classpath | 指定类路径 | 设置要使用的Java文件的地址或目录,并将其包含在类路径中。 |
-XX:PermSize (仅限Java 8及更早版本) | 设置永久代的初始大小 | 指定Java永久代空间的初始大小。 |
-XX:MaxPermSize (仅限Java 8及更早版本) | 设置永久代的最大大小 | 指定Java永久代空间的最大大小。 |
-XX:MetaspaceSize (仅限Java 8及更高版本) | 设置元空间的初始大小 | 指定Java元空间的初始大小。 |
-XX:MaxMetaspaceSize (仅限Java 8及更高版本) | 设置元空间的最大大小 | 指定Java元空间的最大大小。 |
-XX:+UseParallelGC | 设置垃圾收集器为并行收集器 | 使用多个线程同时进行垃圾收集,提高垃圾收集的效率。 |
-XX:+UseConcMarkSweepGC | 设置垃圾收集器为并发标记清除收集器 | 允许应用程序线程与垃圾收集器线程同时执行,减少垃圾收集的停顿时间。 |
-XX:+UseG1GC | 设置垃圾收集器为G1收集器 | 使用G1(Garbage First)垃圾收集器,优化内存分配和垃圾回收。 |
-XX:+DisableExplicitGC | 禁用System.gc()方法的显式垃圾回收调用 | 防止通过代码中的System.gc()方法触发显式的垃圾回收。 |
-XX:+PrintGCDetails | 在控制台上打印详细的垃圾收集器信息 | 输出更详细的垃圾收集器日志信息,方便分析和调试。 |
-XX:ParallelGCThreads | 设置并行收集器的线程数 | 指定用于并行垃圾回收的线程数。 |
-XX:ConcGCThreads | 设置并发收集器的线程数 | 指定用于并发垃圾回收的线程数。 |
-XX:MaxGCPauseMillis | 设置垃圾收集器的最大停顿时间 | 控制垃圾收集器在一次垃圾回收操作中的最大停顿时间,以减少应用程序的停顿时间。 |
-XX:OnOutOfMemoryError="cmd" | 在内存溢出错误发生时执行外部命令 | 当发生内存溢出错误时,执行指定的外部命令。 |
-XX:HeapDumpPath=path | 设置堆转储文件的保存路径 | 指定堆转储文件的保存路径,用于分析内存问题。 |
-XX:PrintCommandLineFlags | 打印出所有的命令行标志 | 在启动时打印出所有的命令行标志及其值。 |
-XX:+ExitOnOutOfMemoryError | 在内存溢出错误发生时退出JVM | 当发生内存溢出错误时,立即退出JVM。 |
-XX:+UseNUMA | 启用NUMA(非统一内存访问)支持 | 在NUMA架构下,将内存绑定到特定的CPU节点,提高内存访问性能。 |
-XX:MaxDirectMemorySize=size | 设置Direct Memory的最大大小 | 指定Direct Memory的最大大小,Direct Memory是堆外内存,使用ByteBuffer进行操作。 |
-XX:ThreadStackSize=size | 设置线程栈的初始大小 | 指定每个线程的栈空间的初始大小。 |
-XX:SurvivorRatio=n | 设置新生代中Eden区和Survivor区的比例 | 设置新生代中Eden区和Survivor区的大小比例。 |
-XX:MaxTenuringThreshold=n | 设置对象进入老年代的年龄阈值 | 当对象存活次数达到n次时,会被晋升到老年代。 |
-XX:InitialCodeCacheSize=size | 设置初始代码缓存大小 | 指定JIT编译器为Java代码保留的初始堆内存大小。 |
-XX:CompileCommand="compilecommand" | 使用特定的编译指令 | 用于向JIT编译器传递特定的编译指令。 |
-Xnoclassgc | 禁止对已加载类进行垃圾回收 | 阻止JVM对已加载的类进行垃圾回收。 |
-Dproperty=value | 设置系统属性 | 在JVM启动时设置指定的系统属性,可以在应用程序中通过System.getProperty()方法获取。 |
-XX:+UseCompressedOops | 启用压缩指针 | 使用32位指针来表示堆中的对象引用,减少内存占用。 |
-XX:+UseCompressedOops | 启用压缩指针 | 使用32位指针来表示堆中的对象引用,减少内存占用。 |
-XX:CompileThreshold=n | 设置方法编译阈值 | 当方法被调用超过n次时,JVM将该方法编译为本地代码。 |
-XX:+AggressiveOpts | 启用侵略优化 | 启用一组性能优化选项,有助于提高应用程序的执行速度。 |
-XX:UseLargePages | 使用大页内存 | 将JVM使用的内存分配为大页,以提高内存访问性能。 |
-XX:CMSInitiatingOccupancyFraction=n | 设置CMS初始化占用阈值 | 当老年代占用达到n%时,CMS收集器将进行一次垃圾收集。 |
-XX:ReservedCodeCacheSize=n | 设置代码缓存大小 | 指定JIT编译器为Java代码保留的堆内存大小。 |
-XX:+UseStringDeduplication | 启用字符串去重功能 | 重复的字符串只保留一份,减少内存占用。 |
-XX:MaxTenuringThreshold=n | 设置对象进入老年代的年龄阈值 | 当对象存活次数达到n次时,会被晋升到老年代。 |
术语 | 解释 |
---|---|
G1 (Garbage First) | G1是一种垃圾收集器,属于现代化的垃圾收集器之一。与传统的并行或并发收集器不同,G1采用了分区的内存布局,将整个堆内存分成多个大小相等的区域。它主要针对大内存应用和低延迟进行优化,能够更好地处理大堆和长时间运行的应用程序。 |
永久代 | 永久代是Java 8及更早版本中的一部分堆内存空间,用于存储类的相关信息、常量池等。它的大小是固定的,并由-XX:PermSize和-XX:MaxPermSize参数控制。然而,在Java 8后,永久代被元空间所取代。 |
元空间 | 元空间是Java 8及更高版本中取代永久代的一部分堆内存空间。它的大小是动态的,并由-XX:MetaspaceSize和-XX:MaxMetaspaceSize参数控制。元空间用于存储类的相关信息、方法、字段以及运行时常量池等。相比永久代,元空间具有更好的性能和灵活性。 |
年轻代 | 年轻代是Java堆内存的一部分,主要用于存放新创建的对象。它又分为Eden区和Survivor区。当新对象被创建时,它们首先会被分配到Eden区。当Eden区满时,未被回收的对象将会被移动到Survivor区。年轻代使用的垃圾收集器通常是并行或并发收集器。 |
老年代 | 老年代是Java虚拟机堆空间中的一部分,用于存放较长时间存活的对象。与年轻代相比,老年代的对象有更高的生命周期和更低的垃圾回收频率。通常情况下,老年代主要存储那些经过多次垃圾回收后仍然存活的对象。 |
垃圾收集器 | 垃圾收集器是负责回收Java应用程序中不再使用的内存空间的组件。它会自动检测并回收无效的对象,以便释放内存并提高应用程序的性能。Java虚拟机(JVM)提供了多种垃圾收集器,如并行收集器、并发收集器、G1收集器等,可以根据应用程序的需求进行选择和配置。 |
JVM堆 | JVM堆是Java应用程序运行时的主要内存区域,用于存储对象实例以及其他动态分配的数据。堆内存被划分为年轻代、老年代和元空间等部分。大部分Java对象都会被分配在堆上,并且由垃圾收集器负责在对象不再被引用时回收堆内存空间。 |
线程栈 | 线程栈是每个线程专用的内存区域,用于存储线程中的方法调用和局部变量等信息。每个线程在创建时都会有一个对应的线程栈,用于支持方法的执行和线程的上下文切换。线程栈的大小可以通过JVM启动参数进行配置(如-Xss)。 |
线程 | 线程是程序执行的最小单元,也是操作系统调度的基本单位。Java应用程序通常以多线程的方式运行,每个线程都有自己的执行路径和资源。线程可以并发地执行不同的任务,使得应用程序能够更好地利用多核处理器和并行计算。 |
垃圾回收 | 垃圾回收是指垃圾收集器自动检测和释放不再使用的内存空间的过程。当对象不再被引用或无法访问时,垃圾收集器将标记这些对象为垃圾,并将它们的内存空间回收以便被重新利用。垃圾回收是Java语言的一个重要特性,它减轻了开发人员手动管理内存的负担,并提供了更高的应用程序可靠性和性能。 |
最大停顿时间 | 最大停顿时间是指垃圾收集器在执行垃圾回收操作时允许应用程序停顿的最长时间。通过设置最大停顿时间,可以平衡垃圾回收的效率和应用程序的响应性能。较长的最大停顿时间可能会导致应用程序的停顿时间增加,而较短的最大停顿时间可能会降低垃圾回收的效率。 |
显式垃圾回收 | 显式垃圾回收是通过调用System.gc()或Runtime.gc()方法来显式地触发垃圾回收操作。这种方式往往被认为是不推荐的,因为它无法保证立即执行垃圾回收,并且会导致不可预测的应用程序停顿。建议让垃圾收集器自动管理内存,而不依赖显式垃圾回收。 |
隐式垃圾回收 | 隐式垃圾回收是指由垃圾收集器在后台自动执行的垃圾回收操作。垃圾收集器会根据内存的使用情况和设置的垃圾收集策略来自动触发垃圾回收,以确保内存空间的合理利用和应用程序的正常运行。隐式垃圾回收使得开发人员不需要手动管理内存,简化了应用程序的开发和维护。 |
元空间 | 元空间是Java虚拟机中用于存储类元数据的区域。在传统的JVM中,类元数据通常存储在永久代中,而在JDK 8及以后的版本中,类元数据被移到了元空间,使得类的加载和卸载更加灵活和高效。与永久代不同,元空间的大小是由操作系统自动管理的,可以根据实际需要进行调整。 |
System.gc()方法 | System.gc()方法是java.lang.System类中定义的一个静态方法,用于建议JVM执行垃圾回收操作。调用System.gc()方法并不保证会立即执行垃圾回收,它只是给JVM一个提示,告诉它现在是执行垃圾回收的一个好时机。建议尽量避免频繁调用System.gc()方法,因为它可能会导致不必要的性能损失。 |
Runtime.gc()方法 | Runtime.gc()方法是java.lang.Runtime类中定义的一个实例方法,与System.gc()方法类似,也用于建议JVM执行垃圾回收操作。调用Runtime.gc()方法同样不能保证会立即执行垃圾回收,而且它更建议使用自动垃圾回收机制来管理内存,而不是依赖显式的垃圾回收调用。 |
Eden区 | Eden区是JVM堆中年轻代的一部分,用于存放刚刚创建的对象。在对象分配时,它们首先被分配到Eden区。大部分的新对象在很短的时间内就会变得不可达,因此垃圾收集器会定期清理并回收Eden区的内存空间,将仍然存活的对象移动到Survivor区。 |
Survivor区 | Survivor区是JVM堆中年轻代的一部分,用于存放从Eden区经过一次或多次垃圾回收后仍然存活的对象。Survivor区通常由两个相同大小的区域组成,称为from区和to区。在每次垃圾回收后,存活的对象会被移动到to区,而from区则会被清空。通过在from区和to区之间交替使用,可以实现高效的垃圾回收。 |
堆空间 | 堆空间是JVM中最大的内存区域,用于存放对象实例和数组。堆空间被划分为年轻代和老年代两个部分,并且还包括元空间和其他辅助数据结构。大多数的Java对象都会被分配在堆上,并由垃圾收集器负责在对象不再被引用时回收堆内存。堆空间的大小可以通过JVM启动参数进行配置,如-Xmx和-Xms。 |
教程(作下划线标记的教程为中文独有教程) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|