OpenResty 实时对战游戏服务器部署文档
幸运武侠 - 塔防游戏服务器部署指南
基于 OpenResty 的高性能实时对战服务器
⚡⚡⚡ 快速导航:本部署文档仅支持 Linux 操作系统(推荐 Ubuntu)。请从第 2 章节开始按照本文档操作。
📋 OpenResty 快速部署清单
按照以下步骤完成部署,勾选已完成的项目:
1. 基础环境安装
- 安装宝塔面板
- 安装 Nginx OpenResty 1.25.3.2/1.27.1.2
- 安装 Redis 7.4.3
- 安装 Node.js v16.x(用于机器人服务)
2. 项目部署
- 上传项目代码到 /home/TowerDefense_Server/
- 配置 SSL 证书(生产环境)或使用 HTTP(开发环境)
- 修改配置文件中的域名:
- 编辑 conf/nginxGame.conf(生产)或 nginxGameDev.conf(开发)
- 第 166 行:修改 DOMAIN = 'yourdomain.com'
- 第 170 行:设置 RELEASE = true(生产)或 false(开发)
- 运行一键安装脚本:sudo ./main_openresty/install_dependencies.sh
3. 启动服务
4. 验证和优化
- 验证服务运行:ps aux | grep nginx 和 ps aux | grep "node dist/scripts"
- 开放防火墙端口:7443, 7444, 6379
- 配置备份策略(可选)
- 配置监控报警(可选)
📋📋 目录
1. 系统环境要求
1.1 支持的操作系统
Linux 系统
推荐版本:
- Debian 12 或 Ubuntu 22.04 或 Ubuntu 24.04
- OpenCloud-9 (腾讯云)
- Alibaba-Cloud-3 (阿里云)
兼容版本:
- Debian 10+
- Ubuntu 18.04+
- CentOS 9
- 统信 UOS 20
- 麒麟 V10SP3
1.2 服务器配置要求
最低配置:
- CPU: 2 核心
- 内存: 2GB
- 硬盘: 40GB
- 网络: 3Mbps
推荐配置(生产环境):
- CPU: 4+ 核心
- 内存: 8GB+
- 硬盘: 100GB SSD
- 网络: 10Mbps+
1.3 必要的系统权限
# 使用 root 权限登录服务器
sudo su root2. 安装宝塔面板
2.1 安装宝塔面板
请访问宝塔官方网站查看详细的安装指南:
根据您的操作系统(Linux/Windows),按照宝塔官方文档完成面板的安装和初始化配置。
2.2 安全组端口开放
在宝塔面板或云服务器控制台,确保以下端口已开放:
| 端口 | 协议 | 说明 |
|---|
| 8888 | TCP | 宝塔面板端口 |
| 7443 | TCP | HTTPS API 接口 |
| 7444 | TCP | WSS WebSocket 连接 |
| 6379 | TCP | Redis 数据库(注意配置远程访问的安全机制) |
| 22 | TCP | SSH 远程连接 |
| 80 | TCP | HTTP(如需要) |
| 443 | TCP | HTTPS(如需要) |
3. 安装必要组件
3.1 安装 Nginx OpenResty
- 进入宝塔面板
- 点击左侧菜单 "软件商店"
- 搜索 "nginx" 或 "openresty"
- 找到 "Nginx (OpenResty) 1.25.3.2/1.27.1.2"
- 点击 "安装"
- 安装完成后点击 "设置"
- 确认 OpenResty 版本为 1.25.3.2/1.27.1.2 或以上
3.2 安装 Redis
- 在宝塔软件商店搜索 "Redis"
- 找到 "Redis 7.4.3"
- 点击 "安装"
- 安装完成后点击 "设置"
- 确认 Redis 服务运行状态为 "运行中"
3.3 验证安装
# 检查 OpenResty 版本
/www/server/nginx/bin/openresty -V
# 应输出类似:
# nginx version: openresty/1.27.1.2
# built by gcc 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
# built with OpenSSL 1.1.1w 11 Sep 2023
# TLS SNI support enabled
# configure arguments: ...
# 检查 Redis 是否运行
redis-cli ping
# 应输出: PONGOpenResty 1.27.1.2 特性
OpenResty 1.27.1.2 版本包含以下重要特性:
- LuaJIT 2.1 - 高性能 Lua 解释器
- ngx_lua 0.10.28 - Lua 模块版本
- OpenSSL 1.1.1w - SSL/TLS 支持
- HTTP/2 和 HTTP/3 - 支持最新 HTTP 协议
- Stream Lua - 支持 TCP/UDP 代理
- Redis 模块 - 原生 Redis 客户端支持
宝塔编译的 OpenResty 包含以下模块:
- ngx_devel_kit - 开发工具包
- echo-nginx-module - 回显模块
- xss-nginx-module - XSS 防护模块
- set-misc-nginx-module - Set 模块扩展
- encrypted-session-nginx-module - 加密会话模块
- srcache-nginx-module - 缓存模块
- headers-more-nginx-module - 增强的头模块
- array-var-nginx-module - 数组变量模块
- memc-nginx-module - Memcached 模块
- redis2-nginx-module - Redis 客户端
- redis-nginx-module - Redis 客户端(旧版)
- ngx_stream_lua - Stream Lua 模块
- rds-json-nginx-module - JSON 响应模块
- rds-csv-nginx-module - CSV 响应模块
- ngx_cache_purge - 缓存清理
- nginx-sticky-module-ng - 会话保持模块
- image_filter - 图片过滤模块
4. 项目代码部署
4.1 上传项目代码
将项目代码文件拖拽上传到宝塔 "文件" 中:
# 创建项目目录
mkdir -p /home/TowerDefense_Server
cd /home/TowerDefense_Server
# 如果使用 Git,克隆项目
git clone <your-repository-url> .
# 或使用 FTP/SFTP 上传项目文件
4.2 设置目录权限
# 设置项目目录所有权为 www 用户
chown -R www:www /home/TowerDefense_Server
# 设置执行权限
chmod +x /home/TowerDefense_Server/main_openresty/reloadGame.sh
chmod +x /home/TowerDefense_Server/main_openresty/reloadGameDev.sh
4.3 检查项目目录结构
确认以下目录和文件存在:
/home/TowerDefense_Server/
└── main_openresty/
├── apis/ # API 接口
├── battle/ # 战斗系统
├── conf/ # 配置文件
├── handler/ # 业务处理
├── libs/ # 库文件
├── logic/ # 业务逻辑
├── logs/ # 日志目录
├── ops/ # 运维脚本
├── reloadGame.sh # 生产环境重启脚本
└── reloadGameDev.sh # 开发环境重启脚本
5. SSL 证书配置
根据您的需求选择以下三种方式之一:
方式一:宝塔面板自动申请 Let's Encrypt 免费证书 ⭐ 推荐
步骤 1:添加网站
- 进入宝塔面板 → "网站" → "添加站点"
- 填写以下信息:
- 域名: yourdomain.com(填写您的实际域名)
- 备注: 游戏服务器
- FTP: 不创建
- 数据库: 不创建
- 点击 "提交"
步骤 2:申请 SSL 证书
- 在网站列表中,点击您刚添加的网站右侧的 "设置"
- 切换到 "SSL" 标签
- 选择 "Let's Encrypt"
- 勾选 "强制 HTTPS"(生产环境推荐)
- 点击 "申请" 或 "续签"
- 等待证书申请完成(约 1-2 分钟)
步骤 3:配置证书路径
证书安装完成后,宝塔会在以下路径创建证书:
/www/server/panel/vhost/cert/yourdomain.com/yourdomain.com.pem
/www/server/panel/vhost/cert/yourdomain.com/yourdomain.com.key
步骤 4:修改游戏服务器配置
编辑 /home/TowerDefense_Server/main_openresty/conf/nginxGame.conf:
-- 第 187-188 行,修改为您的域名
ssl_certificate /www/server/panel/vhost/cert/yourdomain.com/yourdomain.com.pem;
ssl_certificate_key /www/server/panel/vhost/cert/yourdomain.com/yourdomain.com.key;
自动续期配置
宝塔可以设置计划任务:自动处理 Let's Encrypt 证书续期,证书有效期为 90 天,每 5 天自动检查续期。
方式二:手动上传自有证书
步骤 1:准备证书文件
您需要准备两个文件:
- yourdomain.com.pem - 证书文件
- yourdomain.com.key - 私钥文件
步骤 2:上传证书
# 创建证书目录
mkdir -p /www/server/panel/vhost/cert/yourdomain.com
# 上传证书文件到此目录
# yourdomain.com.pem
# yourdomain.com.key
步骤 3:配置证书路径
编辑 /home/TowerDefense_Server/main_openresty/conf/nginxGame.conf:
-- 第 187-188 行
ssl_certificate /www/server/panel/vhost/cert/yourdomain.com/yourdomain.com.pem;
ssl_certificate_key /www/server/panel/vhost/cert/yourdomain.com/yourdomain.com.key;
方式三:开发环境使用 HTTP ⚠️ 仅开发环境
如果您不想配置 SSL(仅用于开发测试),可以修改配置为 HTTP:
修改开发环境配置
编辑 /home/TowerDefense_Server/main_openresty/conf/nginxGameDev.conf:
# 第 202 行,修改前
listen 7443 ssl;
# 修改后
listen 7443;
# 第 233 行,修改前
listen 7444 ssl reuseport;
# 修改后
listen 7444 reuseport;
注释掉 SSL 相关配置
在 nginxGameDev.conf 中注释掉以下部分(约第 186-196 行):
# SSL 证书配置 - 开发环境不需要
# ssl_certificate /www/server/panel/vhost/cert/yourdomain.com/yourdomain.com.pem;
# ssl_certificate_key /www/server/panel/vhost/cert/yourdomain.com/yourdomain.com.key;
# ... 其他 SSL 配置 ...
修改访问地址
-- 第 166-168 行,在 init_by_lua_block 中
DOMAIN = 'your-server-ip' -- 或您的域名
PORT = 7444
HOST = DOMAIN .. ':' .. PORT .. '/lua/web_socket'
-- 第 170 行
RELEASE = false -- 开发环境设为 false
6. 配置游戏服务器
6.1 修改服务器配置
编辑配置文件(生产环境用 nginxGame.conf,开发环境用 nginxGameDev.conf):
cd /home/TowerDefense_Server/main_openresty
vi conf/nginxGame.conf # 或 nginxGameDev.conf
修改域名配置(第 166 行)
-- init_by_lua_block 中
DOMAIN = 'yourdomain.com' -- 改为您的域名或服务器 IP
修改端口配置(第 167 行)
PORT = 7444 -- WebSocket 端口
修改服务器地址(第 168 行)
HOST = DOMAIN .. ':' .. PORT .. '/lua/web_socket'
修改环境模式(第 170 行)
RELEASE = true -- 生产环境设为 true
RELEASE = false -- 开发环境设为 false
配置微信(可选,第 172-174 行)
-- 微信小程序配置
APPID = "your-appid"
SECRET = "your-secret"
配置 Lua 包路径(第 161 行)⚠️ 重要
必须使用绝对路径!
在宝塔环境中,nginx 启动时使用 -p 选项指定项目前缀,而配置文件中的相对路径可能无法正常工作。因此,所有路径都必须使用绝对路径。
检查并确认 lua_package_path 是否包含正确的项目路径:
lua_package_path "/usr/local/share/lua/5.1/?.lua;
/usr/local/share/lua/5.1/resty/?.lua;
/usr/local/openresty/site/lualib/?.lua;
/home/TowerDefense_Server/main_openresty/libs/?.lua;
/home/TowerDefense_Server/main_openresty/libs/resty/mail/?.lua;
/home/TowerDefense_Server/main_openresty/libs/resty/?.lua;
/home/TowerDefense_Server/main_openresty/apis/?.lua;
/home/TowerDefense_Server/main_openresty/handler/?.lua;
/home/TowerDefense_Server/main_openresty/battle/?.lua;
/home/TowerDefense_Server/main_openresty/logic/?.lua;
/home/TowerDefense_Server/main_openresty/conf/?.lua;
/home/TowerDefense_Server/main_openresty/apis/?.lua;;";
说明:
- 所有路径必须是完整绝对路径,不能使用相对路径
- 路径分隔符使用 /
- 最后一个路径后面有两个分号 ;; 表示结束
- 如果您将项目部署到其他目录,请修改所有相关路径
🔍 配置文件检查清单
修改配置后,请检查以下内容:
# 检查 nginx 配置是否正确
cd /home/TowerDefense_Server/main_openresty
nginx -t -c conf/nginxGame.conf # 生产环境
# 或
nginx -t -c conf/nginxGameDev.conf # 开发环境
# 应输出:syntax is ok 和 test is successful
关键检查项
- DOMAIN 变量已修改为您的域名或 IP
- RELEASE 变量设置正确(true/false)
- SSL 证书路径正确(生产环境)
- lua_package_path 包含所有必要的路径
- 所有路径都是绝对路径
6.2 locationHTTP.conf 配置说明
该文件包含了所有 HTTP API 接口的路由配置,无需修改,已包含:
- 登录相关接口
- 用户相关接口
- 好友相关接口
- 战斗相关接口
- 商店相关接口
- 邮件相关接口
- 等等...
7. 安装 Lua 依赖库
OpenResty 的 Lua 依赖需要同时使用两种包管理器:
- OPM(OpenResty Package Manager) - 用于安装 OpenResty 专用库
- LuaRocks - 用于安装通用 Lua 库
| 特性 | OPM | LuaRocks |
|---|
| 官方支持 | ✅ OpenResty 官方 | ❌ 第三方 |
| 安装简单 | ✅ 更简单 | ⚠️ 需要配置 |
| 库数量 | ⚠️ 较少 | ✅ 很丰富 |
| 用途 | OpenResty 专用库 | 通用 Lua 库 |
说明:项目需要同时使用两种包管理器安装不同类别的依赖库。
快速安装(推荐)
项目提供了一个一键安装脚本,可以自动安装所有依赖:
# 进入项目目录
cd /home/TowerDefense_Server/main_openresty
# 运行安装脚本
sudo ./install_dependencies.sh
该脚本会自动完成以下操作:
- 安装系统依赖(curl, wget, gnupg, ca-certificates, luarocks)
- 安装 OPM(OpenResty Package Manager)
- 配置 LuaRocks
- 使用 OPM 安装 OpenResty 专用库(4个库)
- 使用 LuaRocks 安装通用 Lua 库(7个库)
- 验证安装结果
手动安装:如果您需要手动安装,请继续阅读下面的详细步骤。
7.1 安装 OPM(推荐)
OPM 是 OpenResty 官方提供的包管理器,使用更简单。
步骤 1:安装依赖
# 安装依赖(确保 curl 和 gnupg 已安装)
sudo apt update
sudo apt install -y curl wget gnupg ca-certificates
步骤 2:添加 OpenResty 仓库
# 导入 OpenResty GPG 密钥
curl -fsSL https://openresty.org/package/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/openresty.gpg
wget -O - https://openresty.org/package/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/openresty.gpg
# 添加 OpenResty APT 仓库
# Ubuntu 24.04
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/openresty.gpg] http://openresty.org/package/ubuntu noble main" | sudo tee /etc/apt/sources.list.d/openresty.list > /dev/null
# Ubuntu 22.04 或其他版本
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/openresty.gpg] https://openresty.org/package/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/openresty.list
# 更新软件包索引
sudo apt update
步骤 3:安装 OPM
# 安装 openresty-opm
sudo apt install -y openresty-opm
步骤 4:使用 OPM 搜索和安装库
# 搜索可用的库
sudo opm search http
sudo opm search jwt
sudo opm search logger
# 安装特定的库
sudo opm get xiedacon/lua-resty-logger
sudo opm get xiedacon/lua-utility
sudo opm get xiedacon/lua-fs-module
sudo opm get xiedacon/lua-resty-config
# 查看已安装的库
opm list
7.2 安装 LuaRocks
LuaRocks 用于安装通用 Lua 库,这些库在 OPM 中可能不可用。
安装 LuaRocks
# Ubuntu/Debian
sudo apt-get install -y luarocks
# CentOS
sudo yum install -y luarocks
配置 LuaRocks
# 查找 LuaJIT 路径
which luajit
# 通常输出: /usr/local/openresty/luajit/bin/luajit
# 配置 LuaRocks 使用正确的 LuaJIT
luarocks config lua_interpreter /usr/local/openresty/luajit/bin/luajit
luarocks config lua_version 5.1
7.3 安装项目所需的库
项目需要分别使用 OPM 和 LuaRocks 安装不同的库:
使用 OPM 安装的库
# 安装 OpenResty 专用库(使用 OPM)
sudo opm get xiedacon/lua-resty-logger
sudo opm get xiedacon/lua-utility
sudo opm get xiedacon/lua-fs-module
sudo opm get xiedacon/lua-resty-config
# 查看已安装的 OPM 库
opm list
使用 LuaRocks 安装的库
使用 LuaRocks 安装通用 Lua 库:
# 安装 lua-resty-http(HTTP 客户端库)
sudo luarocks install lua-resty-http
# 安装 lua-resty-jwt(JWT 认证库)
sudo luarocks install lua-resty-jwt
# 安装 lua-resty-openssl(OpenSSL 绑定库)
sudo luarocks install lua-resty-openssl
# 安装 luautf8(UTF-8 字符串处理库)
sudo luarocks install luautf8
# 安装 lua-resty-validation(参数验证库)
sudo luarocks install lua-resty-validation
# 安装 lua-resty-reqargs(请求参数解析库)
sudo luarocks install lua-resty-reqargs
# 安装 luasocket(Socket 库,某些依赖需要)
sudo luarocks install luasocket
7.4 验证安装
# 验证 OPM 安装的库
opm list
# 应该看到通过 OPM 安装的库:
# xiedacon/lua-resty-logger
# xiedacon/lua-utility
# xiedacon/lua-fs-module
# xiedacon/lua-resty-config
# 验证 LuaRocks 安装的库
luarocks list
# 应该看到通过 LuaRocks 安装的库:
# lua-resty-http (版本 0.17.2-0)
# lua-resty-jwt (版本 0.2.3-0)
# lua-resty-openssl (版本 1.6.1-1)
# lua-resty-validation (版本 2.7-1)
# lua-resty-reqargs (版本 1.4-1)
# luasocket (版本 3.1.0-1)
# luautf8 (版本 0.1.6-1)
注意:不同版本的依赖库可能会有所不同,请根据实际输出来确认。确保 OPM 和 LuaRocks 的库都已正确安装。
8. 启动游戏服务
8.1 开发环境启动
# 进入项目目录
cd /home/TowerDefense_Server/main_openresty
# 确保脚本有执行权限
chmod +x reloadGameDev.sh
# 执行重启脚本
./reloadGameDev.sh
8.2 生产环境启动
# 进入项目目录
cd /home/TowerDefense_Server/main_openresty
# 确保脚本有执行权限
chmod +x reloadGame.sh
# 执行重启脚本
./reloadGame.sh
8.3 启动脚本功能说明
脚本会执行以下操作:
- 停止旧的 Nginx 进程
- 清理 Redis 消息队列
- 备份日志文件
- 将所有日志文件备份到 logs/{logtype}/ 目录
- 文件名包含时间戳
- 检查 Nginx 配置
- 启动 Nginx
- 启动机器人服务(开发环境)
8.4 确认服务启动成功
# 检查 Nginx 进程
ps aux | grep nginx
# 检查 Redis 连接
redis-cli ping
# 检查机器人进程(开发环境)
ps aux | grep "node dist/scripts/index.js"
# 查看最近日志
tail -f /home/TowerDefense_Server/main_openresty/logs/nginx_debug.log
9. 配置机器人服务
9.1 安装 Node.js
方式一:在宝塔面板安装 Node.js 项目管理器(推荐)
- 进入宝塔面板 → "网站" → "Node项目"
- 点击 "添加 Node 项目"
- 填写项目信息:
- 项目名称: robots
- 项目路径: /home/TowerDefense_Server/main_openresty/ops/robots_nodejs
- 启动文件: dist/scripts/index.js(编译后的文件)
- Node 版本: 16(支持 v16.19.0, v16.20.2 或 v22.18.0)
- 启动模式: npm start(自动从 package.json 获取)
- 包管理器: npm
- 运行用户: root(⚠️ 统一使用 root 用户,避免启动多个服务)
- 点击 "提交"
重要说明:
由于宝塔启动 Node.js 的用户和项目脚本启动的用户不同,如果使用其他用户(如 www),重启机器人服务时会启动两个不同的服务实例,导致资源浪费和潜在冲突。因此,机器人服务需要统一设置为 root 用户启动。
方式二:手动安装
# 使用 NodeSource 安装
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs
# 验证安装
node -v # 应输出 v16.x.x
npm -v # 应输出 8.x.x
9.2 配置机器人项目
项目目录结构
项目位于:/home/TowerDefense_Server/main_openresty/ops/robots_nodejs
# 进入机器人项目目录
cd /home/TowerDefense_Server/main_openresty/ops/robots_nodejs
# 查看目录结构
ls -la
安装依赖
# 安装项目依赖
npm install
# 验证 package.json
cat package.json
启动配置
启动选项会自动从 package.json 文件中获取:
{
"scripts": {
"start": "rimraf dist && tsc && node dist/scripts/index.js"
}
}
说明:
- rimraf dist - 清理旧的编译文件
- tsc - 编译 TypeScript 到 JavaScript
- node dist/scripts/index.js - 运行编译后的代码
9.3 配置启动环境
机器人服务在 reloadGameDev.sh 中已配置自动启动。如果需要手动配置,可以参考:
编辑 /home/TowerDefense_Server/main_openresty/ops/robots_nodejs/scripts/index.ts:
// 开发环境配置
if (args.includes('dev')) {
selfGlobal.isDev = true;
endIdx = 10;
logger.setLogFile('robot.log');
netCfg.wsUrl = 'wss://yourdomain.com:7444/lua/web_socket';
netCfg.httpUrl = 'https://yourdomain.com:7443';
} else {
// 生产环境配置
selfGlobal.isDev = false;
netCfg.wsUrl = 'wss://yourdomain.com:7444/lua/web_socket';
netCfg.httpUrl = 'https://yourdomain.com:7443';
}
9.4 独立部署机器人(推荐使用内网IP)
如果需要将机器人部署到独立的服务器:
步骤 1:克隆项目到新服务器
# 在新服务器上
mkdir -p /home/robot-server
cd /home/robot-server
# 克隆或上传项目代码
步骤 2:修改配置
编辑 scripts/index.ts,修改服务器地址:
// 修改目标服务器地址
netCfg.wsUrl = 'wss://game-server-domain.com:7444/lua/web_socket';
netCfg.httpUrl = 'https://game-server-domain.com:7443';
步骤 3:启动机器人服务
# 安装依赖
npm install
# 编译并启动
npm start
# 或使用 PM2 管理
pm2 start dist/scripts/index.js --name robot-server
pm2 save
10. 服务验证和测试
10.1 检查服务状态
# 检查 Nginx/OpenResty 进程
ps aux | grep nginx | grep -v grep
# 检查 Redis 是否运行
redis-cli ping
# 应输出: PONG
# 检查机器人进程(开发环境)
ps aux | grep "node dist/scripts/index.js" | grep -v grep
# 检查端口监听
netstat -tlnp | grep -E '7443|7444|6379'
10.2 测试 HTTP API 接口
推荐使用 APIPOST 测试:
使用 curl 测试:
# 测试登录接口
curl -X POST https://yourdomain.com:7443/login \
-H "Content-Type: application/json" \
-d '{"openid":"test123","nickname":"测试","avatar":"","password":"","isRobot":false}'
10.3 测试 WebSocket 连接
连接地址:
wss://yourdomain.com:7444/lua/web_socket
10.4 查看日志
查看实时日志:
# HTTP API 日志
tail -f /home/TowerDefense_Server/main_openresty/logs/access_https.log
# WebSocket 日志
tail -f /home/TowerDefense_Server/main_openresty/logs/access_wss.log
# 调试日志
tail -f /home/TowerDefense_Server/main_openresty/logs/debug_https.log
# Nginx 错误日志
tail -f /home/TowerDefense_Server/main_openresty/logs/nginx_error.log
10.5 日志文件说明
| 日志文件 | 说明 |
|---|
| access_https.log | HTTP API 访问日志 |
| access_wss.log | WebSocket 访问日志 |
| debug_https.log | HTTP 调试日志 |
| debug_wss.log | WebSocket 调试日志 |
| nginx_debug.log | Nginx 调试日志 |
| nginx_error.log | Nginx 错误日志 |
| rooms/ | 房间日志(按日期分目录) |
11. 常见问题排查
11.1 服务无法访问
症状
- 无法访问 https://yourdomain.com:7443
- 浏览器提示连接失败
排查步骤
- 检查防火墙# 检查端口是否开放
sudo ufw status
# 或
sudo firewall-cmd --list-all
- 检查 Nginx 进程ps aux | grep nginx
# 如果没有进程,需要启动服务
- 检查 Nginx 配置cd /home/TowerDefense_Server/main_openresty
nginx -t -c conf/nginxGame.conf
- 检查错误日志tail -50 logs/nginx_error.log
- 检查安全组(云服务器)
- 阿里云:安全组 → 入方向规则
- 腾讯云:安全组 → 入站规则
11.2 Redis 连接失败
症状
- 游戏日志显示 Redis 连接失败
- 错误信息:Connection refused
排查步骤
- 检查 Redis 服务状态# 宝塔面板检查
# 或命令行检查
systemctl status redis
redis-cli ping
- 检查 Redis 端口netstat -tlnp | grep 6379
- 检查 Redis 配置# 查看 Redis 配置文件
cat /etc/redis/redis.conf | grep -E 'bind|port|protected-mode'
- 重启 Redis# 宝塔面板操作
# 或命令行操作
sudo systemctl restart redis
11.3 Lua 模块加载失败
症状
- Nginx 错误日志显示:failed to require "xxx"
- 错误信息:module 'xxx' not found
- 错误信息:lua entry thread aborted: runtime error
排查步骤
- 检查 lua_package_path 配置 ⚠️ 最关键# 编辑配置文件
vi /home/TowerDefense_Server/main_openresty/conf/nginxGame.conf
# 确认第 161 行的路径包含所有必要路径,且使用绝对路径
重要说明:路径必须是绝对路径,不能使用相对路径或 $prefix 变量。宝塔的 nginx 启动时使用 -p 选项,相对路径无法正确解析。
- 验证路径是否正确# 检查所有路径是否都存在
ls -la /home/TowerDefense_Server/main_openresty/libs/
ls -la /home/TowerDefense_Server/main_openresty/apis/
ls -la /home/TowerDefense_Server/main_openresty/handler/
ls -la /home/TowerDefense_Server/main_openresty/battle/
ls -la /home/TowerDefense_Server/main_openresty/logic/
ls -la /home/TowerDefense_Server/main_openresty/conf/
- 检查文件是否存在# 检查库文件
ls -la /home/TowerDefense_Server/main_openresty/libs/
# 检查是否缺少某个模块
find /home/TowerDefense_Server/main_openresty -name "*.lua"
- 重新安装 Lua 依赖# 重新安装依赖库
sudo luarocks install lua-resty-http
sudo luarocks install lua-resty-jwt
sudo luarocks install luautf8
- 检查文件权限chown -R www:www /home/TowerDefense_Server/main_openresty
- 查看详细错误日志# 查看 nginx 错误日志
tail -100 /home/TowerDefense_Server/main_openresty/logs/nginx_error.log
# 查看调试日志
tail -100 /home/TowerDefense_Server/main_openresty/logs/debug_https.log
11.4 机器人服务无法启动
症状
- 机器人进程不存在
- 日志显示机器人连接失败
- 发现机器人服务被启动了多个实例
排查步骤
- 检查是否启动多个服务实例# 检查机器人进程
ps aux | grep "node dist/scripts/index.js" | grep -v grep
# 如果发现有多个进程,需要停止所有进程
pkill -f "node dist/scripts/index.js"
- 检查运行用户是否统一# 检查宝塔 Node.js 项目的运行用户
# 在宝塔面板 → 网站 → Node项目 → 查看 robots 项目的配置
# 确认运行用户是否为 root
# 检查文件的所有者
ls -la /home/TowerDefense_Server/main_openresty/ops/robots_nodejs/
重要:机器人服务的运行用户必须统一设置为 root,避免宝塔和脚本启动不同用户导致的多实例问题。
- 检查 Node.js 版本node -v
# 应输出 v16.x.x
- 检查依赖安装cd /home/TowerDefense_Server/main_openresty/ops/robots_nodejs
npm list --depth=0
- 检查配置文件# 检查服务器地址配置
cat scripts/index.ts | grep "wsUrl\|httpUrl"
- 手动启动测试cd /home/TowerDefense_Server/main_openresty/ops/robots_nodejs
npm run dev
- 查看机器人日志tail -50 robot.log
11.5 其他常见问题
关闭 Lua 脚本缓存会破坏单例 ⚠️ 重要
问题现象:
- Lua 模块每次请求都创建新实例
- Redis 连接无法复用
- 全局状态无法保持
- 性能严重下降
原因说明:
默认开启 Lua 脚本缓存(lua_code_cache on):
- 修改代码后需要重新编译 LuaJIT 二进制字节码
- Lua 模块(如 redis.lua)在首次 require 后会被缓存到 package.loaded
- 后续 require 直接返回缓存,确保单例模式
关闭缓存(lua_code_cache off)后:
- 每次请求都会重新加载 Lua 代码(包括 require 的模块)
- package.loaded 缓存失效
- 每次 require "redis" 都会执行模块文件并返回新实例
- 破坏单例:Redis 连接、全局状态等无法共享
解决方案:
- 生产环境必须保持 lua_code_cache on:# 在 nginxGame.conf 中
lua_code_cache on; # 生产环境必须是 on
- 开发环境可以临时关闭缓存:# 仅在开发环境使用
lua_code_cache off;
- 修改代码后如何更新缓存:# 重启 Nginx 服务
cd /home/TowerDefense_Server/main_openresty
./reloadGame.sh # 生产环境
# 或
./reloadGameDev.sh # 开发环境
SSL 证书问题
# 检查证书文件是否存在
ls -la /www/server/panel/vhost/cert/yourdomain.com/
# 检查证书是否过期
openssl x509 -in /www/server/panel/vhost/cert/yourdomain.com/yourdomain.com.pem -noout -dates
端口被占用
# 查找占用端口的进程
lsof -i :7443
lsof -i :7444
# 杀死占用进程
kill -9 <PID>
权限问题
# 重新设置权限
chown -R www:www /home/TowerDefense_Server/main_openresty
chmod +x /home/TowerDefense_Server/main_openresty/reloadGame.sh
chmod +x /home/TowerDefense_Server/main_openresty/reloadGameDev.sh
12. 日常运维
12.1 重启服务
开发环境
cd /home/TowerDefense_Server/main_openresty
./reloadGameDev.sh
生产环境
cd /home/TowerDefense_Server/main_openresty
./reloadGame.sh
仅重启 Nginx (保持 WebSocket 实时连接不断开)
cd /home/TowerDefense_Server/main_openresty
nginx -p `pwd` -c conf/nginxGame.conf -s reload
12.2 日志管理
查看日志
# 实时查看错误日志
tail -f /home/TowerDefense_Server/main_openresty/logs/nginx_error.log
# 查看访问日志
tail -f /home/TowerDefense_Server/main_openresty/logs/access_https.log
# 查看指定日期的房间日志
ls -la /home/TowerDefense_Server/main_openresty/logs/rooms/
tail -f /home/TowerDefense_Server/main_openresty/logs/rooms/yourdate/
清理日志
启动脚本会自动备份日志,如果需要手动清理:
# 查看日志大小
du -sh /home/TowerDefense_Server/main_openresty/logs/
# 清理旧日志(保留最近 7 天)
find /home/TowerDefense_Server/main_openresty/logs/ -name "*.log" -mtime +7 -delete
12.3 监控报警
使用宝塔监控面板
- 进入宝塔面板
- 查看 "监控" → "系统监控"
- 关注指标:
- CPU 使用率(应 < 80%)
- 内存使用率(应 < 85%)
- 磁盘使用率(应 < 90%)
配置报警
- 在宝塔面板设置报警阈值
- 配置通知(邮件/短信/微信/钉钉)
- 监控以下指标:
12.4 备份策略
备份用户数据
- 推荐使用宝塔 计划任务 自动备份至 云对象存储空间 (阿里云OSS/腾讯云COS/七牛云KODO)
# 导出 Redis 数据
redis-cli --rdb /backup/redis_$(date +%Y%m%d).rdb
备份配置文件
# 备份配置文件
tar -czf /backup/config_$(date +%Y%m%d).tar.gz \
/home/TowerDefense_Server/main_openresty/conf/
13. 生产环境注意事项
13.1 性能优化
必须开启 Lua 缓存
绝对不要关闭 lua_code_cache!
在配置文件中确保:
# 第 200 行(或类似位置)
lua_code_cache on; # 生产环境必须是 on
关闭缓存的危害:
- 每次请求重新加载代码
- 无法保证单例模式
- 性能严重下降
- Redis 连接无法复用
配置 Worker 进程数
# nginxGame.conf 第 4 行
worker_processes auto; # 自动根据 CPU 核心数设置
# 或手动指定
worker_processes 4;
优化 Worker 连接数
# nginxGame.conf 第 24 行
worker_connections 51200; # 每个 worker 最大连接数
13.2 Redis 持久化配置
在生产环境,确保 Redis 已配置持久化:
# 编辑 Redis 配置
vi /etc/redis/redis.conf
# 确认以下配置
save 900 1
save 300 10
save 60 10000
13.3 安全配置
配置 HTTPS 强制跳转
在宝塔面板网站设置中:
- 进入网站设置
- 切换到 "SSL" 标签
- 勾选 "强制 HTTPS"
- 保存配置
配置防火墙
# 配置 UFW 防火墙
sudo ufw allow 7443/tcp
sudo ufw allow 7444/tcp
sudo ufw allow 6379/tcp
sudo ufw enable
禁用不必要的端口
# 禁用不需要的端口
sudo ufw deny 80/tcp
sudo ufw deny 443/tcp
附录
A. 目录结构说明
/home/TowerDefense_Server/
├── main_openresty/ # 主服务器目录
│ ├── apis/ # HTTP API 接口
│ │ ├── login/ # 登录相关
│ │ ├── user/ # 用户相关
│ │ ├── friend/ # 好友相关
│ │ ├── room/ # 房间相关
│ │ ├── shop/ # 商店相关
│ │ └── ...
│ ├── battle/ # 战斗系统
│ │ ├── Hero*.lua # 英雄配置
│ │ ├── Enemy.lua # 敌人配置
│ │ ├── Player.lua # 玩家逻辑
│ │ └── ...
│ ├── handler/ # 业务处理
│ │ ├── centerhandler.lua # 中心处理
│ │ ├── roomhandler.lua # 房间处理
│ │ └── ...
│ ├── logic/ # 业务逻辑
│ │ ├── User.lua # 用户逻辑
│ │ ├── Friend.lua # 好友逻辑
│ │ └── ...
│ ├── conf/ # 配置文件
│ │ ├── nginxGame.conf # 生产环境配置
│ │ ├── nginxGameDev.conf # 开发环境配置
│ │ ├── locationHTTP.conf # HTTP 路由配置
│ │ ├── locationWS.conf # WebSocket 路由配置
│ │ ├── ConfigBattle.lua # 战斗配置
│ │ ├── ConfigGame.lua # 游戏配置
│ │ └── ...
│ ├── libs/ # 库文件
│ │ ├── redis.lua # Redis 库
│ │ ├── utils.lua # 工具库
│ │ └── ...
│ ├── ops/ # 运维脚本
│ │ └── robots_nodejs/ # 机器人服务
│ │ ├── scripts/ # TypeScript 脚本
│ │ ├── package.json # Node 依赖
│ │ └── ...
│ ├── logs/ # 日志目录
│ │ ├── rooms/ # 房间日志
│ │ ├── nginx_error.log # 错误日志
│ │ └── ...
│ ├── reloadGame.sh # 生产环境重启脚本
│ ├── reloadGameDev.sh # 开发环境重启脚本
│ └── install_dependencies.sh # Lua 依赖库一键安装脚本
B. 依赖库列表
必需的 Lua 依赖库
项目使用两种包管理器分别安装不同类别的库:
使用 OPM 安装的库(OpenResty 专用)
| 依赖库 | 安装命令 | 说明 |
|---|
| lua-resty-logger | opm get xiedacon/lua-resty-logger | 日志记录库 |
| lua-utility | opm get xiedacon/lua-utility | 工具函数库 |
| lua-fs-module | opm get xiedacon/lua-fs-module | 文件系统模块 |
| lua-resty-config | opm get xiedacon/lua-resty-config | 配置管理库 |
使用 LuaRocks 安装的库(通用 Lua 库)
| 依赖库 | 版本 | 安装命令 | 说明 |
|---|
| lua-resty-http | 0.17.2-0 | luarocks install lua-resty-http | HTTP 客户端库 |
| lua-resty-jwt | 0.2.3-0 | luarocks install lua-resty-jwt | JWT 认证库 |
| lua-resty-openssl | 1.6.1-1 | luarocks install lua-resty-openssl | OpenSSL 绑定库 |
| luautf8 | 0.1.6-1 | luarocks install luautf8 | UTF-8 字符串处理 |
| lua-resty-validation | 2.7-1 | luarocks install lua-resty-validation | 参数验证库 |
| lua-resty-reqargs | 1.4-1 | luarocks install lua-resty-reqargs | 请求参数解析器 |
| luasocket | 3.1.0-1 | luarocks install luasocket | Socket 库 |
验证依赖库安装
# 验证 OPM 安装的库
opm list
# 验证 LuaRocks 安装的库
luarocks list
# 如果缺少某个库,使用相应的包管理器安装
# OPM: opm get [库名]
# LuaRocks: luarocks install [库名]
OpenResty 内置库
以下库由 OpenResty 提供,无需额外安装:
- cjson - JSON 编码/解码
- redis - Redis 客户端
- resty.*** - OpenResty 官方提供的各种 resty 库
C. 配置文件参数详解
nginxGame.conf 关键参数
| 参数 | 说明 | 默认值 |
|---|
| worker_processes | Worker 进程数 | auto |
| worker_connections | 每进程最大连接数 | 51200 |
| lua_shared_dict | 共享内存配置 | 见配置 |
| lua_package_path | Lua 模块搜索路径 | 见配置 |
| DOMAIN | 服务器域名 | yourdomain.com |
| PORT | WebSocket 端口 | 7444 |
| RELEASE | 环境模式 | true |
locationHTTP.conf 接口说明
- /login - 用户登录
- /getMain - 获取主界面数据
- /user/* - 用户相关接口
- /friend/* - 好友相关接口
- /room/* - 房间相关接口
- /shop/* - 商店相关接口
- /mail/* - 邮件相关接口
D. 端口列表
| 端口 | 协议 | 用途 | 说明 |
|---|
| 8888 | TCP | 宝塔面板 | 宝塔管理入口 |
| 7443 | TCP | HTTPS API | 游戏 HTTP 接口 |
| 7444 | TCP | WSS | WebSocket 游戏连接 |
| 6379 | TCP | Redis | 数据库端口 |
| 22 | TCP | SSH | 远程管理 |
E. 相关链接和文档
F. 联系支持
如遇到问题,请:
- 查看错误日志
- 参考本文档的常见问题章节
- 检查配置文件是否正确
- 联系@技术支持团队 lishupeng@msvc.com.cn