MC 服务器我差不多研究了3天,一直在搞,昨天终于差不多将 MC 服务器搞透了,在这里感谢Joker的文章:记第一次搭建 Minecraft Java 服务器 :baobao:

本篇文章将从服务器的安装、服务端文件的选择、服务端版本的选择,安装 MOD 服务器、服务器的优化以及将域名绑定至服务器来讲解。

注:本教程所使用的服务器系统为 Centos7 ,一些系统命令会有所不同,请根据自身系统来变更一些命令!

Ⅰ.服务器的安装

系统选择

先来说下服务器的系统,除了 Linux 外也支持 Windows ,现在游戏服务器一般都是支持在2种系统上搭建的,但是因为 Linux 确实要稳定些,建议还是使用 Linux ,不熟悉的可以使用 Windows ,因为 Linux 的系统占用比 Windows 少很多(我自己因为是 Linux 用惯了,Windows 对于我而言并不好用)

服务器配置要求

服务器如果是在优化过的情况下,1核1G纯净生存可能能跑2,3个人,大概可以5个人,1核2G说不定能跑到10人甚至更多一点,后面的配置基本就无压力了,以上运行环境在1.12.2,带宽是5M,人多的话,就对带宽、内存、核心这种等等就要求更高

Java版本的选择

然后先安装必备组件 Java ,Java 我建议选择 1.8 的,不要一味的选择最新的,当然如果你的 VPS 配置非常高可以无视我说的这句话,不选择最新版的原因是,虽然最新版的 SDK 支持很多功能,但是对于性能很高,配置不行运行的就很吃力,甚至可能无法运行,所以如果你的 VPS 配置不够高,建议安装 Java 1.8 ,下面是安装方法

1.首先,update一下,然后安装 1.8 的 Java

yum install -y java-1.8.0-openjdk.x86_64

2.安装完后,看看有没有配置好环境变量,如果输出有东西,便是安装好了,若是一行空白请继续往下做

echo $JAVA_HOME

3.查找安装好的 Java 位置

which java
ls -lrt /usr/bin/java
ls -lrt /etc/alternatives/java

4.编辑 /etc/profile,在里面最后加入这段话

//请根据上面显示出的自己的路径填入
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/
JRE_HOME=/usr/lib/jvm/jre/ 
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME JRE_HOME CLASSPATH PATH

5.执行命令

source /etc/profile

6.检查是否添加完毕,显示出路径便是添加成功了

echo $JAVA_HOME

Ⅱ.服务端文件的选择

官方服务端

先说下最纯粹干净的官方原版 MC 服务端,也就是无法使用任何优化的服务端,所以我并不建议你安装官方,官方提供的优化设置几乎没有,对于配置稍差的 VPS ,服务器就炸了,但是我还是介绍下如何安装,点我去官方服务端下载站

1.安装服务器之前,先建立一个资料夹来存放服务器文件,名字随意

cd /home
mkdir minecraft

2.进入你所创建的文件夹

cd minecraft

3-1.使用以下命令将 Minecraft 服务器文件下载至此文件夹内,这里是用 Minecraft 官方页面的 1.15 版本的下载链接,查看最新的下载链接,请点此访问

wget https://launcher.mojang.com/v1/objects/e9f105b3c5c7e85c7b445249a93362a22f62442d/server.jar

3-2.直接去官方服务端下载站下载下来文件,然后自行拷贝到文件夹里

4.启动服务端

java -Xms<最小内存> -Xmx<最大内存> -XX:+AggressiveOpts -XX:+UseCompressedOops -jar <服务端名称>.jar

5.启动失败,需要同意 eula.txt 文件,进去修改

vim eula.txt
将 eula=false 改为 eula=true

6.继续启动服务端

java -Xms<最小内存> -Xmx<最大内存> -XX:+AggressiveOpts -XX:+UseCompressedOops -jar <服务端名称>.jar

官方服务端安装到此结束

第三方服务端

我先把镜像站丢出来,https://yivesmirror.com/

