本文将指引你搭建 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';
本作品使用基于以下许可授权:Creative Commons Attribution-ShareAlike 4.0 International License.
能不能再详细的阐述一下0.0
请问,judge-v3评测时,simple-sandbox 返回code=126是什么错误?