配置:
1. Huawei cloud学生机 Ubuntu18.04
2. domjudge v7.1.1

注:本篇文章的目的主要是记录自己的搭建过程(其实就是傻瓜式的跟着做的),在此同时帮助到可能能帮助到的小伙伴。并不是严格的教程向文章。

简单的使用domjudge需要安装两部分,一部分是Domserver,就是网页部分,另一部分是judgehost,即判题机。

Domserver

安装依赖包和功能

远程连接到服务器后首先安装依赖包和功能,一步步执行,
安装时选择 apache2

sudo apt-get upgrade && sudo apt-get update
sudo apt install gcc g++ make zip unzip mariadb-server \
        apache2 php php-cli libapache2-mod-php php-zip \
        php-gd php-curl php-mysql php-json php-xml php-intl php-mbstring \
        acl bsdmainutils ntp phpmyadmin python-pygments \
        libcgroup-dev linuxdoc-tools linuxdoc-tools-text \
        groff texlive-latex-recommended texlive-latex-extra \
        texlive-fonts-recommended texlive-lang-european composer
sudo apt install libcurl4-gnutls-dev libjsoncpp-dev libmagic-dev
sudo phpenmod json

编译domjudge

wget https://www.domjudge.org/releases/domjudge-7.1.1.tar.gz

不知名原因导致下载速度感人,本地下载后通过ftp传到服务器里面,下载好之后解压配置编译安装即可。

tar -zxvf domjudge-7.1.1.tar.gz
cd domjudge-7.1.1
./configure --prefix=/opt/domjudge --with-baseurl=127.0.0.1
make domserver && sudo make install-domserver
make docs && sudo make install-docs

./configure --prefix=/opt/domjudge --with-baseurl=127.0.0.1执行这一步时遇到权限问题,按照报错提示在后面添加指定内容成功解决。

配置数据库

cd /opt/domjudge/domserver
sudo bin/dj_setup_database -u root install

配置 Web 服务器

cd /opt/domjudge/domserver
sudo ln -s /opt/domjudge/domserver/etc/apache.conf /etc/apache2/conf-available/domjudge.conf
sudo a2enmod rewrite
sudo a2enconf domjudge
sudo systemctl reload apache2
sudo chown www-data:www-data -R /opt/domjudge/domserver/webapp/var/*

到这一步的时候如果没有出错,那么已经可以通过服务器的公网ip(ip/domjudge)查看domjudge了。
默认用户名为admin,密码生成在/opt/domjudge/domserver/etc/initial_admin_password.secret中,以后可以修改

配置 MySQL

编辑/etc/mysql/conf.d/mysql.cnf,在里面添加

[mysqld]
max_connections = 1000
max_allowed_packet = 16MB
innodb_log_file_size = 48MB

其中max_allowed_packet数值改成两倍于题目测试数据文件的大小,innodb_log_file_size 数值改成十倍于题目测试数据文件的大小。
若使用的是 mariadb,则 /etc/mysql/mariadb.conf.d/50-server.cnfmax_allowed_packet 一项也需要修改。(但是我用的不是)

然后重启mysql

sudo systemctl restart mysql

配置PHP

编辑 /opt/domjudge/domserver/etc/apache.conf,取消以下几行内容前的注释:(在vim中直接输入/+内容就可以查找)

<IfModule mod_php7.c>
php_value max_file_uploads      100
php_value upload_max_filesize   128M
php_value post_max_size         128M
php_value memory_limit          512M
</IfModule>

编辑 /etc/php/7.2/apache2/php.ini,搜索 date.timezone 关键字,取消其行前注释,并将其值设为 Asia/Shanghai。搜索 max_execution_time 关键字,将其值由30改为300,防止生成队伍密码时 PHP 执行超时。

然后重启PHP

sudo systemctl restart apache2

配置 Apache

编辑 /etc/apache2/apache2.conf,搜索 KeepAlive 关键字,将其值设为 Off,并在其后新增一行内容:

MaxClients 1000

然后重启Apache

sudo systemctl restart apache2

到这里,Domserver就设置完成了,关于domjudge的使用下面统一再说。接下来总结一下judgehost的搭建

Judgehost

本着节约资源的理念(穷),domserver和judgeserver我都用在这个服务器上

安装依赖

sudo apt install make sudo debootstrap libcgroup-dev lsof \
        php-cli php-curl php-json php-xml php-zip procps \
        gcc g++ openjdk-8-jre-headless \
        openjdk-8-jdk ghc fp-compiler \
        libcurl4-gnutls-dev libjsoncpp-dev libmagic-dev

编译安装

cd domjudge-7.1.1
./configure --prefix=/opt/domjudge --with-baseurl=127.0.0.1
make judgehost && sudo make install-judgehost

配置的命令跟上面安装domserver的时候一样,按照报错信息操作即可。
这会将 judgehost 安装在 /opt/domjudge/judgehost 里。
(make install-judgehost会提示找不到 etc/restapi.secret ,可忽略,会在下面进行配置)

添加用户

useradd -d /nonexistent -U -M -s /bin/false domjudge-run

我只添加了一个判题机。有更多的需求的可以去本文开头提到的GitHub库中查看相关操作。

配置 sudoers

/opt/domjudge/judgehost/etc/sudoers-domjudge 复制到 /etc/sudoers.d/ 目录下。

sudo cp /opt/domjudge/judgehost/etc/sudoers-domjudge /etc/sudoers.d/

修改 rest 密码

使用 vim 等文本编辑器编辑 /opt/domjudge/judgehost 目录下 etc/restapi.secret 这个文件。文件的格式为:

default http://example.edu/domjudge/api/  judgehosts  MzfJYWF5agSlUfmiGEy5mgkfqU

格式为 endpoint api_url username password ,endpoint 可以保持不变,api_url 根据 judgeserver 的地址进行修改,username 和 password 要与 judgeserver 上的 etc/restapi.secret 保持一致。
(这一步我没找到judgeserver,应该就是让看的domserver吧,写成一样的就行了)

构建 chroot 环境

使用 vim 等文本编辑器编辑 ~/domjudge/judgehost/bin/dj_make_chroot 脚本,将 ubuntu 镜像改为国内源。(第 172 行)

# Ubuntu mirror, modify to match closest mirror
[ -z "$DEBMIRROR" ] && DEBMIRROR="http://mirrors.aliyun.com/ubuntu/"

修改之后保存并运行此脚本(bash 运行)。这一步会从源上下载必要的软件包,所以请耐心等待。

设置cgroup

使用 vim 等文本编辑器编辑 /etc/default/grub 这个文件,对其中的这一行做如下修改:

GRUB_CMDLINE_LINUX_DEFAULT="quiet cgroup_enable=memory swapaccount=1"

然后执行:update-grub
之后重启服务器

启动judgehost

bash /opt/domjudge/judgehost/bin/create_cgroups
/opt/domjudge/judgehost/bin/judgedaemon

即可启动。若提示 error: Call to undefined function curl_init(),则可以安装 php-curl 解决

如果没有问题,看到的会是这样的页面


大概意思就是,判题机已启动,队列中没有提交

到这里judgehost就安装好了

如果想要断开连接并且还可以正常使用判题机,这样来

bash /opt/domjudge/judgehost/bin/create_cgroups
nohup /opt/domjudge/judgehost/bin/judgedaemon &

退出连接的时候记得用exit,不要直接关闭

到这里,domjudge就可以正常投入使用了。

Domjudge的使用

一切都还在摸索

Loading~~~