像 Spigot、Paper Spigot、Sponge、Forge、MCPC+等等第三方服务端不拉不拉的,主流版本这里都可以找到并直接下载,有些没有的请自行谷歌,百度,选择第三方服务端的原因就是因为更轻量,提供的优化选项很多,对于服务器的优化好,并且相对于官方一些插件支持兼容效果可能要略胜一筹,安装方法跟上面的一样,只是安装后生成的文件不一样,这些设置文件会在接下来的服务器优化中说到

Ⅲ.服务端版本的选择

推荐安装1.14以下的服务器或者1.14以上的,1.14系列的最好别安,区块加载一直是1.14的通病,服务器的 Tick 会马上瞬间爆炸

Ⅳ.安装 MOD 版本的服务器(MC服务器装MOD)

使用原版 Forge

纯净服如果玩的已经没啥意思了话,就要装点 MOD 耍耍了,不过要使用 MOD 上面的官方服务端和第三方服务端就没他们什么事了,因为装 MOD 的话,Forge 也是作为一个服务端存在的,点我去下载 Forge,接下来说明如何安装 Forge 服务端

1.先去官网下载 Forge ,下2个文件,一个是 Installer ,另外一个是 Universal MineCraft Server 搭建

2.然后将这2个上传到你的服务器文件夹中,运行以下命令

java -jar <你下载下来的 Forge 文件名-installer>.jar --installServer

3.有的人可能执行完上面的命令会显示各种超时,失败,可能是因为 GFW 最近的原因,或者本来就无法使用的原因,反正就是中国的 VPS 无法下载所需要的程序,这时有2个解决办法

3-1.去你的除了中国以外的 VPS 上执行上面的操作,然后将文件转移到国内

3-2.我这边已经下好了 Forge_Server_1.12.2-14.23.5.2815 的版本,点我下载,将 Forge_Server_1.12.2-14.23.5.2815 文件夹全部下载下来转移到你的服务器上,然后执行上面的命令就可以使用了

4.安装完毕后,执行以下命令启动

java -jar <你下载下来的 Forge 文件名-universal>.jar nogui

5.启动成功的话,输入 Stop 停止,然后把 MOD 复制到 mods 文件夹,就能愉快的玩耍了(这玩意我搜了好久,还有服务器启动也搞了好久,天朝现在网络环境真都是TM瞎几把乱讲,还是谷歌好==)

注:服务端的 Forge 版本应该要与本地的一样,就是 Forge 后跟着的数字,什么2815,2316的

使用 SpongeForge

安装方法跟 Forge 一样,等 Forge 安装完后把 SpongeForge 复制到 mods 文件夹就好,下载地址在上面的镜像站

注:SpongeForge 的版本要和 Forge 一样

Ⅴ.服务器的优化

敲黑板,这部分好好看,优化好才能保证你的 Tick 保持在一个将近20的数值

Tick

关于 Tick ,请自行百度或者谷歌,开游戏服务器知道这个很重要

开服的参数脚本编写

Java 8 建议的开服:

java -Xms最小内存 -Xmx最大内存 -XX:+AggressiveOpts -XX:+UseCompressedOops -jar <服务端名字>.jar

这些参数是什么意思呢?

-Xms 最小内存,设置大一点会让你的服务器有足够内存运行,避免卡顿和瞬间内存溢出的崩服,但是设置太大会导致内存浪费

-Xmx最大内存,就是你服务器可以使用的内存数量(MB)

-XX:MaxPermSize 你可以把他想象为插件的处理中心,设置越大,插件运算效率会更快

-XX:+AggressiveOpts 这个是让JAVA使用对MC有益处的运算机制

-XX:+UseCompressedOops 尽量压缩内存,减少耗费,但是据说会耗费一部分的CPU(未验证)(64位JAVA才能使用)

-Xincgc 让JAVA自动释放内存,确保不会因为内存溢出导致服务器崩溃

-XX:MaxGCPauseMillis 这个需要自己设置,如果你不太会开服请删除这部分,这个指的是每次回收GC垃圾的时候最高的停顿时间,如果设置太高会导致服务器有时会出现瞬卡现象,设置太低会导致服务越运行越卡,最后直接崩服,得看你加了什么插件,如果只有很少的插件并且配置优化很棒,则可以设置40-60,若不确定可以删除本参数或者设置为240。

