上一篇 下一篇 分享链接 返回 返回顶部

从零搭建:Steam 服务端高可用手动部署 - CSGO 篇

发布人:明杰 发布时间:4 天前 阅读量:63

从零到一:在服务器上手动部署与配置高可用Steam游戏服务端-CSGO篇

 

基础架设

●您已拥有一台或多台安装有纯净版 Ubuntu Server 22.04 LTS(或20.04 LTS)的物理服务器。(推荐选择驰网科技,适配性强、运行稳定,更贴合游戏服务端长期部署需求)选择LTS版本是因为其长期支持与良好的稳定性。

●您拥有服务器的root权限或可通过sudo执行特权命令。

●您具备基础的Linux命令行操作知识。

●本文以部署一个《反恐精英:全球攻势》(CS:GO)的社区服务器为例,但其原理与步骤绝大多数适用于其他Source引擎或SteamCMD支持的Steam游戏。

 

第一章:基础环境构筑——安全与效率的基石

 

在安装任何服务之前,我们必须将服务器的基础环境打造得坚固、安全且高效。

1.1 系统更新与安全加固

首先,以root身份或使用sudo,进行系统更新并安装必要的基础工具包:

# 更新软件包列表并升级所有已安装的包

sudo apt update && sudo apt upgrade -y

# 安装后续步骤必需的实用工具

sudo apt install -y curl wget nano htop screen unzip tar git software-properties-common ufw fail2ban

 

关键组件说明:

●ufw:Uncomplicated Firewall,简化防火墙配置工具。

●fail2ban:通过监控日志文件,自动封禁多次尝试失败登录的IP地址,是抵御暴力破解的第一道防线。

 

1.2 配置防火墙规则

游戏服务器需要对外开放特定端口以供玩家连接。我们需要一个精细的防火墙策略。

# 设置UFW默认策略:拒绝所有入站,允许所有出站

sudo ufw default deny incoming

sudo ufw default allow outgoing

# 允许SSH端口(默认22,建议更改为非标准端口,例如2222)

sudo ufw allow 2222/tcp

# 允许Steam服务器所需的端口(以CS:GO为例)

# 游戏连接端口(UDP)

sudo ufw allow 27015/udp

# Steam客户端查询端口(UDP)

sudo ufw allow 27005/udp

# Source RCON端口(TCP,远程管理用,应严格限制源IP)

sudo ufw allow from [您的管理IP] to any port 27015/tcp

# SteamMasterServer上行端口(UDP)

sudo ufw allow 27020/udp

# 可选的TV端口(UDP,用于GOTV源TV)

sudo ufw allow 27025/udp

# 启用防火墙

sudo ufw --force enable

# 查看防火墙状态

sudo ufw status verbose

 

安全提醒:务必根据您管理的游戏官方文档,确认其所需的精确端口号。RCON端口(TCP)是服务器的“后门”,必须仅对可信的管理IP开放。

1.3 创建专用系统用户

永远不要以root身份运行游戏服务端。创建一个隔离的专用用户是安全最佳实践。

# 创建一个名为`steam`的系统用户,并为其创建家目录

sudo useradd -m -s /bin/bash steam

# 设置密码

sudo passwd steam

# 将用户添加到`sudo`组(仅在初始配置时需要,后续可移除)

sudo usermod -aG sudo steam

# 切换到steam用户

su - steam

 

第二章:SteamCMD的部署与核心机制解析

SteamCMD是Valve提供的命令行工具,用于安装和更新Steam上的专用服务器。

2.1 安装SteamCMD

 

在steam用户的家目录下进行操作:

# 1. 创建安装目录并进入

mkdir ~/steamcmd && cd ~/steamcmd

# 2. 下载SteamCMD Linux版本

wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz

# 3. 解压

tar -xvzf steamcmd_linux.tar.gz

 

2.2 首次运行与匿名登录

 

首次运行SteamCMD,它会自我更新。我们将使用匿名登录来下载服务器文件。

# 运行SteamCMD脚本

./steamcmd.sh

 

在打开的SteamCMD交互式命令行中,执行以下命令:

