SYZOJ 搭建指南

本文将指引你搭建 SYZOJ,并对配置的细节作一些阐述。

项目架构概述

SYZOJ 由 web 端和 judge 端构成。而 judge v3 端又由三个部分组成:web、daemon、runner、frontend。各个部分独立运行,并且都能够同时启动多个实例。因此在启动时,你需要 至少 启动 4 个程序。

daemon

daemon 主要负责获取评测任务,并将评测任务分散为若干个较为轻量的子任务(编译和评测),这些任务再由 runner 来执行。

runner

runner 是实际执行评测任务的部分。

frontend

frontend 是 daemon 与 Web 端沟通的桥梁,它使用 HTTP 协议接收 Web 端传送来的评测任务,并将其推入消息队列供 daemon 部分执行。同时,它还负责向客户端推送评测进度。

消息队列

上述三个部件之间均使用 RabbitMQ 消息队列进行通信。消息队列能够自动处理消费者(Message Consumer,可以理解为任务执行器,在本文中为 daemon 及 runenr)的崩溃或连接丢失,并将对应任务自动分发给其他可用的消费者。

Redis

为了让多个 runner 能够共享同一份可执行程序,编译后的可执行程序将以源代码的 Hash 值为键,存储于 Redis 中。

runner 在收到评测请求后,会首先检测本地的可执行文件存储目录是否有对应的文件。如果有(以前获取过这份可执行程序),则会直接执行;如果没有,再从 Redis 获取。

在同一台机器上的 runner 可以共享可执行文件存储目录,提升评测效率。

部署步骤

获取源代码

请直接从 GitHub 存储库获取评测端的源代码,命令如下。

git clone https://github.com/syzoj/syzoj-judge-v3.git /var/syzoj-judge-v3

本文将假设你将 syzoj-judge-v3 放在 /var 目录下。

安装依赖项

本项目使用的 simple-sandbox 需要使用 boost 库,你需要使用操作系统的软件包管理器安装相应的软件包。你还需要切换到源代码目录,并使用 npm 安装项目的 Node.js 依赖项。该过程需要稳定可靠的国际互联网连接。

具体过程如下:

apt install build-essential libboost1.58-all-dev nodejs rabbitmq-server redis-server nginx p7zip-full # Ubuntu
cd /var/syzoj-judge-v3
npm install

启用内存控制相关的内核选项

simple-sandbox 使用了 cgroup 来进行内存用量控制,该过程需要用到 memory.memsw(控制内存和交换空间的总用量)。一些 Linux 发行版的内核在默认情况下,没有启用这个内核选项,你需要手动启用它。

请检查这个文件是否存在:

/sys/fs/cgroup/memory/memory.memsw.usage_in_bytes

如果这个文件存在,那么这个选项已经启用,请继续进行下一步(构建源代码)。如果这个文件不存在,请按以下步骤操作(对于 Ubuntu 16.04 及 Debian 8 而言)。

以 root 身份打开 /etc/default/grub 文件,找到以下内容(引号中的内容可能与实际不同):

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

在上述内核选项后面追加:

cgroup_enable=memory swapaccount=1

以上述默认选项为例,增加后,这一行应该具有如下内容:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash cgroup_enable=memory swapaccount=1"

修改完成后,你需要重新生成 grub 配置,并且执行以下命令来重启:

update-grub && reboot

重启完成后,请检查 memory.memsw.usage_in_bytes 文件是否存在。

构建源代码

本项目使用了 TypeScript。你需要手动将 TypeScript “转录(transpile)”为 JavaScript:

# at /var/syzoj-judge-v3
npm run build

 复制 & 修改配置文件

推荐建立 /etc/syzoj-config 目录来存放配置文件。

首先建立目录并复制配置文件示例:

# at /var/syzoj-judge-v3
mkdir /etc/syzoj-config
cp daemon-config-example.json /etc/syzoj-config/daemon.json
cp runner-shared-config-example.json /etc/syzoj-config/runner-shared.json
cp runner-instance-config-example.json /etc/syzoj-config/runner-instance1.json
cp frontend-config-example.json /etc/syzoj-config/frontend.json

接下来你需要修改配置文件。我在这里提供一些配置文件选项的说明。

daemon 配置

RabbitMQUrl: RabbitMQ 服务器的路径。请参见 https://www.rabbitmq.com/uri-spec.html

RedisUrl: Redis 服务器的路径。请参见 http://www.iana.org/assignments/uri-schemes/prov/redis

其余选项的意义请参见 DEMO 服务器。

创建数据库及用户

CREATE DATABASE syzoj;
ALTER DATABASE syzoj CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
CREATE USER 'syzoj'@'localhost' IDENTIFIED BY 'new_password';
GRANT ALL ON syzoj.* TO 'syzoj'@'localhost';
FLUSH PRIVILEGES;

将用户设为管理员

USE syzoj;
UPDATE `user` SET `is_admin` = 1 WHERE `username` = 'admin';

CC BY-SA 4.0 本作品使用基于以下许可授权:Creative Commons Attribution-ShareAlike 4.0 International License.

《SYZOJ 搭建指南》有2个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据