1. 为什么选择阿里云Ubuntu部署饥荒联机版服务器
1.1 自建服务器的核心动机
玩过饥荒联机版的朋友都知道,这游戏最舒服的体验就是几个人长期在一个固定世界里慢慢发展,建家、打Boss、过四季。但问题来了——官方服务器延迟高、Mod管理不灵活、世界存档不在自己手里,而且一旦房主下线,其他人就全被踢出去了。我最早是几个人用本地主机开房间玩,结果每次都要等房主上线,后来换过各种第三方平台,要么限制人数,要么Mod装不了,要么存档丢了找不回来。
自己租一台云服务器来跑饥荒联机版专用服务器(Dedicated Server),是目前最稳妥的方案。阿里云的ECS实例在国内访问延迟低,Ubuntu系统对SteamCMD的支持非常成熟,整个部署流程也不算复杂。这篇文章我会把从购买服务器到多人成功联机的完整过程拆开讲,包括踩过的坑和参数选择的理由,你照着做基本能一次跑通。
1.2 适合谁来参考这套方案
这套方案适合三类人:一是想和朋友长期稳定联机、不想受房主在线时间限制的玩家;二是有一定Linux基础、愿意花半小时折腾一次换长期省心的技术爱好者;三是想顺便练手云服务器运维的学生或开发者。如果你完全没碰过Linux命令行,也不用怕,我会把每条命令的作用都解释清楚,你复制粘贴也能跑起来。
需要提前说明的是,饥荒联机版专用服务器的性能需求并不高。我实测下来,4人以内的小型世界,2核4G的实例完全够用,甚至2核2G也能跑,只是洞穴和地面同时开启时内存会紧张一些。后面我会给出具体的配置建议和参数计算。
1.3 整体部署路线概览
整个流程可以拆成六个阶段:购买并初始化阿里云ECS实例、配置Ubuntu基础环境、安装SteamCMD并下载饥荒服务端、生成世界配置和集群令牌、配置Systemd守护进程实现开机自启、最后是Mod管理和日常维护。每个阶段都有一些容易出错的细节,比如安全组端口开放、集群令牌的获取方式、洞穴分片的配置等,我会逐一展开。
2. 阿里云ECS实例选购与Ubuntu系统初始化
2.1 实例规格与镜像选择
先说配置。饥荒联机版服务端本质上是单线程为主的程序,地面和洞穴各占一个进程,所以CPU核心数比单核频率更重要。我的建议是:
| 玩家规模 | 推荐规格 | 内存 | 带宽 | 系统盘 |
|---|---|---|---|---|
| 2-4人 | 2核2G | 2GB | 3Mbps | 40G ESSD |
| 4-6人 | 2核4G | 4GB | 5Mbps | 40G ESSD |
| 6人以上+多Mod | 4核8G | 8GB | 5Mbps | 60G ESSD |
带宽这块要重点说一下。饥荒联机版的网络同步数据量不大,但延迟敏感。3Mbps带宽支撑4人联机绰绰有余,但如果Mod很多、世界实体数量爆炸,同步数据会增大,建议留5Mbps余量。地域选择上,选你和朋友们物理距离最近的地域,比如大家都在华东就选杭州或上海。
镜像选择Ubuntu 22.04 LTS 64位。为什么不用20.04?因为22.04的glibc版本更新,SteamCMD的兼容性更好,而且长期支持到2027年。别选CentOS,虽然也能跑,但SteamCMD在Ubuntu上的社区文档和踩坑记录最丰富,出问题好查。
2.2 安全组端口配置
这是新手最容易卡住的地方。饥荒联机版需要开放的端口分两类:
- UDP 10999:地面世界的游戏通信端口
- UDP 10998:Steam主查询端口(用于服务器列表展示)
- UDP 27015:Steam查询端口
- UDP 10888:如果开启洞穴,洞穴分片的通信端口
如果你还想要Steam创意工坊自动更新Mod,需要额外开放TCP 27016(可选)。
在阿里云控制台的"安全组"里添加入方向规则,协议类型选"自定义UDP",端口范围填10998/10999,授权对象填0.0.0.0/0。洞穴的话再加10888/10888。这里有个坑:很多人只开了10999,结果朋友能连上但服务器不出现在Steam列表里,就是因为10998没开。
注意:安全组规则修改后立即生效,不需要重启实例。但如果你的服务器同时装了ufw防火墙,还需要在系统内放行对应端口,两层都要开。
2.3 系统初始化与基础环境
用SSH连上服务器后,先做几件基础事。第一是更新系统包并安装必要工具:
sudo apt update && sudo apt upgrade -y sudo apt install -y lib32gcc-s1 lib32stdc++6 libcurl4-gnutls-dev wget screen vimlib32gcc-s1和lib32stdc++6是SteamCMD运行必需的32位库,缺了会报"error while loading shared libraries"。screen用于后台保持会话,虽然我们最终会用Systemd管理,但调试阶段screen很方便。
第二是创建一个专用用户来跑服务端,不要用root直接跑,这是安全习惯:
sudo useradd -m -s /bin/bash steam sudo passwd steam给steam用户设个密码,后面切换过去操作。用专用用户的好处是权限隔离,即使服务端被攻击也不会影响系统关键文件。
第三是调整文件描述符限制。饥荒服务端在实体多的时候会打开大量文件句柄,默认的1024可能不够:
sudo vim /etc/security/limits.conf在文件末尾加上:
steam soft nofile 65535 steam hard nofile 65535保存后重新登录steam用户生效。这个细节很多人忽略,结果玩到中后期服务器突然崩溃,日志里报"Too many open files",就是这个原因。
3. SteamCMD安装与饥荒服务端下载
3.1 SteamCMD的正确安装方式
切换到steam用户,创建安装目录:
su - steam mkdir -p ~/steamcmd && cd ~/steamcmd下载SteamCMD的Linux版本:
wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz tar -xvzf steamcmd_linux.tar.gz解压后会得到steamcmd.sh脚本和linux32目录。第一次运行会自动下载更新:
./steamcmd.sh进入SteamCMD的交互界面后,先设置安装目录:
force_install_dir /home/steam/dst_server login anonymous app_update 343050 validate quit这里解释几个关键点。343050是饥荒联机版专用服务器的Steam AppID,不是游戏本体的322330,别搞混。login anonymous表示匿名登录,饥荒专用服务器不需要购买账号就能下载。validate参数会校验文件完整性,第一次下载建议加上,后续更新可以去掉以加快速度。
实操心得:国内服务器下载SteamCMD内容有时会很慢甚至超时。我试过在阿里云杭州节点,白天速度还行,晚上高峰期偶尔卡住。如果遇到下载卡死,可以尝试在凌晨时段操作,或者多试几次。SteamCMD支持断点续传,中断后重新运行
app_update会接着下。
3.2 目录结构与关键文件说明
下载完成后,/home/steam/dst_server目录下会有这些关键内容:
bin/:服务端可执行文件,包括dontstarve_dedicated_server_nullrendererdata/:游戏数据,包括databundles和scriptsmods/:Mod存放目录steamapps/:Steam相关元数据
服务端的启动命令是bin/dontstarve_dedicated_server_nullrenderer,后面跟一堆参数。但直接跑这个命令很麻烦,我们需要用配置文件来管理。
3.3 依赖库的补充安装
饥荒服务端在Ubuntu 22.04上跑,有时会缺一些库。我遇到过报错libcurl-gnutls.so.4: cannot open shared object file,解决方法是:
sudo apt install -y libcurl4-gnutls-dev如果还报其他32位库缺失,用ldd命令检查:
ldd ~/dst_server/bin/dontstarve_dedicated_server_nullrenderer看哪个库显示"not found",然后apt search找对应的32位包安装。Ubuntu上32位库通常带:i386后缀,需要先启用i386架构:
sudo dpkg --add-architecture i386 sudo apt update这一步不是必须的,但如果你的服务端启动就崩,八成是库的问题,按这个思路排查。
4. 世界配置、集群令牌与洞穴分片
4.1 集群目录结构规划
饥荒服务端的配置全部放在~/.klei/DoNotStarveTogether/目录下。我们手动创建集群目录,比如叫MyCluster:
mkdir -p ~/.klei/DoNotStarveTogether/MyCluster cd ~/.klei/DoNotStarveTogether/MyCluster集群目录下需要这些内容:
cluster.ini:集群全局配置cluster_token.txt:集群令牌Master/:地面世界配置目录Caves/:洞穴世界配置目录
Master和Caves目录下各自需要server.ini、worldgenoverride.lua(可选)、leveldataoverride.lua(可选)等文件。
4.2 集群令牌的获取方法
集群令牌是服务器上线到Steam的凭证,没有它服务器起不来。获取方式是在游戏内操作:打开饥荒联机版,进入"账户"页面,点击"游戏"标签,找到"服务器"区域,点击"添加新服务器",输入一个名字,然后会生成一串令牌。复制这串令牌,粘贴到cluster_token.txt文件里。
注意:令牌是敏感信息,泄露了别人可以用你的名义开服。不要把它提交到公开的Git仓库。如果令牌泄露,在游戏内删除该服务器重新生成即可。
4.3 cluster.ini核心参数详解
cluster.ini控制集群的全局行为,我给出一个经过实测的配置模板:
[GAMEPLAY] game_mode = survival max_players = 6 pvp = false pause_when_empty = true [NETWORK] cluster_name = 我们的饥荒世界 cluster_description = 长期稳定联机 cluster_password = yourpassword cluster_language = zh [MISC] console_enabled = true max_snapshots = 6 [SHARD] shard_enabled = true bind_ip = 127.0.0.1 master_ip = 127.0.0.1 master_port = 10889 cluster_key = yourclusterkey逐项解释。max_players设6是因为2核4G的实例跑6人比较稳,人多会卡。pause_when_empty = true表示没人时暂停游戏,节省CPU。cluster_password一定要设,否则任何人都能进。shard_enabled = true开启洞穴分片,bind_ip和master_ip都填127.0.0.1,因为地面和洞穴在同一台机器上,走本地回环通信。cluster_key是分片间通信的密钥,随便设一串字符,地面和洞穴的配置里要一致。
4.4 地面与洞穴的server.ini配置
Master/server.ini:
[NETWORK] server_port = 10999 [SHARD] is_master = true [STEAM] master_server_port = 27018 authentication_port = 8768Caves/server.ini:
[NETWORK] server_port = 10998 [SHARD] is_master = false name = Caves [STEAM] master_server_port = 27019 authentication_port = 8769关键点是端口不能冲突。地面用10999,洞穴用10998,Steam查询端口也要错开。is_master标记哪个是主分片,地面是true,洞穴是false。
4.5 世界生成参数定制
如果你想要自定义世界,比如资源更多、季节更长,可以在Master目录下创建worldgenoverride.lua。这个文件用Lua表格式描述世界生成参数。举个例子,让资源丰富一些:
return { override_enabled = true, preset = "SURVIVAL_TOGETHER", overrides = { resources = "high", season_start = "autumn", autumn = "long", winter = "short", } }preset是预设模式,overrides里可以覆盖具体参数。资源选项有never、verylow、low、default、high、veryhigh。季节长度有very short、short、default、long、very long。这个文件不写也行,服务端会用默认参数生成世界。
5. Systemd守护进程与开机自启配置
5.1 为什么用Systemd而不是screen
调试阶段用screen很方便,但生产环境必须用Systemd。原因有三:一是开机自启,服务器重启后服务自动拉起;二是崩溃自动重启,服务端偶尔会因Mod冲突崩溃,Systemd能自动恢复;三是日志管理,Systemd的journal能统一收集输出,方便排查。
5.2 地面服务的unit文件
创建/etc/systemd/system/dst-master.service:
[Unit] Description=Don't Starve Together Master Server After=network.target [Service] Type=simple User=steam Group=steam WorkingDirectory=/home/steam/dst_server/bin ExecStart=/home/steam/dst_server/bin/dontstarve_dedicated_server_nullrenderer -console -cluster MyCluster -shard Master Restart=on-failure RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target5.3 洞穴服务的unit文件
创建/etc/systemd/system/dst-caves.service:
[Unit] Description=Don't Starve Together Caves Server After=network.target dst-master.service [Service] Type=simple User=steam Group=steam WorkingDirectory=/home/steam/dst_server/bin ExecStart=/home/steam/dst_server/bin/dontstarve_dedicated_server_nullrenderer -console -cluster MyCluster -shard Caves Restart=on-failure RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target注意After里加了dst-master.service,确保地面先启动,洞穴后启动。因为洞穴需要连接地面的主分片,顺序反了会连接失败。
5.4 启用与验证
sudo systemctl daemon-reload sudo systemctl enable dst-master dst-caves sudo systemctl start dst-master sleep 15 sudo systemctl start dst-caves等15秒再启动洞穴,给地面服务初始化时间。验证状态:
sudo systemctl status dst-master sudo systemctl status dst-caves看到active (running)就成功了。查看日志:
sudo journalctl -u dst-master -f日志里出现Sim paused表示世界已加载,等待玩家加入。
实操心得:第一次启动时,服务端会生成世界,这个过程可能持续1-3分钟,期间日志会刷大量生成信息。别急着以为卡死了,耐心等。如果超过5分钟还没出现
Sim paused,检查cluster_token.txt是否正确、端口是否被占用。
6. Mod管理与自动更新机制
6.1 创意工坊Mod的安装方式
饥荒联机版的Mod通过dedicated_server_mods_setup.lua文件管理。这个文件在~/dst_server/mods/目录下。格式是:
ServerModSetup("378160973") ServerModSetup("458587300") ServerModSetup("661253977")每行一个Mod的创意工坊ID。ID怎么获取?在Steam创意工坊页面,URL末尾的数字就是ID。比如https://steamcommunity.com/sharedfiles/filedetails/?id=378160973,ID就是378160973。
6.2 Mod配置文件的编写
光安装还不够,还要在集群目录下配置哪些Mod启用。创建~/klei/DoNotStarveTogether/MyCluster/Master/modoverrides.lua:
return { ["workshop-378160973"] = { enabled = true }, ["workshop-458587300"] = { enabled = true, configuration_options = { } }, ["workshop-661253977"] = { enabled = true }, }洞穴目录Caves/modoverrides.lua也要同样配置一份,否则洞穴里Mod不生效。这是很多人踩的坑——地面Mod正常,一下洞穴就报错,就是因为洞穴没配。
6.3 Mod自动更新的实现
服务端启动时会自动检查并更新dedicated_server_mods_setup.lua里列出的Mod。但有个前提:服务端进程要有权限写入mods目录。用steam用户跑服务端,目录属主也是steam,一般没问题。
如果Mod更新后导致服务端崩溃,可以临时禁用某个Mod:把modoverrides.lua里对应的enabled改成false,重启服务即可。排查是哪个Mod的问题时,可以用二分法,先禁用一半,看是否恢复,逐步缩小范围。
6.4 Mod冲突的常见表现与处理
Mod冲突的典型表现有三种:一是服务端启动直接崩溃,日志报Lua错误;二是能启动但玩家一进就掉线;三是游戏内某些功能异常,比如物品无法制作。处理思路是看日志定位报错的Mod,然后去创意工坊页面看有没有兼容性说明或更新。
我遇到过两个Mod都修改了同一个游戏机制,导致冲突。解决方法是找功能重叠的替代Mod,或者联系Mod作者。大部分热门Mod都有兼容性维护,保持更新能避免很多问题。
7. 常见问题排查与运维经验
7.1 连接类问题速查
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 服务器不出现在Steam列表 | 10998端口未开放 | 检查安全组和ufw |
| 朋友连接超时 | 10999端口未开放 | telnet测试UDP端口 |
| 能连上但频繁掉线 | 带宽不足或Mod冲突 | 看日志和监控带宽 |
| 洞穴无法进入 | 10888端口未开放或cluster_key不一致 | 检查两处配置 |
| 提示"服务器需要维护" | 服务端版本过旧 | 运行SteamCMD更新 |
7.2 性能问题的排查思路
服务器卡顿通常有三个来源:CPU、内存、磁盘IO。用htop看CPU和内存占用,用iostat看磁盘。饥荒服务端在实体数量多的时候CPU会飙升,这是正常的。如果长期CPU跑满,考虑升级实例规格或减少Mod数量。
内存方面,地面和洞穴各占约1-1.5G,加上系统开销,2G内存的实例跑双分片会很紧张。我建议至少4G。如果内存不足,服务端会被OOM Killer杀掉,日志里能看到Killed字样。
7.3 存档备份与恢复
存档在~/.klei/DoNotStarveTogether/MyCluster/Master/save/和Caves/save/目录下。定期备份是好习惯,可以写个cron任务:
0 4 * * * tar -czf /home/steam/backup/dst_$(date +\%Y\%m\%d).tar.gz /home/steam/.klei/DoNotStarveTogether/MyCluster每天凌晨4点备份一次。恢复时停掉服务,解压覆盖,再启动。注意备份时最好先停服务或用c_save()命令让服务端保存当前状态,否则可能备份到不一致的数据。
7.4 版本更新与维护节奏
饥荒联机版会不定期更新,服务端也要跟着更新。更新流程是:停服务、运行SteamCMD的app_update 343050 validate、启动服务。建议在更新前先备份存档,因为大版本更新有时会改变存档格式。
我个人的维护节奏是每周检查一次更新,每月做一次完整备份归档。Mod更新更频繁,但服务端启动时会自动拉取,不用手动干预。如果某次更新后出问题,回滚的方法是SteamCMD加上-beta参数指定旧版本,但饥荒的旧版本分支不总是可用,所以备份存档才是最后的保险。
7.5 几个容易被忽略的细节
第一,服务器的时区设置。默认UTC时区,游戏内的时间和现实对不上。改成东八区:
sudo timedatectl set-timezone Asia/Shanghai第二,cluster.ini里的cluster_name如果包含中文,某些客户端可能显示乱码。建议用英文或拼音,游戏内再改显示名。
第三,如果服务器公网IP变了(比如重启后),集群令牌可能需要重新生成。阿里云ECS默认是固定公网IP,一般不会变,但如果你用的是按量付费实例且释放过,就要注意。
第四,max_snapshots控制存档快照数量,设太大会占磁盘。6个快照大约占几百MB,40G系统盘完全够用。
这套方案我从最早的单人测试跑到现在的6人长期服,前后调整了十几次配置,踩过的坑基本都写在上面了。核心思路就是:用Systemd保证稳定性,用配置文件管理世界参数,用定期备份兜底。剩下的就是享受游戏了。