Ubuntu 20.04 LTS服务器部署Skynet:从源码编译到服务启动全流程
1. 环境准备与系统优化
在Ubuntu 20.04 LTS上部署Skynet服务端,首先要确保系统环境干净且高效。我建议使用全新的服务器镜像开始操作,避免残留软件包冲突。实测发现,使用阿里云镜像源能显著提升软件下载速度,特别是对于需要大量依赖的编译场景。
修改软件源的操作其实有更安全的方式:先使用lsb_release -cs命令确认系统代号(20.04对应focal),再生成新的sources.list文件。这是我常用的自动化脚本:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo bash -c 'cat > /etc/apt/sources.list <<EOF deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse EOF' sudo apt update对于权限管理,我强烈建议不要直接使用root账户。更好的做法是创建专用部署用户并配置sudo权限:
sudo adduser skynet_deploy sudo usermod -aG sudo skynet_deploy2. 依赖管理与编译工具链配置
Skynet对GCC和Lua版本有明确要求,这在Ubuntu 20.04上需要特别注意。默认的GCC 9.x虽然版本足够,但实测发现某些优化参数需要调整。这是我验证过的完整依赖安装方案:
sudo apt install -y git make autoconf libreadline-dev \ gcc-9 g++-9 build-essential libssl-dev \ zlib1g-dev libncurses5-dev libffi-dev考虑到后续可能的多版本需求,建议配置GCC alternatives系统:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 \ --slave /usr/bin/g++ g++ /usr/bin/g++-9对于Lua的安装,官方推荐的5.3.5版本可以通过源码编译获得最佳性能。这里有个小技巧:先安装readline开发库能获得更好的交互体验:
wget http://www.lua.org/ftp/lua-5.3.5.tar.gz tar -zxf lua-5.3.5.tar.gz cd lua-5.3.5 sed -i 's/TO_LIB= liblua.a/TO_LIB= liblua.a liblua.so/' Makefile make linux MYCFLAGS="-fPIC" MYLIBS="-lreadline" sudo make install3. 源码获取与预处理
获取Skynet源码时,推荐使用深度克隆(deep clone)确保获取所有子模块。对于国内用户,可以尝试使用镜像源加速:
git clone --depth=1 https://github.com/cloudwu/skynet.git cd skynet内存管理组件jemalloc的集成有更高效的方式。与其完整克隆jemalloc仓库,不如直接下载稳定版压缩包:
wget https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2 tar -xjf jemalloc-5.2.1.tar.bz2 mv jemalloc-5.2.1 3rd/jemalloc有个容易忽略的细节:检查skynet/Makefile中的PLAT变量是否正确识别了你的系统。对于Ubuntu 20.04,应该显示为"linux"。
4. 编译优化与参数调整
执行编译前,建议先清理可能存在的中间文件:
make clean正式编译时,可以通过环境变量传递优化参数。这是我经过多次测试验证的高效编译方案:
make linux -j$(nproc) \ CC=gcc CFLAGS="-O2 -fPIC -Wall" \ LDFLAGS="-Wl,-rpath=/usr/local/lib"编译完成后,建议进行基础验证:
ldd skynet # 检查动态库链接 ./skynet -v # 查看版本信息对于生产环境,你可能需要调整jemalloc的配置。编辑skynet-src/skynet_malloc.h文件,找到JEMALLOC_STATIC宏定义,根据实际情况选择使用静态或动态链接。
5. 服务配置与启动验证
基础配置文件通常放在examples/config中,但生产环境建议创建独立配置目录。这是我的典型配置结构:
/skynet/ ├── config/ │ ├── game.conf │ └── system.conf ├── logs/ └── service/一个最小化的启动配置示例(config/test.conf):
thread = 8 logger = "logs/skynet.log" logservice = "logger" start = "main" -- 初始启动服务启动服务时,推荐使用nohup配合日志重定向:
nohup ./skynet config/test.conf > logs/console.log 2>&1 &验证服务状态可以通过netstat检查端口,或使用Skynet自带的telnet调试接口:
telnet 127.0.0.1 8000 # 默认调试端口6. 常见问题排查指南
遇到编译错误时,首先检查gcc和lua版本:
gcc --version lua -v内存相关问题通常与jemalloc有关,可以通过以下命令验证:
LD_PRELOAD=/usr/local/lib/libjemalloc.so ./skynet如果遇到lua库找不到的问题,需要确认库路径是否正确:
sudo ldconfig echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/lua.conf对于性能调优,建议监控Skynet运行时指标:
watch -n 1 "ps -p $(pgrep skynet) -o %cpu,%mem,cmd"7. 生产环境部署建议
在实际项目中,我通常会采用以下部署方案:
- 使用systemd管理服务进程
- 配置日志轮转(logrotate)
- 设置crontab定时任务进行健康检查
示例systemd服务单元文件(/etc/systemd/system/skynet.service):
[Unit] Description=Skynet Game Server After=network.target [Service] Type=simple User=skynet_deploy WorkingDirectory=/opt/skynet ExecStart=/opt/skynet/skynet /opt/skynet/config/prod.conf Restart=always RestartSec=5 [Install] WantedBy=multi-user.target日志轮转配置(/etc/logrotate.d/skynet):
/opt/skynet/logs/*.log { daily missingok rotate 30 compress delaycompress notifempty sharedscripts postrotate systemctl reload skynet >/dev/null 2>&1 || true endscript }记得在完成部署后测试服务的高可用性:
systemctl start skynet systemctl enable skynet journalctl -u skynet -f # 实时查看日志