XCPC 竞赛 Ubuntu 环境 DOMjudge Server 完整配置指南
一、前言:什么是DOMjudge ?
DOMjudge 是一款专为 XCPC(国际大学生程序设计竞赛) 设计的开源裁判系统,核心作用包括:
1.自动接收参赛队伍的代码提交,支持 C++、Python、Java 等主流竞赛语言;
2.编译运行代码,通过预设测试用例判断提交是否正确(AC/WA/TLE/MLE 等结果);
3.实时排名计算(按解题数、罚时排序),生成竞赛排行榜;
支持题目管理、队伍注册、权限分配(裁判 / 参赛队 / 观众角色分离);
4.兼容 ICPC、CCPC 等竞赛规则,是高校 / 区域赛常用的裁判系统。
本文将在VMare 17 虚拟机 参考文章安装 ,ubuntu-24.04.3-live-server-amd64.iso镜像环境下 参考文章配置,从基础依赖到完整部署,一步步引导配置 DOMjudge Server 8.2.3,所有代码可直接复制执行,关键步骤标注版本 / 地址注意事项。
二、核心前提说明
1.网络要求:需联网(下载软件包、依赖库);
虚拟机联网
2.虚拟机与Windows实现双向复制粘贴;
点击查看代码
sudo apt-get update
sudo apt-get install open-vm-tools-desktop
sudo apt-get install open-vm-tools
reboot
三、完整配置步骤
第一步:系统更新与基础依赖准备
点击查看代码
# 更新系统软件包列表(确保获取最新版本信息,避免依赖冲突)
sudo apt update && sudo apt upgrade -y# 安装基础工具(后续编译、下载、解压需用到)
sudo apt install -y wget curl git build-essential
第二步:解决核心报错 —— 添加 PHP 8.2 官方源
点击查看代码
# 1. 安装添加 HTTPS 源所需的依赖工具
sudo apt install -y software-properties-common apt-transport-https lsb-release ca-certificates# 2. 添加 PHP 官方 PPA 源(Ondrej 维护的官方源,支持所有稳定版 PHP)
# 注意:该源适用于 Ubuntu 20.04/22.04/24.04,其他版本需替换 $(lsb_release -cs) 为对应系统代号
sudo add-apt-repository ppa:ondrej/php -y# 3. 再次更新软件包列表(让系统识别新添加的 PHP 源)
sudo apt update
第三步:安装 DOMjudge 必需依赖
版本注意
- PHP 版本:必须是 8.2(DOMjudge 8.2.3 官方兼容版本,避免 PHP 8.3 兼容性问题);
- 移除 php8.2-json:PHP 8.2 中 JSON 扩展已合并到核心,独立包不存在,否则会报 E: 软件包 php8.2-json 没有可安装候选
点击查看代码
# 安装核心依赖(含 Web 服务器、数据库、PHP 及扩展、编译工具等)
sudo apt install -y libcgroup-dev make acl zip unzip mariadb-server nginx \php8.2 php8.2-fpm php8.2-gd php8.2-cli php8.2-intl php8.2-mbstring \php8.2-mysql php8.2-curl php8.2-xml php8.2-zip composer ntp \pkg-config debootstrap lsof procps gcc g++ pypy3 openjdk-17-jdk gfortran
第四步:下载 DOMjudge 8.2.3 源码(版本固定,避免兼容问题)
地址注意:
- 下载地址:使用 DOMjudge 官方稳定版源码(8.2.3 是长期支持版,bug 较少);
- 解压目录:固定在 /home/[用户名]/ 下(本文用户名为 accuber,需替换为你的实际用户名)。
点击查看代码
# 1. 进入用户主目录(替换 accuber 为你的 Ubuntu 用户名)
cd /home/accuber/# 2. 下载 DOMjudge 8.2.3 源码包(官方地址,确保文件完整)
wget https://www.domjudge.org/releases/domjudge-8.2.3.tar.gz# 3. 解压源码包(生成 domjudge-8.2.3 目录,后续编译安装依赖该目录)
tar -zxf domjudge-8.2.3.tar.gz && cd domjudge-8.2.3/
第五步:编译并安装 DOMjudge Server
注意事项:
- 编译时间:根据虚拟机 / 服务器性能,需 1-10 分钟,请勿中断执行;
- 安装路径:固定为 /opt/domjudge(DOMjudge 官方推荐路径,后续配置无需修改路径)。
点击查看代码
# 1. 配置安装路径(--prefix 指定安装到 /opt/domjudge,固定路径无需修改)
./configure --prefix=/opt/domjudge# 2. 多线程编译(-j$(nproc) 自动识别 CPU 核心数,加快编译速度)
make domserver -j$(nproc)# 3. 安装 DOMjudge 到指定目录(需 sudo 权限,写入系统目录)
sudo make install-domserver
第六步:初始化 MariaDB 数据库(DOMjudge 数据存储核心)
关键说明:
- 数据库自动配置:dj_setup_database 脚本会自动创建数据库、用户及权限,无需手动操作;
- 凭证文件:生成的 dbpasswords.secret 是数据库连接凭证,必须让 PHP 有权读取。
点击查看代码
# 1. 进入 DOMjudge 二进制脚本目录(固定路径,编译安装后自动生成)
cd /opt/domjudge/domserver/bin/# 2. 生成数据库访问凭证(自动生成随机密码,保存到 dbpasswords.secret)
sudo ./dj_setup_database genpass# 3. 初始化数据库(-s 选项自动处理数据库权限,避免手动配置出错)
sudo ./dj_setup_database -s install# 4. 修复凭证文件权限(让 PHP-FPM 运行用户 www-data 能读取,否则数据库连接失败)
sudo chown www-data:www-data /opt/domjudge/domserver/etc/dbpasswords.secret
sudo chmod 644 /opt/domjudge/domserver/etc/dbpasswords.secret
第七步:配置 Nginx 服务器(Web 访问入口)
配置说明:
- 根目录:固定为 /opt/domjudge/domserver/webapp/public(DOMjudge 前端文件存放目录);
- PHP 转发:通过 fastcgi_pass 关联 PHP-FPM,确保 .php 脚本正常执行。
点击查看代码
# 1. 关联 DOMjudge 专属 Nginx 配置,同时删除默认配置避免端口冲突
sudo ln -s /opt/domjudge/domserver/etc/nginx-conf /etc/nginx/sites-enabled/domjudge
sudo rm -f /etc/nginx/sites-enabled/default# 2. 覆盖 Nginx 配置文件(确保路径和转发规则正确,直接复制无需修改)
sudo tee /opt/domjudge/domserver/etc/nginx-conf << 'EOF'
# PHP-FPM upstream 配置(关联 DOMjudge 专用 FPM 进程)
upstream domjudge {server unix:/var/run/php-fpm-domjudge.sock;
}# HTTPS 转发适配(兼容后续可能的 HTTPS 配置)
map $http_x_forwarded_proto $fastcgi_param_https_variable {default $https;https 'on';
}server {listen 80; # 监听 80 端口(HTTP 默认端口,无需修改)listen [::]:80;server_name localhost; # 本地访问,无需修改root /opt/domjudge/domserver/webapp/public; # 前端文件根目录(固定)index index.php; # 优先解析 index.php(单入口应用)charset utf-8; # 字符编码,避免中文乱码send_timeout 36000s; # 延长超时时间,适配大文件提交# 路由规则:所有请求转发到 index.php(DOMjudge 框架要求)location / {try_files $uri $uri/ /index.php$is_args$args;}# PHP 脚本处理:转发 .php 请求到 PHP-FPMlocation ~ \.php$ {try_files $uri =404; # 不存在的脚本返回 404,避免恶意请求fastcgi_pass domjudge; # 关联 upstream domjudgefastcgi_index index.php;# 传递脚本路径(必须正确,否则 PHP 无法找到脚本)fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params; # 加载默认 fastcgi 参数}# 禁止访问 .ht 隐藏文件(安全配置)location ~ /\.ht {deny all;}
}
EOF# 3. 验证 Nginx 配置是否正确(输出 success 则正常,否则检查语法错误)
sudo nginx -t
第八步:配置 PHP-FPM(优化运行参数)
路径注意:
PHP 配置路径:/etc/php/8.2/fpm/pool.d/(对应 PHP 8.2,若安装其他版本需修改路径)
点击查看代码
# 1. 关联 DOMjudge 专用 PHP-FPM 配置文件
sudo ln -s /opt/domjudge/domserver/etc/domjudge-fpm.conf /etc/php/8.2/fpm/pool.d/domjudge.conf# 2. 添加优化配置(追加到配置文件末尾,无需修改原有内容)
sudo tee -a /etc/php/8.2/fpm/pool.d/domjudge.conf << 'EOF'
# 内存限制:从默认 128M 改为 512M,避免初始化内存不足
php_admin_value[memory_limit] = 512M
# 脚本最大执行时间:300 秒(5 分钟),适配题目判题过程
php_admin_value[max_execution_time] = 300
# 时区配置:Asia/Shanghai(避免日期时间警告)
php_admin_value[date.timezone] = Asia/Shanghai
# 开启错误显示(临时用于排查问题,生产环境可关闭)
php_admin_flag[display_errors] = On
# 开启错误日志(报错时可通过日志定位问题)
php_admin_flag[log_errors] = On
EOF# 3. 重启 PHP-FPM 和 Nginx,使配置生效
sudo systemctl daemon-reload
sudo systemctl restart php8.2-fpm nginx
# 设置开机自启(避免服务器重启后服务失效)
sudo systemctl enable php8.2-fpm nginx
第九步:安装 Symfony 依赖(DOMjudge 框架核心)
报错说明
- DOMjudge 基于 Symfony 框架开发,缺少依赖会导致 500 错误,且源码中可能未自带 composer.json,执行 composer install 会报 Composer could not find a composer.json file。
点击查看代码
# 1. 进入 DOMjudge 前端应用目录(固定路径)
cd /opt/domjudge/domserver/webapp/# 2. 手动创建 composer.json(适配 DOMjudge 8.2.3,直接复制无需修改)
sudo tee composer.json << 'EOF'
{"name": "domjudge/domjudge","type": "project","description": "DOMjudge programming contest judge system","license": "GPL-2.0-or-later","require": {"php": "^7.4 || ^8.0","ext-ctype": "*","ext-curl": "*","ext-dom": "*","ext-fileinfo": "*","ext-filter": "*","ext-gd": "*","ext-hash": "*","ext-iconv": "*","ext-intl": "*","ext-json": "*","ext-mbstring": "*","ext-mysqli": "*","ext-pcre": "*","ext-PDO": "*","ext-pdo_mysql": "*","ext-session": "*","ext-simplexml": "*","ext-tokenizer": "*","ext-xml": "*","ext-xmlwriter": "*","ext-zip": "*","ext-zlib": "*","symfony/console": "5.4.*","symfony/dotenv": "5.4.*","symfony/flex": "^1.17|^2","symfony/framework-bundle": "5.4.*","symfony/http-client": "5.4.*","symfony/intl": "5.4.*","symfony/mailer": "5.4.*","symfony/mime": "5.4.*","symfony/process": "5.4.*","symfony/property-access": "5.4.*","symfony/property-info": "5.4.*","symfony/routing": "5.4.*","symfony/security-bundle": "5.4.*","symfony/serializer": "5.4.*","symfony/translation": "5.4.*","symfony/twig-bundle": "5.4.*","symfony/validator": "5.4.*","symfony/web-profiler-bundle": "5.4.*","symfony/webpack-encore-bundle": "^1.16","symfony/yaml": "5.4.*","twig/extra-bundle": "^2.12|^3.0","twig/twig": "^2.12|^3.0","doctrine/doctrine-bundle": "^2.5","doctrine/orm": "^2.11","doctrine/annotations": "^1.13","friendsofsymfony/rest-bundle": "^3.3","jms/serializer-bundle": "^4.0","nelmio/api-doc-bundle": "^4.10","sensio/framework-extra-bundle": "^6.2","league/flysystem": "^1.1","symfony/cache": "5.4.*","monolog/monolog": "^2.3","ramsey/uuid": "^4.2","symfony/asset": "5.4.*","symfony/expression-language": "5.4.*","symfony/security-csrf": "5.4.*","symfony/templating": "5.4.*","symfony/var-dumper": "5.4.*","symfony/web-link": "5.4.*"},"require-dev": {"symfony/browser-kit": "5.4.*","symfony/css-selector": "5.4.*","symfony/debug-bundle": "5.4.*","symfony/maker-bundle": "^1.39","symfony/phpunit-bridge": "^5.4","symfony/stopwatch": "5.4.*","symfony/var-exporter": "5.4.*"},"config": {"allow-plugins": {"symfony/flex": true,"symfony/runtime": true},"optimize-autoloader": true,"preferred-install": {"*": "dist"},"sort-packages": true},"autoload": {"psr-4": {"App\\": "src/"}},"autoload-dev": {"psr-4": {"App\\Tests\\": "tests/"}},"replace": {"symfony/polyfill-ctype": "*","symfony/polyfill-iconv": "*","symfony/polyfill-php72": "*","symfony/polyfill-php73": "*","symfony/polyfill-php74": "*","symfony/polyfill-php80": "*","symfony/polyfill-php81": "*"},"scripts": {"auto-scripts": {"cache:clear": "symfony-cmd","assets:install %PUBLIC_DIR%": "symfony-cmd"},"post-install-cmd": ["@auto-scripts"],"post-update-cmd": ["@auto-scripts"]},"conflict": {"symfony/symfony": "*"},"extra": {"symfony": {"allow-contrib": false,"require": "5.4.*"}}
}
EOF# 3. 手动创建 composer.lock(锁定依赖版本,避免后续更新冲突)
sudo tee composer.lock << 'EOF'
{"_readme": ["This file locks the dependencies of your project to a known state","Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies","This file is @generated automatically"],"content-hash": "a1b2c3d4e5f67890abcdef1234567890","packages": [],"packages-dev": [],"aliases": [],"minimum-stability": "stable","stability-flags": [],"prefer-stable": true,"prefer-lowest": false,"platform": {"php": "^7.4 || ^8.0","ext-ctype": "*","ext-curl": "*","ext-dom": "*","ext-fileinfo": "*","ext-filter": "*","ext-gd": "*","ext-hash": "*","ext-iconv": "*","ext-intl": "*","ext-json": "*","ext-mbstring": "*","ext-mysqli": "*","ext-pcre": "*","ext-PDO": "*","ext-pdo_mysql": "*","ext-session": "*","ext-simplexml": "*","ext-tokenizer": "*","ext-xml": "*","ext-xmlwriter": "*","ext-zip": "*","ext-zlib": "*"},"platform-dev": [],"plugin-api-version": "2.3.0"
}
EOF# 4. 修复文件权限(让 www-data 用户可读取/修改,避免 composer 执行权限报错)
sudo chown www-data:www-data composer.json composer.lock
sudo chmod 644 composer.json composer.lock# 5. 更换国内 Composer 镜像(解决下载慢/超时问题,必执行)
sudo -u www-data composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/# 6. 安装依赖(--no-dev 不安装开发依赖,--ignore-platform-reqs 忽略版本小差异)
sudo -u www-data composer install --no-dev --ignore-platform-reqs --no-interaction
第十步:初始化缓存与修复全目录权限
点击查看代码
# 1. 清除并预热 Symfony 缓存(避免配置缓存导致的报错)
sudo -u www-data php bin/console cache:clear --env=prod
sudo -u www-data php bin/console cache:warmup --env=prod# 2. 修复 DOMjudge 全目录权限(关键!确保 PHP 能读写文件/缓存/日志)
sudo chown -R www-data:www-data /opt/domjudge/domserver/
# 目录权限:755(读/写/执行)
sudo chmod -R 755 /opt/domjudge/domserver/
# 缓存目录:775(额外写权限,避免缓存写入失败)
sudo chmod -R 775 /opt/domjudge/domserver/webapp/var/# 3. 最后重启一次服务,确保所有配置生效
sudo systemctl restart php8.2-fpm nginx
第十一步:获取登录信息并访问 DOMjudge
点击查看代码
# 输出管理员登录凭证(务必保存!首次登录必需)
echo "====================================="
echo "DOMjudge Server 配置完成!"
echo "====================================="
echo "访问地址:http://127.0.0.1(虚拟机本地访问)"
echo " http://[服务器IP](局域网/外网访问)"
echo "管理员用户名:admin"
echo "初始密码:"
sudo cat /opt/domjudge/domserver/etc/initial_admin_password.secret
echo "====================================="
echo "注意:首次登录后请立即修改密码(进入 Profile 页面)"
echo "配置检查:登录后点击 Config Checker,确保无标红报错"
echo "====================================="
第十二步:验证配置成功
打开虚拟机 / 服务器的浏览器,输入 http://127.0.0.1;
输入用户名 admin 和上述输出的初始密码,成功进入 DOMjudge 裁判管理后台;
点击左侧「Config Checker」,若所有检查项为绿色(无标红),说明配置完全正常。
第十三步、常见问题排查
-
访问报 500 错误:查看 PHP 日志 sudo tail -20 /var/log/php8.2-fpm.log,根据报错修复(通常是权限或依赖问题);
-
2.访问报 404 错误:检查 Nginx 配置中的 root 路径是否正确,重启 Nginx sudo systemctl restart nginx;
-
数据库连接失败:重新执行数据库初始化步骤(第六步),确保 dbpasswords.secret 权限正确;
-
Composer 下载超时:重新执行 sudo -u www-data composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 更换镜像
附配置成功图




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/964619.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!