XCPC 竞赛 Ubuntu 环境 DOMjudge Server 完整配置指南

news/2025/11/13 18:46:43/文章来源:https://www.cnblogs.com/accuber/p/19218763

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/ 更换镜像

附配置成功图

image
image
image
image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/964619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

v模型按开发阶段分为四阶段:单元测试、集成测试、系统测试验收测试

v模型按开发阶段分为四阶段:单元测试、集成测试、系统测试验收测试

Python迭代器_高级

点击查看代码 """ 案例:演示自定义迭代器迭代器对象&可迭代对象定义:1、迭代器对象:实现了 __iter__() 和 __next__() 方法的对象,称为迭代器对象,该方法在每次调用时返回下一个值2、可迭代对…

Python迭代器_迭代器对象可迭代对象必须分开场景

点击查看代码 """ 案例:展示了迭代器对象和可迭代对象必须分开实现的场景:- **核心需求**:多个迭代器需要同时独立遍历同一个数据集 - **问题所在**:单一类实现时,所有迭代器共享同一个状态变量,…

251113

JT-JY14T1S1Good morning, what can i do for you? I wonder report a theft. I had something stolen out of bag yesterday. I sorry to hear that. RIght, i need to take a few details. Can i start with your n…

H模型流程

主流程: 产品召开需求会议测试和开发拿到需求分析需求测试经理编写测试计划,安排测试工作测试人员分析需求,编写测试用例评审测试用例,评审通过将用例倒入到用例管理工具中搭建环境 开发提测代码包,达到了准入要求…

集合框架、io流、多线程

集合框架、io流、多线程

Ubuntu 22.04 x86_64 cron不执行原因 - whitesky

背景:美西VPS,设置cron定时任务,到了时间不执行,cron服务正常运行,脚本有执行权限, 手动执行没问题查看时区, timedatectl # 发现是UTC时区,修改为东八区时间: timedatectl set-timezone Asia/Shanghaitimeda…

为啥要搞utf-8等,直接存储Unicode码点不行吗?

Unicode本身无法直接作为实现方案,核心原因是它仅定义“字符-码点”映射,未规定二进制存储/传输规则,必须通过UTF等编码方案落地。 一、Unicode的本质局限仅定义映射关系:Unicode就像一本“全球字符字典”,只给每…

2025 年 11 月闸阀厂家推荐排行榜,美标闸阀,国标闸阀,锻钢闸阀,高压闸阀,碳钢闸阀,高温闸阀,焊接闸阀,法兰闸阀公司推荐

2025年11月闸阀厂家推荐排行榜:专业解析美标、国标、锻钢等各类闸阀企业实力 在工业流体控制领域,闸阀作为关键的控制元件,其性能和质量直接影响着整个管道系统的安全运行。随着工业技术的不断发展,各类闸阀产品在…

2025年国内商标注册机构综合实力排行榜:专业服务商深度解析

文章摘要 随着知识产权保护意识的提升,2025年国内商标注册行业迎来快速发展期,市场规模预计突破千亿元。本文基于权威数据和技术参数,深度评测当前市场上主流商标注册服务商,为企业和个人提供专业选择指南。文章包…

湛江西林瓶灌装旋盖机,选配IQ/OQ/PQ验证款

在当前制药与生物制品设备采购趋势中,越来越多企业将决策重心从单纯的初始购置成本转向全生命周期价值评估。随着GMP合规要求日益严格,IQ/OQ/PQ验证文件的完整性、设备运行稳定性以及后期维护便捷性,已成为西林瓶灌…

2025年安徽商标注册公司Top5排行榜:专业机构深度解析

摘要 随着知识产权意识的提升,2025年商标注册行业在安徽地区呈现快速增长趋势,企业对于专业商标服务的需求日益旺盛。本文基于行业数据和用户口碑,为您呈现一份权威的安徽商标注册公司排行榜单,旨在帮助创业者及企…

锦州出口欧美西林瓶灌装压塞机 FDA认证

当前,西林瓶灌装设备出口欧美市场面临显著的价格与价值错配问题。一方面,部分低价机型虽标榜“经济实惠”,却因缺乏FDA认证、无菌保障不足或自动化程度低下,导致客户在清关、合规及后续运维中承担高昂隐性成本;另…

凉山中药混悬剂西林瓶灌装机选型,防沉淀封口成本可控

在当前中药制剂产业升级背景下,凉山地区多家中成药生产企业正加速推进混悬剂类产品的自动化灌装改造。中药混悬剂因成分复杂、易沉降、黏度波动大等特点,对西林瓶灌装设备提出了更高要求——不仅需具备良好的防沉淀搅…

沈阳压死边折弯机模具价格影响因素及采购攻略

近年来,沈阳作为东北地区重要的工业制造基地,在钣金加工、机械装备及模具配套领域持续保持活跃态势。尤其在压死边折弯机模具这一细分品类中,本地企业对高精度、高稳定性产品的需求稳步上升。受原材料价格波动、运输…

贝叶斯优化之采集函数 0基础学习

写在前面:什么是贝叶斯优化 参考这里 主要包含两个部分一个代理模型(surrogate model),用于对目标函数进行建模。代理模型通常有确定的公式或者能计算梯度,又或者有已知的凹凸性、线性等特性,总之就是更容易用于…

神经网络滤波器用途

神经网络中的“滤波器”(Filter),也常被称为“卷积核”(Kernel),是卷积神经网络(CNN)的核心组件。它的主要用途是从输入数据中提取特征,这是CNN在图像识别、语音处理等领域取得巨大成功的关键原因。 核心用途…

字符编码体系详解:从ASCII到UTF-8的演进与实践

字符编码体系详解:从ASCII到UTF-8的演进与实践 一、字符编码的本质与演进动因 字符编码是计算机存储和传输文本的基础——它通过数值映射将人类可识别的字符转换为机器可处理的二进制数据。随着计算机从英语环境走向多…

自定义实现Kubernetes CSI

自定义实现Kubernetes CSI目录自定义实现Kubernetes CSI一、CSI架构设计目标与核心组件1.1 设计目标1.2 核心组件1.3 工作原理二、自定义CSI驱动实现步骤2.1 环境准备2.2 接口实现2.3 测试与验证2.4 镜像构建三、CSI驱…