查看: 1232|回复: 0

[游戏搭建教程] 魔域H5服务端(Erlang OTP20)Linux 编译与部署完整教程(含PHP后台)

[复制链接]

124

主题

0

回帖

508

积分

管理员

积分
508
发表于 2026-9-1 19:42:46 | 显示全部楼层 |阅读模式
前言

魔域类 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 不兼容。
  1. # 安装 OTP20(erlang-solutions 源或官方 rpm 均可)
  2. yum install -y erlang-20.3.8.26-1.el7.rpm

  3. # 验证编译器可用
  4. erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell
  5. # 输出 "20" 即正常
  6. which erlc                            # /usr/bin/erlc
复制代码
二、源码目录结构
  1. server1/
  2. ├── boot/          启动脚本、sasl 配置
  3. ├── lib/
  4. │   ├── ebin/      框架层 beam(z_lib、zm_*、jzmy_*,闭源无源码,直接使用不重编)
  5. │   └── src/       框架源码(本项目缺失,有则可自行编译)
  6. └── plugin/p28/    业务模块
  7.     ├── Emakefile  编译清单
  8.     ├── */.src/    各模块 Erlang 源码
  9.     ├── */.cfg/    各模块配置
  10.     └── #/         特殊目录!井号本身就是目录名
  11.         └── .ebin/ 业务编译产物输出地
复制代码
两个要点:
1. plugin/p28/#/ 这个井号目录是框架约定的配置与产物路径,Emakefile 的输出目录就指向它,千万别改名。
2. 框架层 lib/ebin 只有 beam 没有源码,属于闭源部分,编译工作只针对 plugin/p28 业务层和少量替补模块。
三、编译前处理:换行符清理

源码从 Windows 拷贝到 Linux,.erl / Emakefile / .cfg 里带 CRLF 换行符,会导致编译解析异常。全部过一遍 dos2unix:
  1. cd /data/server/server1
  2. find plugin -name "*.erl" -exec dos2unix {} \;
  3. find plugin -name "Emakefile" -exec dos2unix {} \;
  4. find plugin -name "*.cfg"  -exec dos2unix {} \;
复制代码
四、编译业务模块(erl -make)

核心就一条命令。Emakefile 里声明了源码通配规则和输出目录 {['*/*/.src/*'], [{outdir, "p28/#/.ebin"}]}:
  1. cd /data/server/server1/plugin/p28
  2. erl -make
复制代码
编译器按 Emakefile 递归扫描各模块 .src 下的 .erl,编译出的 beam 写入 p28/#/.ebin。有语法错误的文件会当场报错并停止,改完重跑即可(增量:只重编改动过的文件)。
编译完成后核对产物:
  1. ls p28/#/.ebin/*.beam | wc -l    # 业务 beam 数量
复制代码
五、编译 NIF 替补模块

原项目在 Windows 下运行,boot 目录带了一批 Windows NIF(erl_vcall.dll、libuv.dll、findpath.dll 等),Linux 上没有对应 .so。做法是写同接口的纯 Erlang 替补模块并编译成 beam 顶替:
  1. %% /tmp/erl_vcall.erl —— 按原模块导出接口写空实现
  2. -module(erl_vcall).
  3. -export([init/0, type/0, invoke/3, fun_register/4,
  4.          asyn_invoke/4, reload_dll/1, release_dll/0]).
  5. type() -> win32.
  6. init() -> ok.
  7. invoke(_, _, _) -> {ok, ok}.
  8. fun_register(_, _, _, _) -> ok.
  9. asyn_invoke(_, _, _, _) -> {ok, ok}.
  10. reload_dll(_) -> ok.
  11. release_dll() -> ok.
复制代码
  1. # 编译并放入框架 ebin
  2. erlc -o /tmp /tmp/erl_vcall.erl
  3. cp /tmp/erl_vcall.beam /data/server/server1/lib/ebin/

  4. # libuv、lib_npc 等同理:照原 beam 的导出接口写空实现 → erlc → 覆盖
复制代码
查看某个原 beam 的导出接口(照着写替补的依据):
  1. erl -noshell -pa lib/ebin -eval '
  2.   {ok,_,[{exports,L}]} = beam_lib:chunks(code:which(MODULE), [exports]),
  3.   io:format("~p~n", [L]), halt().' 2>/dev/null
