Ubuntu 20.04 LTS服务器部署Skynet:从源码编译到服务启动全流程

张开发
2026/4/17 21:07:30 15 分钟阅读

分享文章

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 --depth1 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) \ CCgcc 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.confthread 8 logger logs/skynet.log logservice logger start main -- 初始启动服务启动服务时推荐使用nohup配合日志重定向nohup ./skynet config/test.conf logs/console.log 21 验证服务状态可以通过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,cmd7. 生产环境部署建议在实际项目中我通常会采用以下部署方案使用systemd管理服务进程配置日志轮转(logrotate)设置crontab定时任务进行健康检查示例systemd服务单元文件(/etc/systemd/system/skynet.service):[Unit] DescriptionSkynet Game Server Afternetwork.target [Service] Typesimple Userskynet_deploy WorkingDirectory/opt/skynet ExecStart/opt/skynet/skynet /opt/skynet/config/prod.conf Restartalways RestartSec5 [Install] WantedBymulti-user.target日志轮转配置(/etc/logrotate.d/skynet):/opt/skynet/logs/*.log { daily missingok rotate 30 compress delaycompress notifempty sharedscripts postrotate systemctl reload skynet /dev/null 21 || true endscript }记得在完成部署后测试服务的高可用性systemctl start skynet systemctl enable skynet journalctl -u skynet -f # 实时查看日志

更多文章