前言:
阅读本文需要有一定Unix系统使用经验
由于多人联机对带宽上行要求不低,否则玩家(客户端)会出现卡顿延迟的现象。且由于国内运营商特殊原因,家用宽带的上传速率和下载速率并不对等,就是说上下行带宽不一样,通常是下载速率远远大于上传速率,鉴于这个现实情况,只有使用VPS等云服务器才能实现这个需求,因为一般云服务器的上下行带宽都会对等,而且比普遍的家用宽带的上传速度高,满足多人联机需求,对于服务器来说上传速率才是影响服务质量的关键因素,从用户角度来说服务器的上传速率关系到操作响应时间多与少的问题,上传速率越大,响应时间越少,反之亦然。下面记录一下linux环境下搭建starbound 服务端过程。
准备工作:
1.首先需要准备一台服务器,这里推荐使用各大供应商的VPS虚拟云服务器。国内阿里云腾讯云等大厂的最低配,单核CPU,1G内存也需要约50~100人民币一个月的租赁费用,小厂考虑到售后维护,问题反馈处理速度和公司稳定性等问题,笔者个人决定不予采用。国外老牌VPS供应商推荐使用Linode,Vultr,DigitalOcean,UpCloud等,笔者本人仅仅使用过Linode,同样的配置比国内供应商价格便宜一半左右(5到10美元左右),就是由于国外供应商的服务器节点一般在海外,日本,韩国,澳大利亚,新加坡,美国,英国等,考虑到服务器节点地理位置离玩家越远网络延迟越高的问题,可以选用就近的日本或者香港(如有)节点等。笔者当时使用的是Linode日本节点,延迟大概在200~500ms毫秒左右。当然如果不考虑成本问题则选用阿里云或者腾讯云等国内供应商为佳。
(补充:针对starbound的优化,笔者推荐使用2核,2G内存的配置,优先确保内存条件,玩家5人以下推荐2M带宽,人数提高则适当增加带宽和硬件配置)
2.服务器操作系统最低版本推荐,Ubuntu 16.04 LTS,Debian 8,Fedora 最新版,CentOS 7 ,且均为x64位操作系统,32位操作系统则服务端不予支持,其他64位操作系统要求已安装tmux 1.6以上和glibc 2.17以上版本的运行库
3.steam官方服务端工具steamcmd介绍:steamcmd是steam官方推出的一款可以在linux系统环境下运行的去图形化的可交互API指令集终端,主要用来完成建立监听服务端的工作,具体用法可自行查阅文章篇末的参考文章3。
4.服务端选择第三方的LinuxGSM,而不直接使用steamcmd下载官方服务端的方式,是因为前者集成了steamcmd里头的功能之外,还在此基础上添加了较为方便的配置管理功能,如运行脚本一键自动连接登录steam,自动下载starbound等功能,还有后台运行,实时控制台管理,日志查看等。当然LinuxGSM不是starbound专用服务端,它还支持运行其他steam游戏服务端,具体可自行查阅文章篇末的参考文章2,这里不展开赘述。
开始安装:
(以下笔者以操作系统CentOS7为例搭建服务端)
1.安装依赖:
[root@testserver ~]# yum install -y epel-release #安装epel的yum源以便安装后续依赖
[root@testserver ~]# yum install -y mailx postfix curl wget bzip2 gzip unzip python binutils bc jq tmux glibc.i686 libstdc++ libstdc++.i686 #安装所需依赖,运行库
2.安装服务端:
[root@testserver ~]# adduser -d /这里填写安装目录 sbserver #创建管理和运行服务端专用系统用户sbserver,安装目录根据实际选择硬盘空间宽裕的分区即可,同时安装目录即sbserver用户的家home目录
[root@testserver ~]# passwd sbserver #给用户sbserver设置登录密码,由于一般从root用户直接切换到sbserver用户操作,不需要每次输入sbserver密码,这里的密码可以设置得尽量复杂一点避免安全问题即可。
[root@testserver ~]# su - sbserver #切换到sbserver用户进行后续操作
[sbserver@testserver ~]$ wget -O linuxgsm.sh https://linuxgsm.sh && chmod +x linuxgsm.sh && bash linuxgsm.sh sbserver #下载安装服务端的脚本linuxgsm.sh并授予执行权限,最后运行脚本
[sbserver@testserver ~]$ vi lgsm/config-lgsm/sbserver/common.cfg #编辑服务端配置文件common.cfg,加入登录steam所用的账号和密码,由于starbound的服务端需用户购买后才能下载,所以必须使用已购买游戏的steam账号登录
在common.cfg中写入如下内容,并保存退出
steamuser="steam用户名填这里"
steampass='steam用户密码填这里'
[sbserver@testserver ~]$ ./sbserver install # 开始安装starbound服务端,中间按提示输入登录验证码,然后等待脚本运行结束
3.服务端常用命令(注意以下命令都需要在sbserver用户下执行,否则脚本会抛出错误):
[sbserver@testserver ~]$ ./sbserver #显示使用方法和帮助信息
[sbserver@testserver ~]$ ./sbserver start #启动服务端
[sbserver@testserver ~]$ ./sbserver stop #停止服务端
[sbserver@testserver ~]$ ./sbserver restart #重启服务端
[sbserver@testserver ~]$ ./sbserver console #打开服务端控制台,在启动服务端后可使用,用来监控服务端运行情况,或者执行服务端命令,在服务端窗口使用 CTRL+b 松开然后再单独按d 的方式退出控制台返回linux终端,注意,使用CTRL+c的话则是直接停止服务端并退出控制台
[sbserver@testserver ~]$ ./sbserver update #更新服务端
[sbserver@testserver ~]$ ./sbserver validate #校验服务端完整性,类似steam里的校验游戏文件完整性
[sbserver@testserver ~]$ ./sbserver details #输出服务端配置信息
[sbserver@testserver ~]$ ./sbserver backup #备份服务端文件
4.服务端通讯相关:
linux系统需要把服务器监听端口(默认为TCP协议的21025端口)在防火墙上开放,还要根据运营商提供的服务器安全策略进行相应的端口通讯放行,如阿里云的服务器安全组策略,属于安全组的服务器,需要在里面添加相应的放行规则。最后就是网络设备层(路由器,三层交换机等)也需要检查放行相应的端口。全部放行后可以在另外一台机器上使用“telnet 服务器IP地址 21025”的方式检查服务端的端口是否能够正常通讯。
初步总结:
如果只游玩原版服务端的话,安装进行到这里则结束,如果还需要在服务端上安装第三方扩展模组(即俗称mod,什么是mod请自行查阅资料),那么请继续往下看。
服务端安装模组mod:
1.首先为了服务端和其他一起游玩的小伙伴安装mod方便,需要到steam的个人创意工坊(国内访问需科学上网)上把需要安装的mod订阅并添加到个人合集里,之后会得到一个指向该合集的页面,以及相应的网页地址URL,例如https://steamcommunity.com/sharedfiles/filedetails/?id=1833513307
地址中的参数id的值1833513307则是该合集的编号,这个编号后面的安装会用到。
2.新建脚本shinit.sh ,先删除在安装服务端时候默认下载的一些创意工坊里的mod内容,然后调用steam的接口并生成统一下载前面提到的创意工坊mod合集的脚本moddownload.sh,脚本内容如下:
(说下脚本的具体思路:调用steam接口的时候返回的结果是JSON的数据格式,linux下可以使用jq这个工具进行数据处理并提取到需要下载的mod的编号id,创意工坊里的模组mod跟合集一样,在mod的介绍页的网站地址上有其对应的编号id,在这里就是要处理这段JSON格式的数据并得到这些mod的编号,然后传递给新脚本moddownload让其批量下载到服务端中。)
#!/bin/bash
#shinit.sh
rm -rf /data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/*
cd /data/scripts/sbserver/steamcmd
echo "./steamcmd.sh +login "steam账号填这里" "steam密码填这里" +force_install_dir ../serverfiles \\" > moddownload.sh
curl -s --data "collectioncount=1&publishedfileids[0]=创意工坊mod合集id填这里" https://api.steampowered.com/ISteamRemoteStorage/GetCollectionDetails/v1/ \
| jq '.response.collectiondetails[] | .children[] | .publishedfileid' \
| sed 's/^/+workshop_download_item 211820 /' | tr '\n' ' ' >> moddownload.sh
echo "+quit" >> moddownload.sh
chmod +x moddownload.sh
./moddownload.sh
rm -f moddownload.sh
3.在顺利运行moddownload.sh脚本后,创意工坊合集里的mod已经被正确下载到服务端里,接下来要修改配置文件serverfiles/linux/sbinit.config让服务端在启动时候加载需要启动的模组mod,由于该文件sbinit.config属于JSON格式的文件,所以需要用以下命令处理其内容:
[sbserver@testserver linux]$ echo -e "{\n \"assetDirectories\": [\n \"../assets/\",\n \"../mods/\",\n " >> /data/scripts/sbserver/serverfiles/linux/sbinit.config
[sbserver@testserver linux]$ curl -s --data "collectioncount=1&publishedfileids[0]=合集的ID填这" https://api.steampowered.com/ISteamRemoteStorage/GetCollectionDetails/v1/ \
| jq '.response.collectiondetails[] | .children[] | .publishedfileid' \
| sed 's#^#"../../Steam/steamapps/workshop/content/211820/#' | sed 's#/"#/#' | tr -t '\n' ',' >> /data/scripts/sbserver/serverfiles/linux/sbinit.config
[sbserver@testserver linux]$ echo -e "\b\b\n ],\n \"storageDirectory\": \"../storage/\"\n}\n" >> /data/scripts/sbserver/serverfiles/linux/sbinit.config
4.最后得到配置文件sbinit.config,但笔者在启动的时候发现生成的配置文件格式有问题,且服务端启动时候报错,日志内容为找不到配置文件sbinit.config所指向的资源目录,故笔者将其配置文件里的目录全部改为绝对路径,并检查其是否符合JSON的数据格式,还有排版问题等,终于顺利启动服务端,以下是整理后的配置文件sbinit.config内容,中间带有workshop路径行的则是需要加载的mod列表:
{
"assetDirectories": [
"/data/scripts/sbserver/serverfiles/assets/",
"/data/scripts/sbserver/serverfiles/mods/",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729791646",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729427436",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/731220462",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729492703",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/1575016526",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/763259329",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729480149",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/754350883",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/731354142",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729427744",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/1117007107",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/733238864",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729428037",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729726478",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729426722",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/807695810",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729524482",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/1264107917",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729466018",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/731957126",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729426797",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729427264"
],
"storageDirectory": "/data/scripts/sbserver/serverfiles/storage/"
}
5.最后确认无误后,启动服务端并查看启动日志,可进入服务端的控制台查看(怎么启动服务端和进入控制台请参考上文),或者直接打开serverfiles/storage/starbound_server.log 即可,若日志中出现mod报错信息,则可以尝试到mod安装目录下serverfiles/steamapps/workshop/content/211820/ 移除相应的mod即可,如果读者熟悉代码开发还可以尝试解包自行解决异常;若日志提示游戏服务端配置文件serverfiles/storage/starbound_server.config 设置有误,则默认LinuxGSM服务端会自动生成一个默认的配置文件进行替代并启动,旧的服务端配置文件会重命名为starbound_server.config.old,读者可在服务端停止后,直接使用系统生成的配置文件starbound_server.config,或在其基础上修改后,最后重新启动服务端,直到其顺利启动,日志不再出现影响服务端正常启动的条目即可。至此服务端安装模组mod完成。
总结:
总的来说寓教于乐,虽然为了玩游戏折腾大半天麻烦了一点,但是也学到了诸如linux下使用jq处理JSON格式数据等新东西,同时也强化了自己的分析和编写Bash脚本的能力,看到一个内容写的十分复杂的脚本关键还是要去抽丝剥茧逐层分析,在理解之后你会发现表面复杂的东西其实内里很简单。服务端搭建起来之后还是很有满足感的。感谢参考文章里的那些先行的朋友们,对长时间阅读英文头疼的笔者来说简直是帮了大忙。
参考文章:
3.https://developer.valvesoftware.com/wiki/SteamCMD#Downloading_SteamCMD