// 匿名登录(用于下载公开可用的服务器)

login anonymous

// 为CS:GO服务器设置安装目录

force_install_dir /home/steam/csgo_server/

// 下载CS:GO专用服务器应用(appid 740)

app_update 740 validate

// 退出SteamCMD

quit

 

参数详解:

●force_install_dir:指定服务器文件的安装路径。请确保此路径有足够磁盘空间。

●app_update 740 validate:740是CS:GO专用服务器的App ID。validate参数会验证文件的完整性,确保下载无误。

●其他常用游戏App ID:《求生之路2》为 222860,《方舟:生存进化》为 376030等。

2.3 创建自动化更新脚本

手动更新低效且易出错。创建一个Shell脚本来自动化这个过程。

 

在/home/steam/steamcmd/目录下创建文件update_csgo.sh:

 #!/bin/bash

echo "正在更新CS:GO服务器..."

/home/steam/steamcmd/steamcmd.sh +login anonymous +force_install_dir /home/steam/csgo_server/ +app_update 740 validate +quit

echo “更新完成!”

 

 

赋予脚本执行权限:chmod +x update_csgo.sh。此后,只需运行此脚本即可一键更新。

 

第三章:配置与启动游戏服务器

安装文件就绪后,我们需要进行精细化的配置。

3.1 基础服务器配置

进入CS:GO服务器目录:cd /home/steam/csgo_server/csgo/

 

关键的配置文件是cfg/server.cfg。如果不存在,请创建它。以下是一个功能丰富的配置示例:

// 服务器名称

hostname "My Professional CS:GO Server | 128 Tick | FastDL"

// RCON密码(务必修改为强密码!)

rcon_password "YourSuperStrongRCONPassword123!"

// 服务器密码(留空则为公开服务器)

sv_password ""

// 服务器区域(上海为`shanghai`,香港为`hongkong`)

sv_region 4 // 亚洲

// 最大玩家数

maxplayers 10

// 服务器 Tickrate (64 或 128)

sv_tickrate 128

// 每秒最大发包率(应与tickrate匹配)

sv_maxcmdrate 128

sv_maxupdaterate 128

// 启用游戏物理交互

sv_cheats 0

// 开启友军伤害

mp_friendlyfire 1

// 循环经典竞技模式

game_type 0 // 竞技

game_mode 1 // 休闲

// 地图组与起始地图

mapgroup mg_active

map de_dust2

// Steam Workshop 集合ID(用于创意工坊地图)

// host_workshop_collection 1234567890

// 服务器日志

sv_logfile 1

sv_logecho 1

// 允许下载(为自定义模型、地图等)

sv_allowdownload 1

sv_allowupload 1

// 设置FastDL URL(如果您有外部HTTP服务器存放资源)

// sv_downloadurl "http://yourdomain.com/csgo/fastdl"

 

3.2 配置为系统服务(Systemd)

使用screen会话运行服务器是临时的。我们将其配置为系统服务,实现开机自启、崩溃重启和集中日志管理。

 

1、创建启动脚本:在/home/steam/csgo_server/下创建start.sh。

#!/bin/bash

SRCDS_ARG=”+game csgo +ip 0.0.0.0 -port 27015 -tickrate 128 -maxplayers_override 10 +map de_dust2 -console -usercon +game_type 0 +game_mode 1 +sv_setsteamaccount YOUR_STEAM_GSLT_TOKEN”

/home/steam/csgo_server/srcds_run $SRCDS_ARG

 

重中之重:获取并替换 YOUR_STEAM_GSLT_TOKEN。这是一个服务器登录令牌,没有它,您的公共服务器将无法在Steam服务器列表中显示。

●访问:https://steamcommunity.com/dev/managegameservers 

●用您的Steam账户登录。

●选择应用为 730(CS:GO),记住描述,点击“创建”。

●将生成的令牌填入-sv_setsteamaccount参数。

2、创建Systemd服务单元文件

 

以root身份创建/etc/systemd/system/csgo-server.service。

[Unit]

Description=CS:GO Dedicated Server

After=network.target

Wants=network.target

[Service]