服务器文件优化(转载自MCBBS,顺带一句,Python真是太棒了 :aluhuaji:

不要小瞧参数的修改带来的优化空间,有时候只修改一个参数,就是在线100人TPS19和TPS16的差距。参数的调整分别为server.properties(原版服务器就有),bukkit.yml(水桶服或者衍生版有),spigot.yml(Spigot或者衍生版有),paper.yml(PaperSpigot才有)。

server.properties中可以优化性能的参数:

view-distance,视距,默认值是10(对性能影响很大)。含义是玩家的视距也就是加载的区块范围,默认是10个区块,视距10加载的区块是视距5的四倍。加载更多的区块则需要更多的内存和运算能力。推荐将这个值设置在5或者6,如果在线人数非常多可以设置为4。降低视距可以有效减少内存的占用,也能有效提高TPS,还可以减少宽带的使用量。这个参数对性能提升是立竿见影的。

generate-structures,默认值是true(对性能影响略大)。含义是生成和计算一些特殊的环境,例如女巫塔、村民到达数量生成铁傀儡等等。设置为false可以减少这些特殊环境生成和周期性检查带来的开销。这个参数很少被提起,但是对性能的提升有着不少的帮助。例如我的服务器生存子服有130人左右在线,TPS在17左右,关闭这个功能后提高到了19左右。需要彻底关闭这个参数,还需要在spigot.yml中把save-structure-info设置为false。并且关服后手动删除每个世界(例如world、world_nether、world_the_end)下的data文件夹里的Fortress.dat、Mineshaft.dat、Stronghold.dat、Temple.dat、Village.dat等文件。

network-compression-threshold,默认值是256(对性能影响视情况而定)。这个参数只有1.8的服务端才有,含义是网络封包压缩的阀值。例如设置为16,代表封包大于16才被压缩,设置成256代表着封包大于256才被压缩。设置的值越小则会压缩更多的封包,可以使得宽带使用减少,提高网络流畅程度,但是也会增加性能的开销。如果性能够用可以设置为128,使得更多通讯封包被压缩,一定程度上减少宽带使用率又不会带来太多的性能开销。设置的值太小,例如小于等于32会明显增加对性能的开销,不建议这么做。如果是Bungeecord服务器,并且子服都在内网下,可以把这个参数设置为-1,彻底关闭压缩,节约CPU使用量。

bukkit.yml中可以优化性能的参数:

spawn-limits,意思是限制实体的生成(对性能影响较大)。这个并不是限制一个区块生成多少实体,而是针对一个人可以生成多少实体。例如monsters: 70,在线人数只有10个人,则最多只能生成700个怪物实体(僵尸、骷髅、蜘蛛等等),适当的设置这些参数可以减少实体对性能的影响。一般建议生存服设置monsters为45~60,animals设置为10~15,water-animals设置为3,ambient设置为3。

chunk-gc,控制着区块的回收(对性能影响一般),单位是Tick(1/20秒),period-in-ticks是指每过多少tick回收一次需要回收的区块,设置的太小会导致回收过于频繁而影响性能,设置的太大会导致需要回收的区块迟迟不回收使得内存占用过大,合理的数值一般是300~400。load-threshold是指达到多少需要回收的区块的时候才进行回收。例如设置成300,只有当需要回收的区块到达300以上才进行回收,合理的设置这个数值可以使得额外只多占用一丁点内存却使得区块回收的性能开销可以被无视。一般设置为300~600比较合适。

autosave,自动保存存档(地图、玩家数据等)的周期,单位是Tick(1/20秒),如果你使用了定时保存的插件,例如Saveit、AutoSave等等,你可以将他设置为0,即关闭这个功能。这样可以减少服务器瞬卡发生的可能。如果您使用的是paper服务端,建议你使用服务端自带的定时保存功能,不要使用其他的保存插件,因为paper对自动保存做了很多优化,性能是目前最好的。

spigot.yml中可以优化性能的参数:

user-cache-size,1.7.5以上版本才有,其控制用户缓存的大小(保存玩家名字和UUID的对应关系),如果你的服务器玩家很多,可以设置的更大一些,例如5000。如果你是离线模式的服务器,可以设置为0,关闭这个功能。

save-user-cache-on-stop-only,1.7.5以上版本才有,其含义是是否只在服务器关闭/重启的时候保存用户缓存,设置为true可以提高性能,但是中途蹦服可能导致数据丢失,所以不建议生存模式的服务器开启。

view-distance,同server.properties里的view-distance一样。对性能影响很大,建议生存服设置为4或者5。

chunks-per-tick,是指每tick(1/20秒)扫描计算多少区块,计算的内容是作物的生长。对性能影响较大,默认值是650,可以设置成350来提高性能。的情况可以设置成150,但是会使得作物生长的速度明显变慢。在新版内已经被删除,但是你依然可以合理设置/gamerule randomTickSpeed的大小来提升性能,例如/gamerule randomTickSpeed 2(默认值为3)。

max-tick-time: (仅较新的版本有该参数,如1.8.3+)是指每tick,实体和tile最多可以用的时间(单位是毫秒),对性能影响很大。要明白其含义首先要解释什么是TPS,TPS的意思是每秒有多少tick,最大值是20,也就是每秒tick20次,每次50毫秒。如果运算量过大导致每tick计算了超过了50毫秒,那么TPS就会下降,一旦TPS低于15就会产生明显的卡顿。在这参数中tile代表着熔炉、箱子、牌子、骷髅头等等所能占用的最大时间,entity是指的实体,例如动物、怪物、村民、展示框、掉落物、船、矿车等等。设置tile和entity的总和小于等于30则能明显降低tile和entity对TPS的影响,而服务器运算资源几乎一大半都是由这两者消耗的。设置tile为10,entity为20比较合适,如果实体非常多,还可以设置tile为6,entity为24。需要注意的是,新版的paper服务端设置max-tick-time是无效的,如果实体对你服务器的性能占用很大,你可以选择自己加回这个功能,或者直接使用spigot服务端。

anti-xray,服务端自带的反透视功能,俗称假矿。对性能影响较大。这个功能相比插件版的假矿来说,额外内存占用极少,少到可以忽略,并且矿物的变动计算是异步进行的,对TPS的影响很小。engine-mode为1则是隐藏矿物,engine-mode为2则是将非矿物也伪装成矿物,engine-mode设置为2的效果最好,但是会额外吃一定的性能和宽带,但是engine-mode设置为1无法防御矿追。具体如何权衡请自行决定。如果你不需要本功能,例如你是纯RPG服务器,可以直接把enabled设置为false关闭这个功能,提高性能。新版的spigot已经不自带这个功能了,但是在1.12+的paper中自带本功能,并且是完全异步实现的,你不必担心对性能的影响(影响非常轻微)。

nerf-spawner-mobs,简单来说就是让刷怪笼生成的怪物变成白痴,直观感受就是刷怪笼刷出的怪不能攻击了。默认为false,意思是不开启。设置为true可以获得一定的性能提升。如果你的服务器有很多利用刷怪笼做的刷怪场,设置为true可以带来不少的性能提升。

entity-activation-range,这个参数是控制实体的活跃范围(性能影响很大),例如monsters: 32意思是在玩家附近32格范围内的怪物才会活跃(被计算AI等),减少这个数值可以明显提升性能,但是设置得过小会使得游戏难度大幅降低。一般可以把monsters设置为24,animals设置为12,misc设置为2(misc主要是掉落物,设置2可以使得掉落物几乎不再卡服)。

entity-tracking-range,这个参数是控制实体的可见范围,这个参数不会影响性能,对宽带的影响也极小。不建议修改这个参数,但是适当的降低数值可以减少客户端的卡顿。

random-light-updates,随机的光照更新(对性能影响略大),设置为true的话服务器会随机更新光照,并且在区块加载的第一个tick运算光照逻辑。设置为false可以提高不少性能。

save-structure-info,在前面已经介绍了。

max-bulk-chunks,1.7.10+才有这个参数,意思是每个数据封包里塞多少个区块。适当提高这个数值,例如从10提高到15可以减少网络卡顿和客户端读取区块的速度,但是设置得过高会导致客户端崩溃。

max-entity-collisions,实体碰撞箱的阀值。建议设置为1或者0,可以减少密集卡服的问题。(设置为0则直接关闭实体碰撞箱)

max-tnt-per-tick,每tick(1/20秒)最多计算多少TNT爆炸,设置为20可以显著防御TNT蹦服。

ticks-per:内有hopper-transfer、hopper-check控制漏斗的运算周期,如果你的服务器有大量的漏斗红石设备,都设置为8可以显著解决漏斗带来的卡顿问题。

int-cache-limit:设置Integer的缓存,默认为1024,生存服特别是使用了其他的地形生成器的,设置为4096会有一定的性能提升。

merge-radius:掉落物、经验值的合并范围,建议把item设置为5.0,exp设置为6.0。如果你的服务器有一些自动化的刷怪设备,增大经验值和掉落物的合并范围可以减少掉落物的数量,一定程度上可以提升性能。

paper.yml中可以优化性能的参数:

keep-spawn-loaded,spawn区块是否常驻内存,设置为false可以减少一定的内存占用和计算量

tick-next-tick-list-cap,每tick最大的运算量,减少数值可以提高TPS,例如设置为8000(新版已删除)

tick-next-tick-list-cap-ignores-redstone,达到上面的运算阀值是否无视红石运算,设置为true可以显著减少红石对服务器性能的影响。(新版已删除)

optimize-explosions,是否开启爆炸算法优化,设置为true可以提升一定的服务器性能

use-async-lighting,是否让光照的逻辑运算异步化,设置为true可以使得光照运算不再影响TPS,强烈推荐设置为true(新版已删除)

cache-chunk-maps,是否缓存chunkmaps,可以让区块的数据更多得被复用,可以一定程度提高性能,推荐设置为true(新版已删除)

bungee-online-mode:离线服务器请关闭这个选项,否则可能导致玩家登陆、切换子服务器的时候卡顿几秒(服务器并不卡,只是玩家被阻塞)

region-file-cache-size:可以简单理解为存档文件的缓存大小,增大这个值并不会显著增加内存占用,生存服可以设置为512。

queue-light-updates:光照更新队列化,开启后可以减少光照计算对性能的影响,建议开启。

hopper:cooldown-when-full,当漏斗链接的容器满了以后是否冷却一段时间,建议开启。disable-move-event,是否关闭InventoryMoveEvent事件,如果你没有漏斗保护等插件,可以关闭,但是还是建议不要关闭,可能带来一些兼容性的问题。push-based控制是掉落物自己找漏斗,还是漏斗找掉落物,建议开启。

delay-chunk-unloads-by:需要卸载的区块等待X秒以后再卸载。例如A玩家在自己领地种田,然后去主城售出,然后又回自己领地。这样延迟卸载就可以避免玩家领地的区块被卸载,又被加载。生存模式的服务器可以设置为30秒(30s)

allow-permanent-chunk-loaders:是否允许区块被永久加载,村民的一些计算会导致区块不被卸载,或者反复被加载、卸载。建议设置为false以避免卡顿。

disable-chest-cat-detection:开启箱子的时候,服务端会检测箱子上是否蹲着猫。建议设置为true关闭这个检测,以提高性能。

container-update-tick-rate:可以设置为2,来减缓容器刷新的周期,轻微提升性能

grass-spread-tick-rate:生存服务器总有一些人喜欢使用泥土和草方块铺地然后再建造房屋,你可以设置为4,减缓草方块在泥土中的扩散速度,减少卡顿。

mob-spawner-tick-rate:控制刷怪笼的运算周期,建议设置为2~5以提高性能。

Ⅵ.域名绑定至服务器

1.首先先将你的服务器 IP 绑定一个 A 记录至域名,顶级域名二级域名都可以

2.然后新建一个 SRV 记录,服务为_minecraft,协议选择 TCP ,名字就是@或者你的二级域名,优先级为0,权重为5,端口填你的服务器开放的端口,如果不是像 CF 一样分的特别细的,就在服务那里输入_minecraft._tcp.<你的二级域名前缀>


活着就是为了改变世界