前言
魔域类 H5 游戏的完整源码:前端 Egret 5.0 + 后端 Erlang/OTP20 + PHP 管理后台。本文是完整的服务端教程,分三篇:编译篇(在 Linux 上把业务模块编译出来)、部署篇(数据库、协议配置、启动与验证)、后台篇(PHP 管理后台部署)。全部步骤都在腾讯云 CentOS 7.6 上实战验证过。 上篇 · 编译
一、编译环境准备
系统:CentOS 7.6(64位) Erlang/OTP:必须 20 系列,推荐 erlang-20.3.8.26(对应 erts-9.3.3.15)。这套代码的 beam 是 OTP20 编译的,编译产物和虚拟机字节码版本绑定,高版本 OTP 不兼容。 - # 安装 OTP20(erlang-solutions 源或官方 rpm 均可)
- yum install -y erlang-20.3.8.26-1.el7.rpm
- # 验证编译器可用
- erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell
- # 输出 "20" 即正常
- which erlc # /usr/bin/erlc
复制代码 二、源码目录结构
- server1/
- ├── boot/ 启动脚本、sasl 配置
- ├── lib/
- │ ├── ebin/ 框架层 beam(z_lib、zm_*、jzmy_*,闭源无源码,直接使用不重编)
- │ └── src/ 框架源码(本项目缺失,有则可自行编译)
- └── plugin/p28/ 业务模块
- ├── Emakefile 编译清单
- ├── */.src/ 各模块 Erlang 源码
- ├── */.cfg/ 各模块配置
- └── #/ 特殊目录!井号本身就是目录名
- └── .ebin/ 业务编译产物输出地
复制代码两个要点: 1. plugin/p28/#/ 这个井号目录是框架约定的配置与产物路径,Emakefile 的输出目录就指向它,千万别改名。 2. 框架层 lib/ebin 只有 beam 没有源码,属于闭源部分,编译工作只针对 plugin/p28 业务层和少量替补模块。 三、编译前处理:换行符清理
源码从 Windows 拷贝到 Linux,.erl / Emakefile / .cfg 里带 CRLF 换行符,会导致编译解析异常。全部过一遍 dos2unix: - cd /data/server/server1
- find plugin -name "*.erl" -exec dos2unix {} \;
- find plugin -name "Emakefile" -exec dos2unix {} \;
- find plugin -name "*.cfg" -exec dos2unix {} \;
复制代码 四、编译业务模块(erl -make)
核心就一条命令。Emakefile 里声明了源码通配规则和输出目录 {['*/*/.src/*'], [{outdir, "p28/#/.ebin"}]}: - cd /data/server/server1/plugin/p28
- erl -make
复制代码编译器按 Emakefile 递归扫描各模块 .src 下的 .erl,编译出的 beam 写入 p28/#/.ebin。有语法错误的文件会当场报错并停止,改完重跑即可(增量:只重编改动过的文件)。 编译完成后核对产物: - ls p28/#/.ebin/*.beam | wc -l # 业务 beam 数量
复制代码五、编译 NIF 替补模块
原项目在 Windows 下运行,boot 目录带了一批 Windows NIF(erl_vcall.dll、libuv.dll、findpath.dll 等),Linux 上没有对应 .so。做法是写同接口的纯 Erlang 替补模块并编译成 beam 顶替: - %% /tmp/erl_vcall.erl —— 按原模块导出接口写空实现
- -module(erl_vcall).
- -export([init/0, type/0, invoke/3, fun_register/4,
- asyn_invoke/4, reload_dll/1, release_dll/0]).
- type() -> win32.
- init() -> ok.
- invoke(_, _, _) -> {ok, ok}.
- fun_register(_, _, _, _) -> ok.
- asyn_invoke(_, _, _, _) -> {ok, ok}.
- reload_dll(_) -> ok.
- release_dll() -> ok.
复制代码- # 编译并放入框架 ebin
- erlc -o /tmp /tmp/erl_vcall.erl
- cp /tmp/erl_vcall.beam /data/server/server1/lib/ebin/
- # libuv、lib_npc 等同理:照原 beam 的导出接口写空实现 → erlc → 覆盖
复制代码 查看某个原 beam 的导出接口(照着写替补的依据):- erl -noshell -pa lib/ebin -eval '
- {ok,_,[{exports,L}]} = beam_lib:chunks(code:which(MODULE), [exports]),
- io:format("~p~n", [L]), halt().' 2>/dev/null
复制代码 六、编译产物核对清单
- plugin/p28/#/.ebin/ 业务 beam(本次 erl -make 产出)
- lib/ebin/ 框架 beam(原带)+ 替补 NIF beam(第五步产出)
- boot/ 启动脚本与 sasl 配置(原带)
复制代码 中篇 · 服务端部署
七、数据库
导入后台库(含管理员账号、服务器列表、玩家数据表): - mysql -uroot -p -e "CREATE DATABASE moyo DEFAULT CHARSET utf8"
- mysql -uroot -p moyo < moyo.sql
复制代码 八、协议配置(两端一致关压缩)
这套框架的协议支持 compress/kv/xxtea 可选组合,实测在本环境最稳的组合是两端都只走 kv 不压缩: - %% plugin/p28/#/.cfg/p28_net.cfg
- {zm_protocol_block, {[kv],[kv]}} %% 原文件为 {[compress,kv],[compress,kv]}
复制代码- %% 客户端对应:libs.js(发布包)或 myth 库源码
- myth.net = { ADLER32:!1, ZLIB:!1, XOR:!1, ... } %% ZLIB 改为 !1
复制代码注意两端必须一致:一端压缩一端不压缩,连接会立即断开。改完重启服务端生效。 九、启动
boot/start.sh 内容与用法: - #!/bin/sh
- cd "$(dirname "$0")"
- epmd -daemon 2>/dev/null
- erl +K true -detached -boot start_sasl -config sasl -setcookie abc \
- -name t07@127.0.0.1 -env ERL_LIBS ../lib -env ERL_MAX_ETS_TABLES 15000
- # 启动
- bash /data/server/server1/boot/start.sh
复制代码 十、验证
- ss -ltnp | grep -E '4003|13000|15000' # 三个端口 LISTEN
- epmd -names # name t07 已注册
- tail sasl.log # 出现 zm_boot started_at 即成功
复制代码 防火墙放行(否则外网连不上):- firewall-cmd --permanent --add-port=4003/tcp
- firewall-cmd --permanent --add-port=13000/tcp
- firewall-cmd --reload
复制代码 停止与重启:- pkill -f 'beam.smp.*t07@127.0.0.1' # 停止
- bash /data/server/server1/boot/start.sh # 再启动
复制代码 下篇 · PHP 后台部署
十一、Nginx 站点
后台与 API 同属一个站点,监听 8080: - # /www/server/panel/vhost/nginx/moyo.conf
- server {
- listen 8080;
- root /data/bgSystem/moyo;
- index index.php index.html index.htm;
- location ~ \.php$ {
- fastcgi_pass unix:/tmp/php-cgi-72.sock; # PHP7.2-FPM
- fastcgi_index index.php;
- include fastcgi.conf;
- }
- location / { try_files $uri $uri/ =404; }
- }
复制代码 十二、数据库配置
后台与 API 共用 config/db.php,填好 host / 账号 / 密码 / database=moyo 即可。 十三、静态资源软链
后台页面用根路径引用 /js/,而文件实际在 admin/js 下,做个软链: - cd /data/bgSystem/moyo
- ln -s admin/js js
复制代码十四、入口与管理员账号
浏览器访问 http://服务器IP:8080/,自动跳转到登录页(layui 界面)。默认管理员: - 账号:admin
- 密码:123456 ← 数据库里是 md5,上线后务必改密
复制代码防火墙记得放行 8080。 十五、API 接口(给前端用)
前端会调用 /api/server.php(服务器列表)、/api/Order/quick/data.php(渠道信息)等接口,以及注册登录用的 /api/register.php、/api/login.php。跨域调用的接口记得加响应头: - header("Access-Control-Allow-Origin: *");
复制代码 结语
按三篇走完:编译出全套 beam → 配置协议并启动验证三端口 → 后台浏览器可登录管理。配合前端 serverlist.json 指向服务器 IP 的 4003 端口,即可正常进游戏。 |