Type=simple

User=steam

Group=steam

WorkingDirectory=/home/steam/csgo_server

ExecStart=/bin/bash /home/steam/csgo_server/start.sh

Restart=on-failure

RestartSec=10

StandardOutput=journal

StandardError=journal

# 资源限制(可选,防止服务器失控)

# LimitNOFILE=100000

# LimitNPROC=10000

[Install]

WantedBy=multi-user.target

 

3、启用并启动服务:

sudo systemctl daemon-reload

sudo systemctl enable csgo-server.service

sudo systemctl start csgo-server.service

# 查看状态和日志

sudo systemctl status csgo-server.service

sudo journalctl -u csgo-server.service -f

 

第四章:实现高可用架构

单点服务器存在单点故障风险。“高可用”意味着当主服务器宕机时,备用服务器能近乎无缝地接管。

4.1 架构设计:主从热备模式

我们设计一个包含两台物理服务器的简单主从架构:

●主服务器 (Primary):承载当前游戏会话,处理所有玩家数据。

●从服务器 (Secondary):实时同步主服务器的游戏数据、配置文件。主服务器故障时,通过浮动IP(Virtual IP) 或DNS快速切换,将玩家流量导向从服务器。

核心挑战与解决思路:

1.游戏状态同步:Source引擎本身不支持跨服务器实时状态同步。我们的策略是定期同步持久化数据(地图、配置、管理员列表、积分榜备份),并在故障切换时,可能丢失当前对局的部分进度,但能快速恢复服务。

2.IP切换:使用Keepalived实现浮动IP(VIP),或在云DNS服务商处通过API实现分钟级TTL的DNS记录切换。

 

4.2 数据同步配置 (使用 Rsync over SSH)

在主从服务器之间建立SSH密钥信任,然后配置定时任务同步关键数据。

1.在主服务器生成密钥对(以steam用户):

 

ssh-keygen -t ed25519

2.将公钥复制到从服务器:

ssh-copy-id steam@[从服务器IP]

3.创建同步脚本 (/home/steam/sync_to_backup.sh):

#!/bin/bash

RSYNC_OPTS=”-avz --delete”

SOURCE_DIR=”/home/steam/csgo_server/csgo/”

TARGET_USER=”steam”

TARGET_HOST=”[从服务器IP]”

TARGET_DIR=”/home/steam/csgo_server/csgo/“

# 同步cfg, maps, addons等目录,避免同步临时文件

rsync $RSYNC_OPTS \

  --include='cfg/***' \

  --include='maps/***' \

  --include='addons/***' \

  --include='motd.txt' \

  --exclude='*' \

  $SOURCE_DIR $TARGET_USER@$TARGET_HOST:$TARGET_DIR

# 可选:同步整个目录(首次同步时使用,但后续可能会同步不必要的临时文件)

# rsync $RSYNC_OPTS $SOURCE_DIR $TARGET_USER@$TARGET_HOST:$TARGET_DIR

 

4.设置Cron定时任务:crontab -e,添加一行,例如每5分钟同步一次:

*/5 * * * * /bin/bash /home/steam/sync_to_backup.sh >> /home/steam/sync.log 2>&1

 

4.3 使用Keepalived实现浮动IP (VIP)

这需要在同一局域网内的两台服务器上配置。

1.两台服务器均安装Keepalived:sudo apt install keepalived -y

2.配置主服务器 (/etc/keepalived/keepalived.conf):

vrrp_instance VI_1 {

    state MASTER

    interface eth0 # 替换为您的网卡名 (使用`ip a`命令查看)

    virtual_router_id 51

    priority 100 # 优先级,主服务器更高

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass YourSecurePassword

    }

    virtual_ipaddress {

        192.168.1.100/24 # 虚拟IP地址,需与您服务器在同一子网

    }

    # 可选:添加健康检查脚本,如果游戏服务崩溃,则主动放弃VIP

    track_script {

        chk_srcds

    }

}

# 健康检查脚本定义

vrrp_script chk_srcds {

    script “/usr/bin/pgrep -x srcds_linux”

    interval 2

    weight -50 # 检查失败则权重降低50,可能导致主备切换

    fall 2

    rise 1

}

 

