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.4.1. Upstart: Centos 6.5 & Ubuntu 14.04

可通过 startstop 命令来开始或关闭服务。

假设已安装了一个名为example的服务器,按如下所示执行。

36.4.1.1. 开始服务

$ sudo start example
example start/running, process 27687

36.4.1.2. 关闭服务

$ sudo stop example
example stop/waiting

36.4.2. Systemd: Centos 7 & Ubuntu 16.04

可利用 systemctl 命令激活、开始、关闭服务。

假设已安装了一个名为example的服务器,按如下所示执行。

36.4.2.1. 激活服务

服务器重启时,为了使游戏服务能自动运行,需要通过以下命令激活服务。

$ sudo systemctl enable example

36.4.2.2. 开始服务

$ sudo systemctl start example

36.4.2.3. 关闭服务

$ sudo systemctl stop example

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. 将游戏服务器包安装到非标准位置

前面已经介绍了创建并发布 DEBRPM 格式文件的方法。这种包文件将游戏服务器安装到既定的位置上,需要拥有root权限。

然而有时也会出现无法获取root 权限的情况,有时则须要将游戏服务器的内容全部安装特定目录下。例如,如果将游戏服务器传给运营商,我们会希望游戏包能原封不动地安装到运营商所使用的Linux账户下。此时,很难通过 DEBRPM 强制指定位置,所以最好通过``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 下通过 DEBRPM 安装好后,可以看到已安装到 / 目录下的内容被原封不动地复制进去了。

36.7.2. 将游戏服务器包安装到非标准位置,通过Service运行

然而,该方法虽然复制了文件,但对于 upstartsystemd 等将游戏服务器通过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.servicesystemd 服务配置文件。

$ 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