软件简介:
$ W; { n9 a, B6 u3 t6 _3 f; l- [编辑注:本款游戏非一键端,但包含所有架设工具。有文字架设教程,架设环境需要是linux环境。, a0 S/ A" p! u$ g
需要一定经验才可以架设,内含苹果、安卓双客户端。
( q/ g, z$ s. [9 t4 |4 s% _0 a( R$ C服务端客户端源码都有C++开发,需要修改字符集编码支持.
$ Z4 B6 O v2 \% U! l' @现在只支持中英文字符,输入也只支持中英文5 ] @3 [+ I1 `0 o/ D
S2服务器部署文档
7 x. M# w6 o, q( f2 A服务器架构:
: r# J) \9 _6 C) y, C服务器种类:& ~6 Z8 _- E+ R9 L4 e2 i+ f
分为全局服务器和游戏区服务器(提示,可参照下文服务器架构图)
3 s4 L7 U3 ^, A6 ]/ @) ^6 S全局服务器:
% O6 o$ w' z" A每种服务器只需要一台. (对于登录服和子列表服来说, 如果压力较大,可以使用负载均衡机制部署多台)5 J2 N0 @- b- [" M
全局服务器包括:7 w$ C+ E+ i5 u5 g$ ~
bill91server 91付费服务器, 处理支付页面(见下面的ztpay.php)发来的支付数据, 转个各个逻辑服
( [* f2 H# K5 V/ E- n1 z/ p, ]loginserver 登录服务器, 主要用于玩家登录时验证账号信息,第三方token等" j7 y9 I) ]% ]/ x) A
superserver 列表服务器, 管理客户端的服务器选择界面4 x ]3 \! o; K3 R# i: N9 i/ @
Sublistserver 子列表服务器, 功能同sublistserver, 可以使用负载均衡机制开启多个子列表服来减压
& B; g! ?& u* ]8 Q& k3 z& L( Hglobalserver 跨服服务器, 处理一个跨服逻辑(如:跨服战, 跨服聊天)
8 x$ o$ x4 b9 _8 q3 C0 \" B! ~9 ]ztpay.php 91付费用php页面,各个渠道支付成功后访问 的页面, 负责把订单转给billserver
1 w7 v2 c& V5 }4 k. A7 P游戏区服务器:% c5 Z" j! d x' w3 t1 X9 {+ m' X
一组游戏区服务器支撑一个游戏区的正常运行.一组游戏区包括:
: f N0 W( {1 T2 k" y6 C! Tdbserver 数据库服务器, 数据库的前端, 逻辑服加载和保存游戏数据通过dbserver来中转, 一组游戏区有且只有一个: u; H% D- F* I' n% s$ H
gamegate 网关服务器, 客户端连接的服务器, 用于把客户端的数据转发给逻辑服, 一组游戏区可以有一到多个) Y9 @1 f0 B. G6 p7 p0 Q8 t8 S4 P
gameserver 游戏主逻辑服务器, 一组游戏区有且只有一个
3 h# J% P, q" _1 Tmanagerserver 进程管理服务器, 可以启动一个服务器组(dbserver, gameserver+若干gamegate, 监视他们的运行,发现有异常会自动重启, 一组游戏区有且只有一个" u. u2 g& U# ^! u U0 q7 V' q( r
1 l" u6 s& p1 J: q8 t; L
另有一些http服务代码后续介绍' Z: }4 |) N9 |/ P& x
服务器架构图:* c0 q, y8 P6 P( W% ?# h
' Q5 f/ `! |# Q T- u6 J5 \
7 K1 `% `+ B' g6 {# X# q说明:$ j3 q+ c, E+ @' R; L, q
1.Client1,client2表示手机客户端先去连接sublistserver获取服务器列表,当玩家选择好服务器区后,会断开sublistserver的连接,再去连接对应服务器的网关
8 d$ }- R* \- C5 ?4 \2.Ztpay.php到billserver的虚线表示这个连接是个短连接, 其他的实线都是长连接( i9 C3 e6 R+ V3 h1 P& q
推荐配置
7 {3 G. ?0 c. q% g" p5 ^( y' L机器环境安装:
! w R8 K4 N. f: `0 j. {, H/ H需要至少两台云服务器, 一个作为全局服, 另一台作为游戏服, 每新增一个游戏服,都要新增一台机器0 m) m+ Q5 P( }' u; r5 ^) n8 W
机器配置如下:3 G) G, F: O& B ?1 ?
Centos6.3 64位, 5 O0 Z: `2 F y
8核CPU" ^0 M. B9 d) v) U* X' M
16G 内存
2 A8 T- U- v* n0 Y4 g: p0 b500G硬盘
5 M7 o* s4 |* S7 [机器需要安装的软件见《软件安装.docx》
# t. [$ S4 K) w5 R- r: W全局服配置:
+ X. q" h7 @) e: O数据库创建:
% D1 _ r3 v* Pmysql_cmd='mysql -ppassword' (这里password改成数据库的密码)) ]4 N. R% T9 [- _ }* U
$mysql_cmd create_battle_field.sql
$ T: z9 q: P- s1 f# \$mysql_cmd battle_field battle_field_update.sql5 \, G) j* \0 l- A1 K0 C
$mysql_cmd create_paydatabase.sql
- W+ c9 G# o7 O, t- K/ }python create_ztnet_account.py5 V. B( R9 Y) P# e2 n% C2 E- e
$mysql_cmd create_ztnet_account.sql/ ~/ \" P* ]" K7 n& m# z
$mysql_cmd create_ztnet_account2.sql! I/ h7 t0 B* m+ j& h& n& X
python create_ztnet_account_to_userid.py
4 _0 l" f0 z$ s- W$ E$mysql_cmd create_ztnet_account_to_userid.sql$ Z+ A, V! F/ {# y3 z
$mysql_cmd create_ztnet_account_to_userid2.sql! k' E% ^7 Y7 z* j
$mysql_cmd create_ztnet_activity.sql1 P1 v# z% E% H$ M' i7 ^$ u) B4 i% x
$mysql_cmd create_ztnet_ctupay.sql
# a5 | L# {5 ~/ W) X3 F# E/ p$mysql_cmd create_ztnet_loadfail.sql
, `8 n+ j5 u9 M* u$mysql_cmd create_ztnet_login_key.sql5 ^% D) N: p4 n' g, N$ N; q* N- j" |
$mysql_cmd create_ztnet_phonecard.sql. e& N8 D8 S1 }# |8 l+ o
python create_ztnet_user.py
/ y# J+ g& N) u) L$mysql_cmd create_ztnet_user.sql2 O# y5 x U" Z: ~
python create_ztnet_vip.py
* V: k5 J8 _6 c Z( L- j$mysql_cmd create_ztnet_vip.sql
" w% }5 w- K! A J5 n" {$mysql_cmd paydatabase paydatabase_update.sql
' x9 d0 h7 _! F$mysql_cmd ztnet_activity ztnet_activity_update.sql
) k, ?6 ?3 j# m' C$mysql_cmd create_ztnet_cdkey.sql
; \0 v. f" o/ a2 E$mysql_cmd ztnet_cdkey ztnet_cdkey_udpate.sql
/ V0 j# O0 @( q6 W, P, S: l" {修改/etc/my.cnf文件 max_connections = 100 改成max_connections = 800,重启数据库! L2 P$ }) ^- F# n' @1 `
程序和配置文件:6 F p) f/ l! y- O
所有全局服可以部署在同一个机器的同一个文件夹下, 这里以文件夹/data/superserver为例
! X+ Q6 Y Y Y% E/ T: \8 a需要准备程序文件有globalserver/superserver/loginserver/sublistserver/billserver, 配置文件有server_config.lua ss_config.lua male.txt female.txt LuaScript/BattleField.lua LuaScript/globaldefine.lua find_pid_of_this_dir.sh* g" G+ D7 w( G2 g3 L
需要修改的配置文件有:4 L' \8 s9 ]& e3 ~
Server_config.lua:( [/ a5 P" n5 o3 i8 i3 U
global_outer_ip = XXXX 后面的改成全局服的外网ip- z3 I8 R* [6 W
global_inner_ip = xxxx 后面改成全局服的内网ip$ P7 B" K) h1 d) P4 T: D$ G
ls_vip = global_inner_ip, 如果登录服使用负载均衡, 后面改成负载均衡的virtual_ip: r% r) ~! C; ?
db_password = XXXX 后面的改成数据库的密码" E$ O. e- i6 M
Specific_config/sconfig.json:4 V6 h3 ~! e4 F
ss_config | list_url:XXXX 后面改成GM工具的列表信息页面地址' B& L+ q6 L0 m: b/ ^# @# p: f
防火墙:
) W- \2 }6 e5 b; n |. n5 D所有机器的内网应该保证都是互通的. 对于全局服的机器, 需要对外网开放的端口有:1119(superserver). 如果sublistserver不使用负载均衡,则sublistserver的端口要对外开放(默认是1120), 如果使用了负载均衡,则负载均衡的端口要对外开放2 m" g3 O: [- D
启动程序:
' o- c/ c; Y9 }2 n% M7 \. l依次执行以下命令' ~2 ?7 _- W# g! p. X. F& x5 `5 n
./back_run.sh superserver" @$ f( o/ S5 _
sh start_login.sh : E" ^/ |! G: f- \
sh start_sublist.sh & [$ h7 ^0 m A& X' Z/ w7 ]/ d
./back_run.sh globalserver& `) H1 s& ^7 E6 \3 U. ]1 n
./back_run.sh bill91server
" @9 h1 d$ s& ^ W; r6 w: A上面5个命令每次启动一种全局服, 可以每启动一种全局服后用 sh find_pid_of_this_dir.sh 查看程序进程是否成功, 全部成功后有类似以下输出:
' ]; {" o1 Z! a( Jgamegate
4 G# l$ I% \: b v. q1 R6 Jgameserver
/ g' Q9 y" I, s* [; Vdbserver$ ~, e8 q, m+ Y5 F( ~
managerserver
2 B& v p" l. a* F6 o% B( ^! ?0 R& p+ ]superserver 8625
1 R; G% Q3 e: |7 u7 v k/ _loginserver 9393 9394 9395 9396 9397* A* v- z8 h3 p$ C; D- m7 B
sublistserver 10150 10151 10152 10153 101540 D3 D7 D( w( x4 R
globalserver 10234
1 Q: N F$ J8 w' C% _: O' vbill91server 18223
( |/ o% R2 Q% S: w o/ W7 ]# w上述显示表明,superserver,globalserver和billserver各启动了一个, loginserver和sublistserver各启动了5个
2 o9 V6 T* i/ b( t! M游戏区服配置:2 f7 a, C6 j5 ~, V9 q
数据库创建:3 ?+ M4 J6 I3 m5 x
执行命令1 N! M8 D) f/ g+ N' d
mysql_cmd=mysql -pdb_password (db_password换成数据库密码): `7 N6 g9 H) X" R: \
$mysql_cmd -e create database server1 default charset=utf8mb4 collate=utf8mb4_bin;
P7 F3 h& L) R+ Y$mysql_cmd -e create database serverlog1 default charset=utf8mb4 collate=utf8mb4_bin;. x" n, M9 f/ Z$ g' C, D/ l
$mysql_cmd server1 create_ztnet.sql
& J3 h5 s/ o7 N/ D- ]/ L$mysql_cmd serverlog1 create_ztnetlog.sql
+ H- t6 ]/ P! W$mysql_cmd server1 ztnet_update.sql 9 ~9 o E5 ~2 _, }, V4 `
$mysql_cmd serverlog1 ztnetlog_update.sql , W! {! z% E6 A$ k
程序和配置文件:
; h0 m; Z) o& E3 u3 H, QManagerserver/dbserver/gameserver/gamegate可配置在同一目录下, 默认放在/data/gameserver/server1/下.
- H0 k! X ], a+ e7 o' c以下假定 要配置的服务器区号为zone_id1, 服务器名为server_name14 V; y+ }6 w' m7 y
需要修改的配置文件如下:8 x4 c3 ~; k# z2 D5 Q7 }$ |4 y
Server_config.lua:8 D9 }3 [# x+ b9 O3 R) Q
global_outer_ip = XXXX 后面的改成全局服的外网ip* n: V$ G2 w# \2 N! O
global_inner_ip = xxxx 后面改成全局服的内网ip
$ x6 f3 B. R* Z! z. Cls_vip = global_inner_ip, 如果登录服使用负载均衡, 后面改成负载均衡的virtual_ip U9 F6 @/ {9 M3 C' M3 K
db_password = XXXX 后面的改成数据库的密码7 E6 y9 T" M8 _/ l
this_outer_ip = XXXX 后面改成游戏区服的外网ip' U. L2 j, p" n, ~# d( {- M4 c
Zone_id = xxxx 后面改成zone_id18 V0 Y& S6 B ~6 {
Server_name= xxxx 后面改成server_name1# l' o! B& Z4 q# J2 m& {' ]1 L" F
specific_config/server_name_and_zone.json, `: k, G$ [- X7 v1 w r
测试2: 1 改成 server_name1:zone_id1, l& j# D; U9 ^& m, T3 X6 b
Specific_config/sconfig.json
B) x# X2 R9 Z% _8 y: Y里面的所有118.194.50.122均为测试环境的ip, 不修改它可以正常启动程序, 但游戏对玩家开放前一定要改成真实环境的ip$ p" P3 [8 A6 B" ^( W0 o, E
user_picture_url_header : http://118.194.50.122/user_picture/, 游戏开放前, 要改成http://本机外网ip/user_picture
- U; I0 a+ e! C- d1 P) k3 rpromotion2_update_url : http://118.194.50.122:8899/promotion/,) C$ ^+ J6 c2 B$ m% l% @0 x
promotion3_update_url : http://118.194.50.122:8899/promotion3/, 游戏开放前, 要改成GM工具的页面地址
& J0 n" D" S! O7 ~7 i( H! H" t z, X. K, M9 S
HTTP SERVICE配置
( K; O" Z, T9 f/ p+ K全局服配置
+ U2 Y* ^& [1 {- b3 G( F1.首先安装apache, mod_wsgi, (这里没有安装文件, 可以使用yum等工具自行安装)6 u8 O% }* w- B N4 `8 b$ r
2.使用python模块的安装程序如easy_install, pip等安装如下python模块:
: }* ^* C. R% R" O9 w; aWeb.py( O' |$ D( r0 R( A( S
3.分别进入到cdkey_service, giant_cdkey, kuafu_rank, tencent_level_gift, user_picture_gm, zhifubao_code, zt_yimin_gm文件夹, 运行sh install.sh% e' H- Z; K! P3 R) p: W* m
4.全部执行完后, 执行service httpd restart& u( V5 d+ E1 e
5.执行 cp giant_pay.php /var/www/html/ ~+ }7 f0 f, r1 m
游戏区服配置( _$ y) m4 w% @1 H: Y P, `! d
1.首先安装apache, mod_wsgi, (这里没有安装文件, 可以使用yum等工具自行安装)
+ }& Z) }' f' v6 A6 ^1 H( k! @2.使用python模块的安装程序如easy_install, pip等安装如下python模块:
; o/ D$ R. P3 H6 r4 m% wWeb.py
8 {+ f" Q9 K8 M( P& }. Q3.分别进入到user_picture文件夹, 运行sh install.sh4 x$ d( A1 W, b9 G2 a2 Y
4.全部执行完后, 执行service httpd restart
4 ~- _* @) F, K" b% g1 B. k1 g9 k/ T" F
0 k- b6 d1 A3 X' P& N1 ^) t
架设步骤教程:
) ]* v) |9 u9 m% F! z% Q1、操作系统为Centos6.3_64位,需要安装的包:6 r/ z* J# W( {2 u
lua-5.1.5
& O: ]. s1 {0 o5 s0 Zcmake-2.8.7
& r* e: B1 o: V; s7 p% Z' \; Xmysql-5.5.23/ i; Z; l( m! U: V- j
mysql++-3.1.0
; f/ `% X+ Y9 W. O2 P! g% Nboost_1_49_0
, O( ~6 F6 X0 W. o' m5 P+ ~9 ]% \tar -xzvf lua-5.1.5.tar.gz' Z8 ^1 ~0 r& A3 A8 r
cd lua-5.1.5
7 I' y- p' ?0 Z然后执行make,' U" e1 D! D4 n- g: K9 s
会提示让你输入make 系统,因为我的系统是linux的,
, `5 [, M, c" O) X& N因此我输入make linux' H8 }4 o! Z- P1 a& a1 X
2、编译安装boost
3 j9 P% x( L6 e3 A4 v T: @#tar -zxvf boost_1_49_0.tar.gz
# U, c" }; J0 X L# Q. }3 l#cd boost_1_49_0
$ ^5 i" L! {& {% H: X5 k/ W#./bootstrap.sh) T; s% s. @/ V: N+ b" n
#./b2 install$ G& W1 G6 V5 s: R1 U5 F3 A; f# h
3、MYSQL5.5安装详细步骤:4 Z" d! b1 c0 s; w
#tar zxvf cmake-2.8.7.tar.gz -C /usr/local/src/
l9 Y. e* l7 q- J( ?) |8 n#tar zxvf mysql-5.5.23.tar.gz -C /usr/local/src/( Q' e6 `5 ~9 g/ F6 U
# cd /usr/local/src/cmake-2.8.7/
p0 Q8 ^' _1 U4 ^' R& i: M# ./configure # |: t& |' K. t' R5 {3 L
# gmake
d7 O+ Q+ o0 E0 u: x1 g# vim /etc/profile# g ~& X9 ~0 B5 r# W
export PATH=/usr/local/mysql/bin:$PATH 添加. B1 Y: t4 k4 X; P. j( W3 i6 T' J
# . /etc/profile
' C T5 v9 i( i4 |- N3 D$ a1 ?. Y启动mysql:. y( X6 g) \$ ^6 p' X4 }* {
/etc/init.d/mysqld start
9 o9 O- H. Q( x: Y+ N- wchkconfig --add mysqld u* O& S9 F m# ^% u( R$ m
chkconfig mysqld on
* B h6 Y4 o# j. T2 Z# N8 f) E6 D' e# mysql
% j N% M* G8 J4 a7 \% ?. pmysql
$ a) E( v {9 u3 \2 Y: u4 V9、mysql++安装
z. `8 k% i3 Y/ S4 Dtar -zxvf mysql++-3.1.0.tar.gz
; }3 ^3 T- r1 kcd mysql++-3.1.0( o8 o5 [5 `6 [- `1 F
./configure: _; I" s1 w3 e4 N% v
make
, x( j# K: S; {2 L0 Lmake install
/ W' Q. |3 y& E! u# pwd- i; _% Q4 h9 [% R; K6 Q- |
/root/mysql++-3.1.0 k8 s) u3 p: R" l- i1 ~2 G
#vim ssx/genv2.cpp 根据报错在这个文件中找到相应位置添加最下面那条命令
& v* Q6 a( t& p2 ^8 @9 l" }#include iostream
+ U9 [% p/ @; I* i k#include fstream7 \( T! {2 t$ J6 }" a9 F W0 j, F1 T
#include typeinfo
3 f, S- ?: }! P+ u4 [4 V! o* Y#include string.h
t2 L. O1 [7 g+ E' v) a( ~2 M+ y% q程序启动报错解决:
3 m& L" n, I' Rln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/
/ G& ]; S+ O) Ymysql select user,host,password from mysql.user;查看用户信息6 a# f2 W; x5 U$ t# J
+------+------------+-------------------------------------------+2 m6 c3 {9 J) w( p2 C; C( y% Z
| user | host | password |
3 C5 m5 |" r0 M# r+------+------------+-------------------------------------------+
5 P) L I3 U4 z# p8 l| root | localhost | |
) o3 D0 \9 G; h; u| root | 10-6-3-176 | |/ p, u& `# W; z" G& `
| root | 127.0.0.1 | |
* w# l% q2 C9 e- a# U| root | % | |+ {: P* R# m$ |0 ]
+------+------------+-------------------------------------------+$ P% o* d( J/ q( a: u, J3 L( q
4 rows in set (0.00 sec)6 f1 V) k7 y) N% `5 e
mysql set password for root@localhost=password('XXXXXXX');设置root密码# C! J% e/ C+ m7 b- b- Q
mysql set password for root@'10-6-6-23'=password('XXXXXXXX');
9 O0 L) h: F3 ]# D2 e. gmysql grant all on *.* to root@% identified by 'XXXXXXXX';授权% O! @- C4 j. |+ u! ]
mysql select user,host,password from mysql.user;
m. B" b* j* c+------+------------+-------------------------------------------+! [9 ^8 Y9 ?( q: S, U S( M; @- ]- m/ K2 p
| user | host | password |
" D7 ~. I9 O; L+------+------------+-------------------------------------------+
4 j# n# f' @7 A) `$ I5 F& i8 d| root | localhost | *C07583ABFCBBCC5D64C9469E28D4861951C5024A |0 V x% K. y. B" H! G3 K/ k
| root | 10-6-3-176 | *C07583ABFCBBCC5D64C9469E28D4861951C5024A |
6 L, l+ H: r- c) B# F| root | 127.0.0.1 | |
9 N6 m, D$ y* q' ^" o4 z% C2 T| root | % | *4F048907E92401E909B60D4C90426C4D3AEB499D | R4 }8 p% Z# ~* y, p M) Y7 Z
+------+------------+-------------------------------------------++ J. c# u+ F" f2 I, d0 d' n
4 rows in set (0.00 sec)
* D! G; [, E1 L) P% D4 lmysql delete from mysql.user where user='';删除匿名用户
; D* T4 _( H9 g9 d, W0 E+ x0 y
# x0 T# m( C$ |0 T! j: t& ]mysql grant select on uctot.* to 小用户@'%' identified by XXXXXXXX;授权5 E3 r5 F/ X, G0 E$ t0 n; J& {
mysql show grants for root@%;查看用户有那些权限
9 z u% t4 y4 f% K3 t7 x& }mysql grant select on *.* to chinatot@% identified by 'XXXXXXXXX';; u3 w {8 a5 y: [, ]; E
mysql flush privileges;
, l& l; k' v1 ^6 {0 T H* cmysql exit, O; q+ H9 U3 w6 x9 F( t9 L3 R/ c
下载地址:
|