从零搭建:Steam 服务端高可用手动部署 - CSGO 篇
从零到一:在服务器上手动部署与配置高可用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游戏服务端的深度部署之旅。这个过程涉及系统安全、网络配置、服务管理、数据同步、集群高可用和监控运维等多个领域。
手动部署的魅力在于极致的透明度和控制力。您清楚地知道每一个进程的作用,每一个配置文件的意义,能够在出现问题时进行精准的底层排查。虽然初期投入的学习和配置时间较多,但换来的是一套可根据业务需求灵活调整、性能潜力得到充分挖掘、且完全受您掌控的坚实基础设施。
请记住,运维是一个持续的过程。本文提供的配置是一个强大的起点,但您需要根据实际运行情况、游戏特性、玩家规模进行不断的观察、测试和优化。祝您部署顺利,服务器稳定运行!