admin 发表于 2026-9-1 19:42:46

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

前言

魔域类 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), ),
io:format("~p~n", ), 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, {,}}   %% 原文件为 {,}%% 客户端对应: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 端口,即可正常进游戏。
页: [1]
查看完整版本: 魔域H5服务端(Erlang OTP20)Linux 编译与部署完整教程(含PHP后台)