掘金 后端 ( ) • 2023-05-13 17:32

前言:

项目是一个游客登录型的棋牌联网游戏,前端是白鹭引擎,后端PHP开发。分为登录和获取基本信息的Http层和websocket通信的游戏层。后台需要有一个分布式网关服务器(php游戏网关)。以下为了搭建更快捷,使用宝塔进行操作,前提已经通过宝塔安装完毕了LNMP。

环境:

  1. CentOS7
  2. PHP7.3
  3. 宝塔bt
  4. Nginx

步骤:

  1. 下载完源码地址的源码,解压得到以下四个目录,分别的用途见标注。

  2. EgretWing工具导入client中的代码,web整个文件夹的代码放入服务器(我是本地使用VM搭的centOS虚拟机)。

  3. 宝塔中的使用的PHP安装yaf扩展,重启PHP后访问查看phpinfo()可能找不到yaf

4. 通过宝塔的创建网站添加web中的代码,使得能通过域名请求到web目录下的api.php就行。主要是三个接口,分别返回登录信息,websocket的地址和端口,图片代理等。

  1. 代码client文件中的代码修改”src/scene/Login.ts”的onLoginTouch方法中请求网络接口为上面web中配置的域名,”src/Main.ts”中的initGame方法同样修改网络请求地址为上面web配置的域名。接口分别是昵称和登录token,另一个是websocket地址和端口。

  1. 下载上面的Fooking的源代码,并将代码放入服务器中,目录结构如下。

  2. 打开服务器命令面板,cd进入fooking目录(以我的为例,名字可以自定义)。然后make进行编译。Src目录中多出后缀为0的文件,面板也会显示编译结束。

  3. 打开fooking目录下的router.lua文件。PROT可以自行定义,确定下了这个端口,我的是8015。就需要在centOS防火墙中对其放行,宝塔是直接点击安全添加8015进行放行。

  4. 依然是同级目录,打开config.lua文件,端口就是游戏中webscket进行连接的端口。

主要配置的有路由服务器地址(上面router设置的端口和地址),后端服务器列表的“BACKEND_SERVER”,以及fastcgi params,配置标注如下。

--监听IP和端口
HOST = "0.0.0.0";
PORT = 9005;

--守护进行
--DAEMONIZE = 1;

--日志文件(为空则不输出日志, stdout-输出到标准输出上, 其它则按文件处理)
LOG_FILE = "stdout";--直接屏幕打印
--LOG_FILE = "/tmp/fooking-gateway.log";--输出到文件

--1: 仅error
--2: error与info
--3: 所有
LOG_LEVEL = 3;

--是否路由服务器(0-否, 1-是)
--如果是路由,ROUTER以下的配置将被忽略)
ROUTER = 0;

--服务器ID
SERVER_ID = 1;

--工作进程
WORKER_NUM = 2;

--最大连接数
MAX_CLIENT_NUM = 10000;

--缓冲区大小
MAX_BUFF_SIZE = 4096;

--路由服务器
ROUTER_HOST = "192.168.234.128";
ROUTER_PORT = 8015;

--SSL配置
--SSL = 1
--SSL_CERT = "/tmp/cert.pem"
--SSL_PKEY = "/tmp/pkey.pem"

--指定时间内连接没有数据包请求,将会踢掉连接(单位秒),为0不处理
IDLE_TIME = 0;

--脚本
SCRIPT_FILE = "../scripts/Websocket.lua";

--后端服务器列表
BACKEND_CONNECT_TIMEOUT = 5;--连接超时时间(单位秒)
BACKEND_READ_TIMEOUT = 10;--数据接收超时间(单位秒)
BACKEND_KEEPALIVE = 10;--最大维持长连接数量
BACKEND_SERVER = {
["unix:/tmp/php-cgi-73.sock"] = 5,--第一列是socket选项,第二列是权重(跟nginx的upstream差不多一个意思)
};

--新连接是否通知(0-不通知, 1-通知)
--请求头会有EVENT=1
EVENT_CONNECT = 0;

--关闭连接是否通知(0-不通知, 1-通知)
--请求头会有EVENT=2
EVENT_CLOSE = 1;

--fastcgi params
FASTCGI_PREFIX = "";--go下要使用HTTP_作为前缀,否则拿不了SESSIONID和EVENT
FASTCGI_ROOT = "/www/wwwroot/san_zhang_pai/server/";--必须以/结尾
FASTCGI_FILE = "server.php";
FASTCGI_PARAMS = {
["SERVER_SOFTWARE"] = "fooking",
["SERVER_PROTOCOL"] = "HTTP/1.1",
["GATEWAY_INTERFACE"] = "CGI/1.1",
["REQUEST_METHOD"] = "POST",
["SCRIPT_FILENAME"] = FASTCGI_ROOT..FASTCGI_FILE,
["SCRIPT_NAME"] = FASTCGI_FILE,
["DOCUMENT_ROOT"] = FASTCGI_ROOT,
["SERVER_NAME"] = "server.yafgame.com/",
["QUERY_STRING"] = "a=10&b=20",
};

  1. 启动router.lua。 Cd src,然后./fooking ../router.lua

  1. 查看php-fpm配置文件方法,命令输入, ps -ef | grep fpm。可以看到php-fpm的配置文件。

  2. 找到并打开php-fpm.conf文件,可以看到监听的通信方法以及通信的具体地址,还有fpm的错误日志存放地址。宝塔Nginx与fpm默认是以unix socket方法,如果fpm修改成了tcp,那nginx也要修改。

  1. 查看fpm.conf后与fooking的config设置完毕后,就可以开始启动config了。Cd fooking, 然后./fooking ../config.lua。

如果出现Can't found available backend server, Please check BACKEND_SERVER,多是因为config的后端配置填的通信方式与fpm的不一致。其他的就是FASTCGI_ROOT没填对地址。

  1. 最后打开EgretWing导入的client中的源码,点击调试,弹出游戏界面,登录后正常的话就会进入游戏界面了。

Fooking分布式游戏服务器网关结构图--

  1. 启动的config.lua出现“stream_socket_client(): unable to connect to tcp://127.0.0.1:9010”时,修改server的“config”中的router,IP和端口换成router.lua中配置启动的地址和端口。

  2. 修改server的redis中的为自己安装的地址和端口,web的api/api/api/include/config.inc.php,修改redis地址和微信公众号APPID等地址。