3.配置从服务器:配置文件与主服务器类似,只需修改state为BACKUP,priority设置为较低值(如90)。

4.启动服务:sudo systemctl enable --now keepalived

工作流程:正常情况下,VIP绑定在主服务器。玩家连接192.168.1.100:27015。当主服务器的Keepalived进程或游戏服务本身(通过健康检查判断)宕机,从服务器检测到主服务器失效,会立即接管该VIP,玩家流量随即转向从服务器。从服务器上运行着相同的游戏服务(使用同步过来的数据),服务得以恢复。

 

4.4 故障切换后的处理

切换发生后,并非万事大吉:

1.从服务器启动服务:确保从服务器的systemd服务是启用并就绪的。可以在从服务器的启动脚本中加入判断,如果检测到自己持有VIP,则自动启动游戏服务器。

2.数据流向反转:此时原来的从服务器变为主服务器。需要重新配置数据同步的方向,或者设计双向同步策略,这需要更复杂的脚本控制。

3.告警通知:切换事件必须触发告警(如通过邮件、Slack、Telegram机器人),通知管理员进行干预和排查原主服务器故障。

 

第五章:监控、维护与优化

5.1 监控体系建立

1.基础资源监控:使用htop、iftop、iotop进行实时查看。生产环境推荐部署Prometheus + Grafana,采集CPU、内存、磁盘IO、网络带宽、连接数等指标。

2.游戏服务器特定监控:

a.日志监控:使用tail -f或journalctl跟踪csgo-server服务的日志,实时查看玩家连接、游戏事件。

b.RCON查询:可以通过Python脚本定期使用RCON协议连接服务器,执行status、stats等命令,解析输出以获取在线玩家数、当前地图、服务器FPS等关键指标。

c.Steam Server Query:使用A2S协议(Source Query)从外部查询服务器状态,模拟玩家视角。

 

5.2 定期维护任务

1.日志轮转:配置logrotate,防止游戏日志撑满磁盘。创建/etc/logrotate.d/csgo-server:

/home/steam/csgo_server/csgo/*.log {

    daily

    missingok

    rotate 14

    compress

    delaycompress

    notifempty

    create 644 steam steam

    sharedscripts

    postrotate

        sudo systemctl kill -s USR1 csgo-server.service 2>/dev/null || true

    endscript

}

 

2.备份策略:除了向从服务器同步,还应定期将整个服务器目录(或关键配置、地图、插件)备份到独立的存储或对象存储中。使用tar和cron即可实现。

 

5.3 性能调优提示

1.内核参数调优:编辑/etc/sysctl.conf,优化网络性能。

# 增加最大连接数相关参数

net.core.somaxconn = 65535

net.ipv4.tcp_max_syn_backlog = 65535

# 减少TCP连接失效等待时间,加速回收

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_tw_reuse = 1

# 提高网络缓冲区大小

net.core.rmem_max = 134217728

net.core.wmem_max = 134217728

 

2.执行sudo sysctl -p生效。

3.游戏服务器参数:仔细研究您所运行游戏的专用服务器参数。例如,对于CS:GO,-threads参数可以指定使用的CPU核心数,-high和-nodns等启动项也可能带来性能提升。

结语

通过以上五个章节,我们完成了一次从裸机到高可用Steam游戏服务端的深度部署之旅。这个过程涉及系统安全、网络配置、服务管理、数据同步、集群高可用和监控运维等多个领域。

手动部署的魅力在于极致的透明度和控制力。您清楚地知道每一个进程的作用,每一个配置文件的意义,能够在出现问题时进行精准的底层排查。虽然初期投入的学习和配置时间较多,但换来的是一套可根据业务需求灵活调整、性能潜力得到充分挖掘、且完全受您掌控的坚实基础设施。

请记住,运维是一个持续的过程。本文提供的配置是一个强大的起点,但您需要根据实际运行情况、游戏特性、玩家规模进行不断的观察、测试和优化。祝您部署顺利,服务器稳定运行!

目录结构
全文
"