前言:
項目是一個游客登錄型的棋牌聯網游戲,前端是白鷺引擎,后端PHP開發。分為登錄和獲取基本信息的Http層和websocket通信的游戲層。后台需要有一個分布式網關服務器(php游戲網關)。以下為了搭建更快捷,使用寶塔進行操作,前提已經通過寶塔安裝完畢了LNMP。
資源:
源碼地址: https://gitee.com/scgywx/threecard
作者說明: https://my.oschina.net/scgywx/blog/757726
Fooking地址: https://gitee.com/scgywx/fooking
環境:
- CentOS7
- PHP7.3,至少要大於5
- 寶塔
- Nginx
步驟:
- 下載完源碼地址的源碼,解壓得到以下四個目錄,分別的用途見標注。
2. EgretWing工具導入client中的代碼,web整個文件夾的代碼放入服務器(我是本地使用VM搭的centOS虛擬機)。
3. 寶塔中的使用的PHP安裝yaf擴展,重啟PHP后訪問查看phpinfo()可能找不到yaf
4. 通過寶塔的創建網站添加web中的代碼,使得能通過域名請求到web目錄下的api.php就行。主要是三個接口,分別返回登錄信息,websocket的地址和端口,圖片代理等。
5. 代碼client文件中的代碼修改”src/scene/Login.ts”的onLoginTouch方法中請求網絡接口為上面web中配置的域名,”src/Main.ts”中的initGame方法同樣修改網絡請求地址為上面web配置的域名。接口分別是昵稱和登錄token,另一個是websocket地址和端口。
6. 下載上面的Fooking的源代碼,並將代碼放入服務器中,目錄結構如下。
7. 打開服務器命令面板,cd進入fooking目錄(以我的為例,名字可以自定義)。然后make進行編譯。Src目錄中多出后綴為0的文件,面板也會顯示編譯結束。
8. 打開fooking目錄下的router.lua文件。PROT可以自行定義,確定下了這個端口,我的是8015。就需要在centOS防火牆中對其放行,寶塔是直接點擊安全添加8015進行放行。
9. 依然是同級目錄,打開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", };
10. 啟動router.lua。 Cd src,然后./fooking ../router.lua
11. 查看php-fpm配置文件方法,命令輸入, ps -ef | grep fpm。可以看到php-fpm的配置文件。
12. 找到並打開php-fpm.conf文件,可以看到監聽的通信方法以及通信的具體地址,還有fpm的錯誤日志存放地址。寶塔Nginx與fpm默認是以unix socket方法,如果fpm修改成了tcp,那nginx也要修改。
13. 查看fpm.conf后與fooking的config設置完畢后,就可以開始啟動config了。Cd fooking, 然后./fooking ../config.lua。
如果出現Can't found available backend server, Please check BACKEND_SERVER,多是因為config的后端配置填的通信方式與fpm的不一致。其他的就是FASTCGI_ROOT沒填對地址。
14. 最后打開EgretWing導入的client中的源碼,點擊調試,彈出游戲界面,登錄后正常的話就會進入游戲界面了。
Fooking分布式游戲服務器網關結構圖--
15. 啟動的config.lua出現“stream_socket_client(): unable to connect to tcp://127.0.0.1:9010”時,修改server的“config”中的router,IP和端口換成router.lua中配置啟動的地址和端口。
16. 修改server的redis中的為自己安裝的地址和端口,web的api/api/api/include/config.inc.php,修改redis地址和微信公眾號APPID等地址。