征途服务器端架设完全攻略
游戏服务器注意事项?
一、硬件的安装?
1、保证服务器风扇正常转动。?
2、保证服务器各个提示灯是否正常。?
3、开机察看服务器有无报警情况。?
4、开机察看服务器能否正常启动(不插鼠标键盘的情况下)?
二、系统的安装?
安装RHEL 4.1?
选择自动分区。?
分别给2块网卡配置ip,方便以后配置,其中eth0配内网ip,eth1配外网ip。? 不启用防火墙。?
增加中文语言包。?
选择软件包时,只选择开发包.?
三、系统的简单设置?
1、防火墙的简单设置:?
?? vi /etc/rc.d/forward?
:(例子)?
#!/bin/bash?
echo 1 >/proc/sys/net/ipv4/ip_forward? if [ -e /proc/sys/net/ipv4/tcp_ecn ]? then?
echo 0 > /proc/sys/net/ipv4/tcp_ecn? fi?
/sbin/iptables -F?
/sbin/iptables -F -t nat?
/sbin/depmod -a?
/sbin/modprobe ip_tables?
/sbin/modprobe ip_conntrack?
/sbin/modprobe ip_nat_ftp?
/sbin/modprobe ip_conntrack_ftp?
/sbin/iptables -A INPUT -i?? lo -j ACCEPT? /sbin/iptables -A INPUT -i?? eth0 -j ACCEPT? /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT?
#/sbin/iptables -A INPUT -i eth0 -p tcp -j REJECT --reject-with tcp-reset?
/sbin/iptables -A INPUT -i eth0 -p udp -j REJECT --reject-with icmp-port-unreachable?
#sshd?
/sbin/iptables -A INPUT -s 218.80.198.234 -p tcp -m state --state NEW -m tcp --dport
22 -j ACCEPT?
/sbin/iptables -A INPUT -s 218.80.198.250 -p tcp -m state --state NEW -m tcp --dport
22 -j ACCEPT?
/sbin/iptables -A INPUT -s 210.22.188.21 -p tcp -m state --state NEW -m tcp --dport
22 -j ACCEPT?
#ftp server?
#/sbin/iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT?
#game server?
/sbin/iptables -A INPUT?? -p tcp -m state --state NEW -m tcp --dport 6020 -j ACCEPT?
#db server?
/sbin/iptables -t nat -A PREROUTING -s 218.80.198.234?? -d 203.110.165.30 -p tcp --dport 3306 -j DNAT --to 192.168.102.158:3306?
/sbin/iptables -t nat -A PREROUTING -s 218.80.198.234?? -d 203.110.165.30 -p tcp --dport 3307 -j DNAT --to 192.168.102.159:3306?
/sbin/iptables -P INPUT DROP?
/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 192.168.102.0/24 -j MASQUERADE? 保存后退出。?
?? chmod 744 /etc/rc.d/forward?
?? 然后运行防火墙脚本,以后根据需求修改脚本。?
???
?? 再vi /etc/rc.d/only_forward?
#!/bin/bash?
echo 1 >/proc/sys/net/ipv4/ip_forward?
if [ -e /proc/sys/net/ipv4/tcp_ecn ]?
then?
echo 0 > /proc/sys/net/ipv4/tcp_ecn?
fi?
/sbin/iptables -F?
/sbin/iptables -F -t nat?
/sbin/depmod -a?
/sbin/modprobe ip_tables?
/sbin/modprobe ip_conntrack?
/sbin/modprobe ip_nat_ftp?
/sbin/modprobe ip_conntrack_ftp?
/sbin/iptables -A INPUT -i?? lo -j ACCEPT?
/sbin/iptables -A INPUT -i?? eth0 -j ACCEPT?
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT? #/sbin/iptables -A INPUT -i eth0 -p tcp -j REJECT --reject-with tcp-reset? /sbin/iptables -A INPUT -i eth0 -p udp -j REJECT --reject-with icmp-port-unreachable?
#sshd?
/sbin/iptables -A INPUT -s 218.80.198.234 -p tcp -m state --state NEW -m tcp --dport
22 -j ACCEPT?
/sbin/iptables -A INPUT -s 218.80.198.250 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT?
/sbin/iptables -A INPUT -s 210.22.188.21 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT?
#ftp server?
#/sbin/iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT?
#game server?
/sbin/iptables -A INPUT?? -s 218.80.198.234 -p tcp -m state --state NEW -m tcp --dport 6020 -j ACCEPT?
#db server?
/sbin/iptables -t nat -A PREROUTING -s 218.80.198.234?? -d 203.110.165.30 -p tcp --dport 3306 -j DNAT --to 192.168.102.158?
/sbin/iptables -t nat -A PREROUTING -s 218.80.198.234?? -d 203.110.165.30 -p tcp --dport 3307 -j DNAT --to 192.168.102.159:3306?
/sbin/iptables -P INPUT DROP?
/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 192.168.102.0/24 -j MASQUERADE?
此防火墙只允许公司的电脑可以登录游戏。?
2、设置系统自动启动防火墙?
????vi /etc/rc.d/rc.local?
增加一行?
????/etc/rc.d/forward?
???? 保存后退出?
3、设置文件打开数?
1) 修改/etc/security/limits.conf 增加2行:?
*????????soft???? nofile?? 4096?
*????????hard???? nofile?? 65535?
2) 修改/etc/pam.d/login 增加1行?
session required?? pam_limits.so?
可用:?
echo “*??????soft???? nofile?? 4096” >>/etc/security/limits.conf?
echo “*????????hard???? nofile?? 65535” >>/etc/security/limits.conf?
echo “session required?? pam_limits.so” >>/etc/pam.d/login?
4、修改默认语言?
????vi /etc/sysconfig/i18n 修改?
LANG="zh_CN.GB2312"?
新建游戏运行用户ztgame,设置密码?
useradd ztgame?
passwd ztgame?
用ztgame用户登录服务器,修改vi /home/ztgame/.bash_profile增加一行? ulimit –c unlimited?
????保存后退出。?
四、游戏环境的搭建(按照4台网关服务器,5台场景服务器,1台数据库服务器的构架)? 1、服务器IP设置?
4台网关服务器配置外网ip和内网ip,5台场景服务器和数据库服务器只配置内网ip,并且服务器默认网关为第一台网关服务器的内网ip。?
服务器以服务器应用-序号-机房序号命名(例GWServer01-CHJ01)。?
修改/etc/hosts。?
例子:?
127.0.0.1????????????????GWServer01-CHJ01 localhost.localdomain localhost?
192.168.100.101??????????GWServer02-CHJ01? „„„?
192.168.100.104??????????ScenServer01-CHJ01? „„„?
192.168.100.109 DBServer-CHJ01?
2、公钥的生成?
在ztgame的用户下登陆第一台网关服务器,输入ssh-keygen -t dsa? 接受 ~/.ssh/id_dsa 的默认位置。输入一个与你的帐号口令不同的口令句,再输入一次来确认。公钥被写入 ~/.ssh/id_dsa.pub。密钥被写入 ~/.ssh/id_dsa。?
使用以下命令改变你的 .ssh
的许可权限:?
chmod 755 ~/.ssh?
把 ~/.ssh/id_dsa.pub用scp命令传到其它剩余9台服务器?
scp~/.ssh/id_dsa.pub?ztgame@192.168.102.108:~/.ssh/authorized_keys?
在其它9台服务器下使用以下命令改变你的 authorized_keys 文件的许可权限:? chmod 755 ~/.ssh?
chmod 644 ~/.ssh/authorized_keys?
3、数据库服务器的安装?
#首先确定你是root用户?
#确定你有以下包?
perl-DBD-MySQL-2.9004-3.1?
perl-DBI-1.40-5?
mysql-4.1.7-4.RHEL4.1?
获得mysql-4.1.*.tar包,用tar –zxvf mysql-4.1.*tar解开压缩包,然后进入mysql-4.1.*
目录?
#根据体统类型选择编译方式?
#i386体系结构的?
CFLAGS="-O3 -mcpu=pentiumpro" CXX=gcc CXXFLAGS="-O3 -mcpu=pentiumpro -felide-constructors -fno-exceptions -fno-rtti" ./configure --with-raid --enable-thread-safe-client --enable-assembler?? --with-server-suffix =" for >>>MySQL Database of Zebra by Yhc<<<" --without-debug --with-extra-charsets=none --without-isam --disable-shared --with-mysqld-ldflags=-all-static --prefix=/usr/local/mysql --without-bench?
#64位系统,x86_64?
CFLAGS="-O3 -m64" CXX=gcc CXXFLAGS="-O3 -m64 -felide-constructors -fno-exceptions -fno-rtti" ./configure --with-raid --enable-thread-safe-client --enable-assembler?? --with-server-suffix =" for >>>MySQL Database of Zebra by Yhc<<<" --without-debug --with-extra-charsets=none --without-isam --disable-shared --with-mysqld-ldflags=-all-static --prefix=/usr/local/mysql --without-bench?
#然后根据CPU数量进行编译?
make -j 2 && make install?
#添加用户?
groupadd mysql && useradd -g mysql mysql?
#创建目录?
mkdir /usr/local/mysql/data && mkdir /usr/local/mysql/run && mkdir /usr/local/mysql/log && mkdir /usr/local/mysql/var?
#更改mysql目录所有者?
chgrp mysql -R /usr/local/mysql && chown mysql -R /usr/local/mysql?
#增加打开文件数量?
ulimit -n 4096?
#添加PATH?
echo " ATH=\"/usr/local/mysql/bin:\$PATH\"" >> /etc/profile && export PATH="/usr/local/mysql/binPATH"?
#strip可执行文件?
strip /usr/local/mysql/libexec/mysqld?
#添加LIB PATH?
echo "/usr/local/mysql/lib" >> /etc/ld.so.conf && ldconfig?
#将my.cnf文件cp到/etc目录下?
cp support-files/my-huge.cnf /etc/my.cnf?
#修改my.cnf?
datadir=/db/mysql?
#创建数据库存放路径?
mkdir /db?
chown mysql.mysql /db -R?
#初始化Mysql
?
su - mysql -c "mysql_install_db"?
#启动服务器?
su - mysql -c "mysqld_safe --skip-name-resolve --open-files-limit=4096&"?
#创建数据库和用户?
GRANT ALL PRIVILEGES ON *.* TO ztgame@'192.168.104.%' IDENTIFIED BY '' WITH GRANT OPTION;?
GRANT ALL PRIVILEGES ON *.* TO ztgame@'localhost' IDENTIFIED BY '' WITH GRANT OPTION;? GRANT ALL PRIVILEGES ON *.* TO ztgame@'218.80.198.234' IDENTIFIED BY '' WITH GRANT OPTION;?
4、数据库配置?
用mysql进入,然后用create database dbname创建数据库。分别创建SuperServer、
RecordServer、Bill数据库,然后用安装包目录下的*.sql的文件建立相应的表。
(SessionServer.sql也导入到RecordServer库中)。?
在SuperServer数据库SERVERLIST表内添加服务器配置信息。?
例子:?
INSERT INTO `SERVERLIST` VALUES
(1,1,'SuperServer','192.168.104.109',10000,'192.168.104.109',10000);? INSERT INTO `SERVERLIST`
VALUES(20,20,'SessionServer','192.168.104.109',6000,'192.168.104.109',6000);? INSERT INTO `SERVERLIST`
VALUES(21,21,'SceneServer','192.168.104.104',6010,'192.168.104.104',6010);? INSERT INTO `SERVERLIST`
VALUES(22,21,'SceneServer','192.168.104.105',6011,'192.168.104.105',6011);? INSERT INTO `SERVERLIST`
VALUES(23,21,'SceneServer','192.168.104.106',6012,'192.168.104.106',6012);? INSERT INTO `SERVERLIST`
VALUES(24,21,'SceneServer','192.168.104.107',6013,'192.168.104.107',6013);? INSERT INTO `SERVERLIST`
VALUES(25,21,'SceneServer','192.168.104.108',6014,'192.168.104.108',6014);? INSERT INTO `SERVERLIST`
VALUES(2200,22,'GatewayServer','192.168.104.100',6020,'210.51.23.132',6020);?
INSERT INTO `SERVERLIST`
VALUES(2201,22,'GatewayServer','192.168.104.101',6020,'210.51.23.133',6020);?
INSERT INTO `SERVERLIST`
VALUES(2202,22,'GatewayServer','192.168.104.102',6020,'210.51.23.134',6020);?
INSERT INTO `SERVERLIST`
VALUES(2203,22,'GatewayServer','192.168.104.103',6020,'210.51.23.135',6020);?
INSERT INTO `SERVERLIST`
VALUES(11,11,'RecordServer','192.168.104.109',7010,'192.168.104.109',7010);?
INSERT INTO `SERVERLIST`
VALUES(12,12,'BillServer','192.168.104.109',7020,'192.168.104.109',7020);?
在RecordServer数据库上初始化某些表格,目前有ANSWER,TECH,COUNTRY,NPCDARE,
ACCPRIV。?
数据库服务器上跑SuperServer、SessionServer、RecordServer、BillServer四个服务,4
个网关服务器分别跑4个网关服务,5个场景服务器分别跑5个场景服务。场景服务器对应
的ID就是国家配置的ID号,这个ID号决定场景服务器上面跑几个国家。?
五、服务端的配置和安装?
1、获得安装包:?
release-version.tar.bz2?
map-version.tar.bz2?
在/home/ztgame下建立以时间为名字的目录(game20050928),压缩包放入此目录,然后用
tar –jxvf?? release-version.tar.bz2 和tar –jxvf map-version.tar.bz2解开压缩包?
进入release目录,cp –rf ../map .?
按照config.xml.example格式创建文件config.xml?
配置文件主要定义了服务器的各种参数:?
[global]这段主要定义了通用参数,如服务器本地网络设备名称,扩展网络设备名称,日志
级别,SuperServer的服务器地址,端口等参数。?
其他各个段定义了具体的服务参数,主要是指定该服务对应的数据库,数据库的连接地址,
端口,用户名,密码等数据库连接字符串。每个服务可以定义日志文件的存放位置,如果没
有指定,缺省放置在/tmp/目录下面。?
如SuperServer服务?
?
???????????????? ? ????????????????
mysql://test:123456@192.168.2.14:3306/SuperServer? ???????????????? /home/test/tmp/superserver.log?
?
上面配置指明SuperServer服务,采用连接串用户名test,密码123456,访问192.168.2.14
服务器上3306端口下SuperServer数据库,日志文件存放在/home/test目录下。其他服务
配置类似。?
例子:?
?
?
?
?
?? ? ?? debug?
?? ? ?? ?
?? eth0?
?? ?
?? 192.168.104.109? ?
?
???????????????? ?
???????????????? loginServerList.xml? ???????????????? ?
???????????????? 218.80.198.252? ???????????????? ?
???????????????? 218.80.198.252? ???????????????? ?
?? mysql://ztgame:yS29wahvCH@192.168.104.109:3306/SuperServer? ???????????????? ?
???????????????? /log/superserver.log? ???????? ?
?
?? ? ?? mysql://ztgame:yS29wahvCH@192.168.104.109:3306/RecordServer? ?? /log/recordserver.log?
?
?
???????????????? ?
????????????????
mysql://ztgame:yS29wahvCH@192.168.104.109:3306/Bill? ?? /log/billserver.log?
?
?
?? ?
?? /log/clienttrade.log? ?
?
?? ? ????????????????
mysql://ztgame:yS29wahvCH@192.168.104.109:3306/RecordServer? ?? /log/sessionserver.log? ?? 3600?
?? /log/offlineMessages? ?
?
?? scenesinfo.xml?
???????????????? npctrade.xml? ???????????????? messageSystem.xml? ???????????????? initcharinfo.xml? ?? magicrangefile.xml? ?? quest/?
???????????????? map/?
???????????????? map/?
???????????????? /log/gm_log.log? ???????????????? ?
?? 300?
?? /log/?
?? /log/scenesserver.log??? ?
?
???????????????? ?
???????????????? 2?
???????????????? /log/gatewayserver.log? ???????????????? scenesinfo.xml?????????????????
???????????????? 1? ???????????????? forbidWords? ?
?
注意存放日至的目录是否建立,以及建立session服务所要求的日志存放子目录
offlineMessages。?
修改loginServerList.xml,填入平台中心的FLServer服务器ip以及端口。?
例子:?
?
?
???????? ? ???????? ?
?
然后将修改好的版本传至其它9台服务器。并启动服务?
六、服务器的启动,停止和更新?
1、将运行脚本传至各个服务器。?
2、开启游戏服务?
通过ssh使用ztgame用户远程连接至第一台网关服务器,再通过网关服务器连接其他9台服务器,?
10个窗口内分别进入最新的服务端存放目录/home/ztgame/game200508**/release/?
数据库服务器 启动服务./SuperServer -d 和 ./SessionServer -d 和 ./RecordServer -d??
和 ./BillServer -d?
场景服务器 启动服务./ScenesServer -d?
网关服务器 启动服务./GatewayServer -d?
以上操作可以通过/home/ztgame/tools/allstart game200508**来启动(由于程序是后台运行,所以如发现程序运行时间过长,可以CTRL+c中断,并不影响程序的正常运行。)?
3、停止游戏服务?
通过ssh使用ztgame用户远程连接至第一台网关服务器,运行/home/ztgame/tools/allstop,
中止所有服务?
,此脚本是并不是强行杀进程,所以如果发现进程无法kill的情况,用/home/ztgame/tools/allstop_9来强行杀死进程。?
4、查看游戏服务?
通过ssh使用ztgame用户远程连接至第一台网关服务器,运行/home/ztgame/tools/allview,
查看所有服务运行状态。?
5、更新游戏服务?
通过ssh使用ztgame用户远程连接至第一台网关服务器,再通过服务器连接其他9台服务器,?
分别在/home/ztgame目录下面建立最新的服务端存放目录game200508**.?
然后将服务器端安装包通过scp传到第一台网关服务器,在game200508**下解压。?
tar jxvf zebra-release-*****?
tar jxvf zebra-release-*****?
cp map release/ -rf?
然后从上一个版本里拷贝出一些配置文件覆盖源文件?
cp /home/ztgame/game_old/release/config.xml /home/ztgame/game_new/release/?
cp /home/ztgame/game_old/release/loginServerList.xml /home/ztgame/game_new/release/?
cp /home/ztgame/game_old/release/messageSystem.xml /home/ztgame/game_new/release/?
以上工作准备好后就可以将网关服务器上的版本传到其他服务器?
scp -r /home/ztgame/game_new/*?ztgame@192.168.100.111:/home/ztgame/game_new?
以上操作可以通过shell脚本来实现?
/home/ztgame/tools/installPackage game_new game-old?
七、服务器数据的备份?
1、数据备份?
为了防止意外情况的发生造成数据的丢失,关键数据或整个系统或对有选择的系统部分,在
本地和异地进行定时备份,以保证系统全部或部分在灾害出现时也能持续运行。?
2、具体方案?
1)、数据库每日备份?
????每天4:00,将RecordServer数据库拷贝至/root/back后进行压缩,然后上传至
192.168.1.9服务器上,/root/back留有压缩版本。?
????运行脚本/root/scripts/back.sh?
例子:?
#!/bin/bash?
rm /root/back/RecordServer/* -rf?
/usr/local/mysql/bin/mysqlhotcopy RecordServer /root/back/RecordServer -u ztgame
-p yS29wahvCH?
sleep 5?
cd /root/back?
tar zcf `hostname`-RecordServer`date +%Y%m%d`.tar.gz RecordServer?
sleep 5?
echo "tar ok!"?
/usr/local/bin/ncftpput -u gamebak -p gamebak@ztgame 218.80.198.234 /??
/root/back/`hostname`-RecordServer`date +%Y%m%d`.tar.gz? sleep 20?
echo "upload RecordServer ok!"?
2)、数据库即时备份?
每隔1小时,将RecordServer数据库拷贝至/root/back/hour目录进行备份,然后将压缩文
件传给特定服务器。?
例子:?
#!/bin/bash?
hottime=`date +%Y%m%d%H%M`?
mkdir /root/back/hour/RecordServer"$hottime"?
/usr/local/mysql/bin/mysqlhotcopy RecordServer
/root/back/hour/RecordServer"$hottime" -u ztgame -p yS29wahvCH? sleep 5?
cd /root/back/hour?
tar zcf `hostname`-RecordServer"$hottime".tar.gz RecordServer"$hottime"? sleep 5?
echo "tar ok!"?
/usr/local/bin/ncftpput -u backupdb -p backupdb 192.168.102.119 /?? /root/back/hour/`hostname`-RecordServer"$hottime".tar.gz? sleep 20?
echo "upload RecordServer ok!"?
rm `hostname`-RecordServer"$hottime".tar.gz -f?
3)、日志备份?
????每天02:00,将/log/下前一天的日志,进行压缩,然后上传至192.168.1.9服务器。?
????运行脚本/root/scripts//upload_daily?
例子:?
#!/bin/bash?
cd /log/?
mkdir log`date --date '1 days ago' +%Y%m%d`?
mv *.log.`date --date '1 days ago' +%y%m%d`-*?? log`date --date '1 days ago' +%Y%m%d`?
sleep 10?
tar zcvf `hostname`-log`date --date '1 days ago' +%Y%m%d`.tar.gz log`date --date '1
days ago' +%Y%m%d`?
/usr/local/bin/ncftpput -u log -p log@ztgame 218.80.198.234 /?? /log/`hostname`-log`date --date '1 days ago' +%Y%m%d`.tar.gz? rm `hostname`-log`date --date '1 days ago' +%Y%m%d`.tar.gz?
注:计划任务通过/etc/crontab –e来进行设置?
4)、即时日志备份?
????直接运行/home/ztgame/tools/upload 将最新日志上传至192.168.1.9服务器,方便研
发部门查看。?
????运行脚本/home/ztgame/tools/upload,(如果所有服务器的日志都需要上传,可以运行
网关服务器上的/home/ztgame/tools/allupload)