复制代码
六、编译产物核对清单
  1. plugin/p28/#/.ebin/   业务 beam(本次 erl -make 产出)
  2. lib/ebin/             框架 beam(原带)+ 替补 NIF beam(第五步产出)
  3. boot/                 启动脚本与 sasl 配置(原带)
复制代码
中篇 · 服务端部署

七、数据库

导入后台库(含管理员账号、服务器列表、玩家数据表):
  1. mysql -uroot -p -e "CREATE DATABASE moyo DEFAULT CHARSET utf8"
  2. mysql -uroot -p moyo < moyo.sql
复制代码
八、协议配置(两端一致关压缩)

这套框架的协议支持 compress/kv/xxtea 可选组合,实测在本环境最稳的组合是两端都只走 kv 不压缩:
  1. %% plugin/p28/#/.cfg/p28_net.cfg
  2. {zm_protocol_block, {[kv],[kv]}}   %% 原文件为 {[compress,kv],[compress,kv]}
复制代码
  1. %% 客户端对应:libs.js(发布包)或 myth 库源码
  2. myth.net = { ADLER32:!1, ZLIB:!1, XOR:!1, ... }   %% ZLIB 改为 !1
复制代码
注意两端必须一致:一端压缩一端不压缩,连接会立即断开。改完重启服务端生效。
九、启动

boot/start.sh 内容与用法:
  1. #!/bin/sh
  2. cd "$(dirname "$0")"
  3. epmd -daemon 2>/dev/null
  4. erl +K true -detached -boot start_sasl -config sasl -setcookie abc \
  5.     -name t07@127.0.0.1 -env ERL_LIBS ../lib -env ERL_MAX_ETS_TABLES 15000

  6. # 启动
  7. bash /data/server/server1/boot/start.sh
复制代码
十、验证
  1. ss -ltnp | grep -E '4003|13000|15000'   # 三个端口 LISTEN
  2. epmd -names                             # name t07 已注册
  3. tail sasl.log                           # 出现 zm_boot started_at 即成功
复制代码
防火墙放行(否则外网连不上):
  1. firewall-cmd --permanent --add-port=4003/tcp
  2. firewall-cmd --permanent --add-port=13000/tcp
  3. firewall-cmd --reload
复制代码
停止与重启:
  1. pkill -f 'beam.smp.*t07@127.0.0.1'      # 停止
  2. bash /data/server/server1/boot/start.sh # 再启动
复制代码
下篇 · PHP 后台部署
十一、Nginx 站点

后台与 API 同属一个站点,监听 8080:
  1. # /www/server/panel/vhost/nginx/moyo.conf
  2. server {
  3.     listen 8080;
  4.     root /data/bgSystem/moyo;
  5.     index index.php index.html index.htm;
  6.     location ~ \.php$ {
  7.         fastcgi_pass unix:/tmp/php-cgi-72.sock;   # PHP7.2-FPM
  8.         fastcgi_index index.php;
  9.         include fastcgi.conf;
  10.     }
  11.     location / { try_files $uri $uri/ =404; }
  12. }
复制代码
十二、数据库配置

后台与 API 共用 config/db.php,填好 host / 账号 / 密码 / database=moyo 即可。
十三、静态资源软链

后台页面用根路径引用 /js/,而文件实际在 admin/js 下,做个软链:
  1. cd /data/bgSystem/moyo
  2. ln -s admin/js js
复制代码
十四、入口与管理员账号

浏览器访问 http://服务器IP:8080/,自动跳转到登录页(layui 界面)。默认管理员:
  1. 账号:admin
  2. 密码:123456        ← 数据库里是 md5,上线后务必改密
复制代码
防火墙记得放行 8080。
十五、API 接口(给前端用)

前端会调用 /api/server.php(服务器列表)、/api/Order/quick/data.php(渠道信息)等接口,以及注册登录用的 /api/register.php、/api/login.php。跨域调用的接口记得加响应头:
  1. header("Access-Control-Allow-Origin: *");
复制代码
结语

按三篇走完:编译出全套 beam → 配置协议并启动验证三端口 → 后台浏览器可登录管理。配合前端 serverlist.json 指向服务器 IP 的 4003 端口,即可正常进游戏。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|蜀ICP备17024538号-6

在本版发帖
关注公众号
QQ客服返回顶部