尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

石器时代H5内购版手工搭建全流程:从环境部署到支付回调实战

石器时代H5内购版手工搭建全流程:从环境部署到支付回调实战 做石器时代H5内购版的手工搭建说难不算难但琐碎是真琐碎。我前前后后给朋友搭过几套类似的项目踩了不少坑今天趁周末把整套流程整理出来从环境准备到服务端启动再从数据库导入到前端适配尽量把每一步的“为什么这么做”也讲清楚。这篇东西不吹不黑完全是我自己实操过的路径记录照着走基本能跑通。先说结论这套经典2DMMORPG手游的H5内购版本质上是“网页端游戏 独立服务端 数据库 内购支付模块”的组合体。你要做的事情就是把这四块在服务器上拼起来让它对外提供游戏服务。整个过程涉及Linux基础操作、数据库导入导出、Nginx站点配置、进程守护这些常规运维技能只要你用过宝塔面板或者敲过几行Linux命令就能搞定。这篇教程适合谁手里有一台云服务器、想把石器时代H5跑起来自己玩或者做小范围运营测试的爱好者以及想搞明白H5游戏服务端原理的入门运维。不涉及任何商业运营的灰色部分纯粹是技术向的记录分享。1. 项目整体拆解与搭建思路1.1 这套H5端到底是什么形态石器时代这个IP在2D回合制MMORPG里算是很经典的了宠物捕捉、骑乘、回合战斗这些核心玩法辨识度极高。H5版的意思是客户端跑在浏览器里不需要安装App打开网址就能进游戏。这对服务端的考验反而不小——因为所有逻辑都在服务端跑客户端只是做了个表现层的映射。内购版加了个关键模块充值、礼包、支付回调。也就是说服务端里除了游戏逻辑进程还有一个面向支付的接口服务。玩家在网页里点充值前端请求服务端下单服务端跟支付渠道对接支付成功后渠道回调服务端服务端再给玩家的角色发放对应的货币或道具。理解这个链路很重要。很多人在搭建时只盯着游戏主进程结果充值模块怎么都到不了账其实问题往往出在回调接口没通、商户号配置错、或者回调地址被Nginx拦截了。后面我会专门用一章讲内购部分。1.2 手工搭建的整体架构图整套系统跑起来以后请求路径大概是这样的浏览器H5前端 ↓ Nginx80/443端口托管H5静态文件 反代游戏接口 ↓ 游戏服务端进程LoginServer / GameServer / GMServer 等按源码实际结构来 ↓ MySQL数据库账号、角色、日志、充值记录 ↓ 内部回调模块内购版特有支付渠道 - Nginx - 服务端回调接口 - 发奖我搭过的这套服务端进程区分比较清晰有负责登录鉴权的有专门跑游戏逻辑的还有一个是GM后台和充值发放。进程之间通过内部端口通信对外只暴露必要的端口给Nginx。1.3 为什么选择手工搭建而不是一键脚本说实话网上确实有一键安装包解压完跑个脚本就能起来。但我不推荐直接用至少我踩过太多次一键脚本埋的坑路径写死、端口冲突、数据库密码硬编码、进程守护缺失出了问题连排查的头绪都没有。手工搭建最核心的价值是一步一步搞清楚服务端和前端是怎么对接的。比如前端页面里的服务器IP配置是写在config.js里的数据库连接是写在服务端的settings文件里的这两处如果不匹配前端永远提示“连接服务器失败”。这东西嘴上说了没用自己配一遍比看十篇文章都管用。另外手工搭建还是有不少好处的可以自定义端口和路径避免跟服务器上其他服务冲突。数据库账号密码可以按自己的规范来而不是用死的root/root。出了问题知道从哪个环节查起不至于对着黑屏干瞪眼。后期要做服务器迁移、多区部署理解过一遍手工流程会轻松非常多。2. 服务端环境准备与服务器选型2.1 服务器配置和系统怎么选石器时代H5这套服务端对硬件要求不算夸张但也不是随便一台乞丐机就能扛住的。我自己用的配置是4核8G的云服务器带宽5M起步。如果你只是自己拉三五个人测试2核4G也能跑不过开服之后随着在线人数上来响应会明显变慢。系统方面我用的是CentOS 764位。这套服务端的很多底层依赖在CentOS系上最稳尤其是PHP和MySQL的旧版本兼容性比新系统好。如果你手头是Ubuntu或Debian也完全可以跑就是部分依赖的包名有差异装的时候稍微注意一下。注意尽量别用Windows Server跑这套服务端。不是说跑不起来而是很多启动脚本是sh格式的还得折腾模拟环境费那劲儿不如直接上Linux。2.2 安装宝塔面板还是纯命令行两个方案都用过我的经验是新手强烈建议用宝塔面板熟练的可以不用。宝塔的好处是Nginx、MySQL、PHP这些组件用图形界面就能装好省去了命令行的编译时间。而且文件管理、数据库导入导出、端口放行这些操作都有界面对手工搭建来说容错率高很多。装宝塔的命令各家版本不一样装好之后在浏览器里打开面板地址用初始账号密码登录。然后在“软件商店”里安装Nginx 1.18以上版本MySQL 5.7这套端用5.7稳8.0的认证方式跟老代码兼容性差PHP 5.6或7.0之间选一个具体看你的服务端程序要求如果服务端程序里含Node.js部分再装一个PM2管理器用PM2守护Node进程。2.3 编译工具和基础依赖有些服务端程序带的是编译好的二进制但有的模块比如某个加密so、自定义扩展需要现编。保险起见装一下基础工具链yum install -y gcc gcc-c make cmake wget tar unzip zip yum install -y openssl-devel zlib-devel libxml2-devel curl-devel这些工具装起来不亏后面解压源码、编译扩展、处理文件权限都会用到。我搭第一套的时候没装编译工具结果某个PHP扩展加载不了服务端直接报错白白浪费了一个晚上才排查出来。2.4 端口规划和防火墙放行服务端一般会开这么几类端口用途默认端口参考说明HTTP访问80/443Nginx托管H5前端和接口必须有服务端登录进程9000-9009客户端登录验证用的网关游戏进程9010-9100实际跑游戏逻辑的端口GM后台8080或8888管理后台页面建议改掉或用宝塔安全过滤端口的具体数字请以你拿到手的那套服务端里的配置文件为准不要死记我写的这组。我见过很多教程统一写死某个端口结果人家手里版本不一样照抄就翻车。宝塔面板放行端口的位置在“安全”里添加规则。云服务商控制台的防火墙或者安全组也要同步放行两边缺一个都会导致外部连不上。腾讯云和阿里云在这里的名字不一样但都在控制台网络那块找。3. 服务端文件部署与数据库初始化3.1 拿到文件后先做什么假设你手头已经有一套石器时代H5内购版的完整服务端压缩包解压之前先做三件事放到一个不含中文、不含空格的路径下比如/data/shiqi。用unzip解压包解压后看一下目录结构不要急着启动。找到服务端目录下的config、server、sql、web这类文件夹把每个目录的作用搞明白。我见过有人解压后不管三七二十一直接跑start.sh结果报了一堆错才发现SQL文件没导入、配置文件里数据库密码还是旧库的整个白忙。手工搭建最重要的一点就是先花十分钟摸清楚你的服务端有哪些组成部分这十分钟后面能省一小时。以下是一个典型目录结构的参考/data/shiqi/ ├── server/ # 游戏服务端程序含login、game等子目录 ├── sql/ # 数据库初始化脚本 ├── web/ # H5前端代码静态页面 ├── tool/ # 批量导入、GM工具等辅助脚本 ├── start.sh # 一键启动脚本 ├── stop.sh # 停止脚本 └── README.txt # 附带说明先读它3.2 数据库搭建与导入先在宝塔里创建一个数据库数据库名按你服务端的要求来一般是shiqidb或者sr_game之类。创建的时候顺便记下数据库名、用户名、密码后面配置文件要用别跟宝塔默认的搞混。然后进到sql目录看有哪些.sql文件。常见的命名规则跟用途对应account.sql账号登录相关的库role.sql/char.sql角色数据log.sql日志库pay.sql充值订单记录内购版关键导入的方式有两种。宝塔里可以直接在数据库的“导入”里上传文件方便但慢文件多的话我更推荐命令行导入mysql -u你的用户名 -p你的密码 你的数据库名 /data/shiqi/sql/account.sql多张表分布在多个sql文件里的就逐个导入顺序按依赖关系来先导基础表再导业务表否则外键关联会报错。3.3 修改核心配置文件导入完成后进入重点环节——配置文件修改。这个步骤里改错一个值服务端就起不来或者前端连不上。我把自己踩过的坑和正确改法列一遍。服务端的配置文件一般叫config.ini、server.ini、.env、config.php这种位置可能有一个总配置加多个子配置。核心要改的是数据库连接host填127.0.0.1port填3306user和password改成你自己的。监听地址一般填0.0.0.0让所有网卡都能访问如果填了127.0.0.1外部玩家就连不上。开放端口确认login和game用的端口跟前面规划的一致。加密密钥/签名key内购版的支付回调签名在这里配置改成自己生成的随机字符串。注意配置文件里的密码如果带特殊字符如#、有的程序会解析截断导致连接失败。密码尽量用字母数字组合别自找麻烦。3.4 启动服务端进程配置文件改完以后就可以尝试启动了。不建议直接挂在前台跑建议用后台方式cd /data/shiqi chmod x *.sh ./start.sh启动完成后第一时间看进程和端口ps -ef | grep java(或你的服务端程序名) netstat -tlnp | grep 游戏端口如果进程起来了端口也监听正常说明程序基本跑通了。这时候别急着关掉再去日志目录看看有没有刷报错tail -f /data/shiqi/server/log/*.log常见启动失败的原因我在第6章统一列出排查办法这里先不展开。4. H5前端与Nginx站点配置4.1 前端文件放哪里服务端起来了接下来要让浏览器能打开游戏页面。前端代码就是web目录里的那堆静态文件你要把它们托管到Nginx站点下。我习惯的做法是把整个web目录复制到Nginx默认站点目录的根目录下跟站点同名cp -r /data/shiqi/web /www/wwwroot/h5/然后配置一个站点绑定你的域名或者服务器IP。如果暂时没域名直接用服务器IP加端口访问也行但生产环境强烈建议上域名后面支付回调、微信内置浏览器访问都会涉及域名是否可信的问题。4.2 前端配置文件的改动前端目录里几乎必有一个config.js或settings.js里面的内容长这样按你实际看到的来var GAME_SERVER { serverIP: 127.0.0.1, // 改成你的公网IP或域名 serverPort: 9001, // 改成服务端登录网关端口 payCallback: https://你的域名/pay/notify };前端连接服务端的逻辑就是拿着这个IP和端口去连。这里有个新手特别容易踩的坑改完把文件保存了但浏览器缓存了旧的js打开页面还是被指向旧地址。解决方法是改完以后在Nginx配置里给前端js加个版本号参数或者在浏览器里强制刷新。4.3 Nginx反代接口与HTTPS配置如果你的服务端接口是HTTP请求且需要跟你的前端同域最简单的方式是在Nginx里加一条反向代理规则location /api/ { proxy_pass http://127.0.0.1:游戏进程端口/; proxy_set_header X-Real-IP $remote_addr; }这样前端就不需要直连游戏端口统一走80/443再由Nginx转发给后端的游戏进程。好处是端口少暴露被攻击面小很多。HTTPS按现在的环境来说基本是刚需尤其是微信内置浏览器里打开的页面非HTTPS地址经常被拦截。宝塔里配置证书很简单一键申请或上传已有证书都行。重要提示如果你要接入微信系能力比如企业微信客服、公众号菜单跳转等域名必须是备案过的HTTPS域名并且一会儿还要用到文件校验、JS接口安全域名配置这些都依赖一个能正常访问的HTTPS站点。5. 内购版核心支付回调与充值发放5.1 内购版和普通版到底差在哪标题里明确写了“内购版”这块必须重点讲。普通版光有游戏逻辑就行内购版额外多了三块东西商品表配置礼包、月卡、首充的物品和时间支付接口下单模块跟渠道对接生成订单号回调接收模块渠道支付成功之后通知服务端服务端处理发货这三块如果配置不对最常见的现象就是玩家在网页上付了钱钱从渠道出去了但游戏里没到账。这种问题还特别难排查因为中间隔了好几层。5.2 配置支付参数支付参数在服务端的pay或recharge配置里一般要填这些商户号渠道给你的商户密钥签名用的别泄露回调通知地址必须是公网可访问的HTTPS地址下单接口的签名规则每家渠道的字段名略有差异原则是一样的先确认商户号密钥填对了再确认回调地址是公网能访问的。我第一次搭内购版的时候商户号填反了两位数字结果支付单一直创建不了排查了一个多小时才找到。5.3 从支付成功到发奖的全链路完整链路如下玩家在H5页点充值按钮。前端请求服务端的下单接口服务端生成本地订单号。前端跳转或拉起支付页面带着本地订单号去渠道支付。渠道完成扣款向服务端的回调地址发送HTTP通知。服务端收到通知验签通过后核对本地订单。订单匹配成功向角色数据库写入对应货币/道具。游戏内玩家收到发放结果。在这个链路里最脆弱的两个环节是第4步和第5步回调地址不通渠道通知不到你的服务端钱只能躺着。验签失败通知到了但签名校验不过服务端直接丢弃。要检测是不是这两个环节出问题最直接的办法是看服务端日志里有没有支付回调相关的记录。另一个笨办法是自己在服务器上用curl模拟一个回调请求curl -X POST https://你的域名/pay/notify \ -H Content-Type: application/json \ -d {order_id:test123,amount:6.00,trade_no:fake20241101}这个请求发过去看返回码和服务端日志变化就能判断回调接口本身通不通。验签伪签过不了是正常的重点看接口有没有被Nginx拦截、进程有没有接收到。5.4 GM工具与手动补发内购版一般都会附带一个GM后台我用过的那套是独立于游戏进程的地址通常在http://域名/gm/登录后可以给指定角色发货币、发道具、调整等级。这个GM工具在生产环境里最好限制来源IP否则谁拿到地址谁就能乱改数据。宝塔的“安全”里加一条仅允许你自己的IP访问GM端口的规则能挡掉绝大多数陌生人乱入的风险。6. 常见问题与排查技巧实录6.1 数据库连接失败报错长这样Failed to connect to database或者SQLSTATE[HY000] [1045] Access denied。排查顺序按这个来先用命令行试一下数据库能不能连mysql -u账号 -p密码 -h127.0.0.1。如果命令行也连不上就是账号密码错了或者没有远程授权。命令行能连但服务端报错大概率是配置文件里的host、port、dbname写错了。检查数据库权限——有些库默认只许root从localhost访问服务端进程如果用别的用户就连不上。6.2 服务端启动几分钟后进程消失这是最气人的问题启动脚本跑完显示OK进程起来了一会儿又自动退了。查这个优先看日志因为进程退出一定会有日志留下。我见过的主因有两个内存不够被系统kill了。用dmesg | tail看有没有OOM字样。2G内存跑全套服务端确实紧张加Swap能缓解。服务端程序的数据库连接掉了。有的程序不会重连MySQL服务重启过它就静默崩溃。另外确认一下你启动用的用户有没有文件写权限。用root启动一般没事但如果用普通用户日志目录创建失败也会悄悄退出。6.3 前端打开了但一直卡在登录界面先问一句前端显示的内容有没有正常加载如果页面都出来了、能输入账号密码说明前端和Nginx正常。问题是登录请求一直转圈这时按顺序排查检查前端config.js里的IP是不是公网IP或域名。telnet测试一下游戏端口通不通telnet 服务器IP 端口。如果本机通但外网不通查防火墙和安全组。如果端口通但还是报连接失败看登录进程日志可能是协议版本不匹配或数据库查不到该账号。6.4 常见问题速查表现象可能原因优先检查项页面打不开Nginx没起来或站点路径错浏览器访问IP看是否到404页面显示但登录失败前端IP指向错误config.js里的IP和端口服务端进程起不来配置解析失败配置文件里的路径和密码充值不到账回调域名没配或被拦截用curl模拟请求看日志GM后台进不去端口或路径不对看GM进程监听端口玩家多就卡顿服务器配置不够看top命令CPU和内存占用6.5 避坑建议这套项目我前后搭了好几遍总结出几个特别容易省时间的地方服务端目录权限直接给chmod -R 777是最快的虽然是懒办法但测试环境完全够用。保持版本一致性前端代码、服务端程序、数据库脚本最好是同一个包里出的。混搭不同来源的文件轻则报错重则数据错乱。改配置前先备份配置文件改炸了是常事备份一份原始文件能让你随时回滚不至于一条路走到黑。日志是唯一可信的不看日志瞎猜配置是最浪费时间的操作。不管什么问题先tail -f日志再动手。7. 上线运营前要做的几项优化7.1 进程守护手工启动的服务端不会说从崩溃里自己爬起来。上线前用supervisord或者宝塔的“进程守护管理器”把每个关键进程守护起来进程挂了自动拉起能省掉半夜起来重启服务器的糟心事。7.2 定时备份数据库是整个服务的命根子。配置一个每天凌晨3点的定时任务把MySQL数据导出来存到另一个盘甚至传到对象存储。我是用宝塔的定时备份功能跑的操作起来简单速度也快。7.3 修改默认端口服务端的GM端口、内部通讯端口如果都走默认值很容易被扫描软件盯上。在不影响游戏运行的前提下把GM后台端口改成一个高位随机端口再加上IP白名单安全性会好很多。7.4 性能参数调整如果是CentOS 7建议把系统的文件打开数上限调高不然连接多了会出too many open filesulimit -n 65535MySQL的innodb_buffer_pool_size在内存允许的情况下也调大一点我4G内存的机器给它分了2G查询速度肉眼可见变快。这套搭建流程写下来基本就是我从零到一把服务端跑通的完整路线。回头再看手工搭建的价值不在那几步操作本身而在操作过程中建立起来的“全局认知”——知道哪个文件管哪块、哪个端口扔哪条数据后面无论做调优还是排查心里都有底。最后再分享一个小技巧搭建过程中每做完一个阶段比如数据库导入完成、服务端启动成功、前端能登录就截个图或者写几行笔记记录结果。这套端如果过两三个月再维护光靠记忆很容易漏掉关键步骤一份当时顺手写的部署记录能帮你节省大量重新梳理的时间。
返回列表