36. 服务器管理Part 4: 发布服务器¶
通过iFun Engine制作好的游戏服务器可以指定服务设置,将其捆绑成包, 并在个别服务器中安装或更新。本文档对该过程进行了说明。 目前支持Ubuntu 14.04 / 16.04和CentOS 6.5 / 7。
36.1. 设置服务¶
Centos 6.5和Ubuntu 14.04使用upstart,Centos 7和Ubuntu 16.04使用systemd。
36.1.1. Upstart: Centos 6.5 & Ubuntu 14.04¶
可以通过在源目录中({{project-name}}-source
)修改以下内容来更改服务设置。
etc/upstart/init/{{project-name}}.conf
拥有服务脚本设置的文件。 追加修改事项请参考 Upstart Intro, Cookbook and Best Practises 进行修改。
Note
当使用 Flavor: 按不同作用来区分服务器 中提到的flavor时,文件名为 etc/upstart/init/{{project-name}}.{{flavor}}.conf
。
Note
对于在 1.0.0-1051
版本以前创建的项目,配置文件位于 etc/init
目录和 etc/default
目录中。
etc/upstart/default/{{project-name}}
是对在服务设置中要使用的值进行定义的文件。
# Sets this to 1 to enable, to 0 to disable
enabled=1
uid=root
gid=root
enabled: 是否激活服务。如该值为1,则服务器重启后服务将自动开始。
uid: 执行服务的账号。默认值为
root
,但为了安全,建议分配其他账户。gid: 执行服务的群组。为了安全,建议分配其他群组,不要使用默认值。
Note
当使用 Flavor: 按不同作用来区分服务器 中提到的flavor时,文件名为 etc/upstart/default/{{project-name}}.{{flavor}}
。
36.1.2. Systemd: Centos 7 & Ubuntu 16.04¶
项目源目录的 etc/systemd/{{project-name}}.service
文件为配置文件。
具体内容请参考 Systemd 页。
Note
当使用 Flavor: 按不同作用来区分服务器 中提到的flavor时,文件名为 etc/systemd/{{project-name}}.{{flavor}}.service
。
示例: 更改执行服务的用户
为了安全,建议创建其他用户来代替 root
,通过相关用户账号执行服务。
下面是通过名为centos的用户和群组来执行服务的示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [Service]
LimitNOFILE=999999
# It is strongly recommended that one should use uid:gid other than the root
# NOTE: Please update User=, Group=, and ExecStartPre=
User=centos
Group=centos
# Makes the daemon automatically restart
Type=simple
Restart=on-failure
RestartSec=5s
# create directories, and change permissions (with root privileges)
PermissionsStartOnly=true
ExecStartPre=/usr/bin/mkdir -p /var/log/funapi/example/glog \
/var/log/funapi/example/activity \
/var/crash/funapi/example
# NOTE: change root:root to service's uid:gid
ExecStartPre=/usr/bin/chown -R centos:centos /var/log/funapi/example/glog \
/var/log/funapi/example/activity \
/var/crash/funapi/example
ExecStart=/usr/bin/example-launcher
|
36.2. 创建包¶
包的创建请参考 服务器管理Part 3: 服务器打包 。
36.3. 安装/更新包¶
36.3.1. Ubuntu 14.04, 16.04¶
按照 服务器管理Part 3: 服务器打包 所介绍的方法,创建deb文件。
将该文件复制到服务器后,通过 dpkg
命令安装。
假设一个名为example的游戏,其代码如下所示。
$ sudo dpkg -i example_0.0.1_install.deb
[sudo] password for ubuntu:
Selecting previously unselected package example.
(Reading database ... 424079 files and directories currently installed.)
Preparing to unpack example_0.0.1_install.deb ...
Unpacking example (0.0.1) ...
Setting up example (0.0.1) ...
Processing triggers for ureadahead (0.100.0-16) ...
ureadahead will be reprofiled on next reboot
Important
若未安装 funapi1-runtime
,将弹出包安装错误的消息。此时执行以下命令,将自动安装必要的包和服务器包。
$ sudo apt-get install -f
36.3.2. Centos 6.5, 7¶
按照 服务器管理Part 3: 服务器打包 所介绍的方法,创建rpm文件。
将该文件复制到服务器后,通过 rpm
命令安装。
假设一个名为example的游戏,其代码如下所示。
$ sudo rpm -i example_0.0.1_install.rpm
Important
若未安装 funapi1-runtime
,将弹出包安装错误的消息。此时执行以下命令,先安装funapi1-runtime。
$ sudo yum install funapi1-runtime
36.4. 开始/关闭服务¶
36.5. 查看服务运行日志。¶
upstart或systemd会在服务器运行或关闭时生成单独的日志。 据此可以查看服务是否顺利运行。
Note
游戏服务器本身的日志,请参考 编程Part1: 调试日志 。
Note
对于游戏服务器的coredump,请参考 转储文件的调试和CPU性能分析 。
36.5.1. Upstart: Centos 6.5 & Ubuntu 14.04¶
当通过Upstart运行时,服务日志保存在 /var/log/upstart/{{project-name}}.log
文件中。
假设一个名为example的服务器,可按如下所示查看日志。
$ sudo less /var/log/upstart/example.log
36.5.2. Systemd: Centos 7 & Ubuntu 16.04¶
当通过Systemd运行时,服务日志可通过 journalctl -x -u {{project-name}}
命令查看。
假设一个名为example的服务器,可按如下所示查看日志。
$ sudo journalctl -x -u example
36.6. 固定包的版本¶
有时,须要指定在live环境中使用的 funapi1-runtime
或代理,或是在开发中使用的外部库的版本。
使用如下方法即可。
36.6.1. 在Ubuntu环境中固定版本¶
固定版本:
如果要固定 funapi1-runtime
的版本,输入如下命令即可。
$ sudo apt-mark hold funapi1-runtime
在该命令以后, apt-get upgrade
等参数中,除了相应包以外,其他数据均会得到更新。
查看已固定版本的包:
$ sudo apt-mark showhold
funapi1-runtime
可以看到上面输入的包的版本已固定。
解除版本固定:
可以通过以下命令解除包的版本固定。
$ sudo apt-mark unhold funapi1-runtime
之后即可以更新包。
36.6.2. 在CentOS环境中固定版本。¶
若想在CentOS环境中固定版本,则需要额外的包。通过以下命令安装即可。
$ sudo yum install yum-versionlock
安装完 yum-versionlock
包后,可执行以下命令。
固定版本:
如果要固定 funapi1-runtime
的版本,输入如下命令即可。
$ sudo yum versionlock funapi1-runtime
在该命令以后, yum update
等参数中,除了相应包以外,其他数据均会得到更新。
查看已固定版本的包:
$ sudo yum -q versionlock list
0:funapi1-runtime-1.0.0-1680centos7.*
可以看到上面输入的包的版本已固定。
解除版本固定:
可以通过以下命令解除包的版本固定。
$ sudo yum versionlock delete funapi1-runtime
之后即可以更新包。
Important
在CentOS 6中须要按照 sudo yum versionlock delete '*:funapi1-runtime*'
那样输入。
36.7. 将游戏服务器安装到非标准位置¶
36.7.1. 将游戏服务器包安装到非标准位置¶
前面已经介绍了创建并发布 DEB
或 RPM
格式文件的方法。这种包文件将游戏服务器安装到既定的位置上,需要拥有root权限。
然而有时也会出现无法获取root 权限的情况,有时则须要将游戏服务器的内容全部安装特定目录下。例如,如果将游戏服务器传给运营商,我们会希望游戏包能原封不动地安装到运营商所使用的Linux账户下。此时,很难通过 DEB
或 RPM
强制指定位置,所以最好通过``tar.gz``创建包后传输给出版商,由出版商解压到任意位置。(与创建 tar.gz
有关的内容请参考 可创建的包类型 。)
为了便利,假设我们制作的游戏名为 hello
,并使用了 lobby
flavor。那么,我们创建包的就是 hello_0.0.1_install-lobby.tar.gz
。
现在假设运营商管理的Linux服务器的账户为zeus,运营商将该包文件解压到 /home/zeus
下。
$ cd /home/zeus
$ tar zxf hello_0.0.1_install-lobby.tar.gz
如此,当在 /home/zeus
下通过 DEB
或 RPM
安装好后,可以看到已安装到 /
目录下的内容被原封不动地复制进去了。
36.7.2. 将游戏服务器包安装到非标准位置,通过Service运行¶
然而,该方法虽然复制了文件,但对于 upstart
或 systemd
等将游戏服务器通过Service(即通过Daemon)运行等情况,却无法自动让其进行。因此须要手动进行设置。
同时,即使服务已经注册,也需要指定路径,以便能够在我们指定的 /home/zeus
(而不是 /
)中找到游戏服务器。这种操作在设置游戏服务器OS时进行1次即可。
以下是对Upstart和Systemd的情况注册服务的方法做出的说明。两种方法均需要指定环境变量,注册脚本。
36.7.2.1. 可在服务配置文件中指定的环境变量¶
GAME_ROOT_DIR: 指定游戏服务器的安装路径。如不指定,将使用 / 作为默认值。
GAME_MANIFEST_OVERRIDE: 指定 临时重写MANIFEST.json 中记述的
MANIFEST.json
重写文件位置。如不指定,将默认指定为 /etc/{{project}}/MANIFEST.override.json 。GAME_LOG_ROOT_DIR: 指定日志文件的生成目录。如不指定,将使用 /var/log/funapi/游戏名 作为默认值。
GAME_CRASHDUMP_ROOT_DIR: 指定核心转储目录。如不指定,将使用 /var/crash/funapi/游戏名 作为默认值。
GAME_GLOG_OPTIONS: 指定Google logging的追加选项。如不指定,将使用 –max_log_size=10 –stop_logging_if_full_disk 作为默认值。
GAME_CONTACT_EMAIL_ADDRESS: 指定当游戏服务器死机时接收提示的邮箱地址。如不指定,将不会发送邮件。
Tip
设置GAME_CONTACT_EMAIL_ADDRESS后,在每次游戏服务器死机时,均可收到提示邮件,故十分便利。
36.7.2.2. Upstart (Ubuntu 14.04)时,手动注册服务¶
在 /home/zeus
下有一个名为 etc
的目录。其中,含有包含变量设置的 default
目录和包含实际服务器脚本的 init
目录,且作为子目录存在。
$ cd /home/zeus
$ ls etc
default init
由于我们游戏的名字为 hello
,且属于 lobby
flavor,因此各个子目录中存在如下文件。
$ ls etc/default
hello.lobby
$ ls etc/init
hello.lobby.conf
为了使Service能够在我们安装游戏的 /home/zeus
中找到程序,可在变量配置文件 etc/default/hello.lobby
中写入 export
,从而对环境变量进行如下定义。
除此以外,有时也可能会用到 可在服务配置文件中指定的环境变量 中提到的其他变量。
export GAME_ROOT_DIR=/home/zeus
Important
一定要写 export
。
现在,指定好 GAME_ROOT_DIR
后,即可按如下所示复制文件。
$ sudo cp /home/zeus/etc/default/hello.lobby /etc/default/
$ sudo cp /home/zeus/etc/init/hello.lobby.conf /etc/init/
按如下所示执行,以运行游戏服务器。
$ sudo service hello start
36.7.2.3. Systemd (CentOS 7 / Ubuntu 16.04)时,手动注册服务¶
在 /home/zeus 下有 lib/systemd/system/ 目录,目录中存在名为 hello.lobby.service 的 systemd
服务配置文件。
$ ls lib/systemd/system
hello.lobby.service
按如下所示复制该文件。
$ sudo cp lib/systemd/system/hello.lobby.service /lib/systemd/system/
然后,创建名为 /etc/default/hello.lobby
的环境变量配置文件,按如下所示编写,以确保systemd能在我们安装游戏的 /home/zeus
中找到程序。有可能会用到 可在服务配置文件中指定的环境变量 中列举的其他变量。
GAME_ROOT_DIR=/home/zeus
Important
与Ubuntu不同,它不写``export``。
现在即可运行游戏服务器,如下所示。
$ sudo systemctl start hello.lobby