SYZOJ2 在 CentOS 上的搭建

SYZOJ2 官方只提供了 Ubuntu 的教程,在 CentOS 上,有些东西会不一样。 本文需要对照官方安装指南查看,详情请阅读 syzoj/syzoj on GitHubDemo 服务器账号及搭建指南 – 帖子 – Demo。 这里还有一篇很详细的 SYZOJ 部署指南,是 Masellum 写的。值得参考。

SYZOJ-Web

Web 的搭建相对比较简单。大部分都可以按照 SYZOJ2 官方的教程来做。 这里只说明不一样的地方。 对于在 Ubuntu 下的这段命令:

apt install build-essential libboost1.58-all-dev nodejs rabbitmq-server redis-server nginx p7zip-full

在 CentOS 上,首先,不能通过 yum 源安装 nodejs,因为 yum 源中的 nodejs 太古老,需要安装 8.0 版本(可能低一点也可以)。安装脚本如下:

curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -

nginx 需要单独加源,方法自行搜索,很多。 剩下的包则用接下来的命令安装:

yum groupinstall "Development Tools"
yum install boost-devel rabbitmq-server redis p7zip p7zip-plugins

其他步骤可以参照官方教程来进行。 另外,不清楚是不是 bug,如果在 config.json 中,将 "hostname" 字段设置为一个域名(这样注册验证电子邮件的地址就是这个域名),那么必须在 /etc/hosts 中将这个域名的 IP 地址解析到 127.0.0.1,否则会无法启动 Web 端。 (新版 Web 似乎已经修复此问题,放心设置 hostname127.0.0.1)

SYZOJ-Judge

Judge 端在 CentOS 上,出现了严重的问题,就是 C++ 程序默认会 RE。经过我 chroot 到沙盒排查,这个问题是 -mx32 编译参数导致的。所以我们需要修改这个编译参数。 进入 Judge 文件夹,修改 ./src/languages/ 下的 c.tscpp.tscpp11.ts,将 -mx32 替换为空。 但这样会导致指针为 64 位大小,如果程序大量使用指针,可能导致 MLE,因为指针占据的空间是 32 位的两倍。因此,也可以把 -mx32 修改为 -m32,这样编译出来的是纯 32 位程序。 然后,在 Judge 文件夹下,执行 npm run build 重新编译评测程序。 此时,SYZOJ2 应当已经能够正常运行。

评测实时状态获取

目前最新版 SYZOJ 可以不用特别处理这一项在 SYZOJ2 中浏览器在获取评测状态时,会尝试 SYZOJ-Web 的 config.json 中定义的 "judge_server_addr"。如果按照官方的配置将其配置为 http://127.0.0.1:5284,显然用户是不能访问的。 如果我们改成 OJ 的地址呢?在 CentOS 7 上,默认打开了防火墙,而防火墙默认会阻断 5284 端口。那么我们就有两种方案,一种是开放 5284 端口,但 SYZOJ-Frontend 监听下的 5284 端口不支持 HTTPS,导致 HTTPS 页面不能建立连接。综合来看,我们应当采用 nginx 反向代理来实现。这里提供配置文件参考。

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name 评测机域名;
        location / {
                proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_pass http://127.0.0.1:5284;
                client_max_body_size 0;
        }
    #error_page 404 = /404.html; error_page 403 = /403.html;
        #ssl on;
        ssl_certificate [cert];
        ssl_certificate_key [key];
}

然后在 SYZOJ-Web 的 config.json 中将 "judge_server_addr" 的值修改为你设置的评测机域名。

其他改动

服务文件修改

你需要在所有 syzoj-*.service 中将 redis-server.service 替换成 redis.service。 如果你使用 MariaDB,请不要忘记在所有 syzoj-*.service 中将 mysql.service 替换成 mariadb.service

Web 修改

默认的,全站管理员可以在 Web 管理后台中,查看和修改配置文件。这是不安全的。因为一旦任何一个全站管理员的 Cookie 或者密码泄露,就可能导致 secret 和 token 等敏感信息被查看。 备份一下 [你的 SYZOJ-Web 程序目录]/views/admin_raw.ejs,然后再建立一个新的 admin_raw.ejs,将以下内容写入:

<
<
<p>系统管理员已禁止从 Web 端修改配置文件.</p>
<

这样,配置文件就被限制为仅有拥有服务器 SSH 权限的人才能查看和修改的了。 如果你的数据库为 MariaDB 且选用 utf8mb4 编码,可能遇到 Unhandled rejection SequelizeDatabaseError: ER_TOO_LONG_KEY: Specified key was too long; max key length is 767 bytes 的问题,这时你应当先用 root 权限登录 mysql,然后执行:

SET GLOBAL innodb_file_per_table = ON;
SET GLOBAL innodb_large_prefix = ON;

然后修改 /etc/my.cnf 加入以下语句:

default-storage-engine=INNODB
innodb_large_prefix=on

最后放一下 OJ 链接 山河 OJ (Mountain & River Online Judge) 由于经营不善,站长带着并不存在的小姨子跑路了,MROJ 无限期关闭。

发表回复

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