2019最新超详细HUSTOJ在线判题系统及Virtual Judge的搭建

青旅半醒 2023-06-13 09:45 49阅读 0赞

文章目录

  • HUSTOJ
    • 一、HUSTOJ的安装
      • 基于Ubuntu16.04安装
      • 基于Ubuntu18.04安装
      • 基于Deepin15+安装
      • 基于CentOS7安装
      • 注意
    • 二、添加权限
    • 三、HUSTOJ的配置
    • 四、HUSTOJ的备份与恢复
      • 1.备份
      • 2.恢复
    • 五、HUSTOJ的升级
    • 六、HUSTOJ的修复
    • 七、HUSTOJ的美化
  • Virtual Judge
    • 一、Virtual Judge的安装
    • 二、Virtual Judge的部署
  • END

HUSTOJ

一、HUSTOJ的安装

为了熟悉linux系统及各种命令,最近在电脑上装了Ubuntu16.04,在尝试安装HUSTOJ的过程中碰到各种问题,分享一下。

在网上查博客也有2019安装OJ的,关于HUSTOJ的搭建教程,网上真的是有很多很多,而且现在开源的HUSTOJ的搭建已经几乎是傻瓜式的安装。
但我还是推荐官方的HUSTOJ安装说明:https://github.com/zhblue/hustoj.

基于Ubuntu16.04安装

首先安装Ubuntu16.04(推荐使用php7, 速度杠杠的),然后用下面脚本快速安装OJ(install-ubuntu16+.sh脚本地址):

  1. wget https://raw.githubusercontent.com/zhblue/hustoj/master/trunk/install/install-ubuntu16+.sh
  2. sudo bash install-ubuntu16+.sh

基于Ubuntu18.04安装

高级用户Ubuntu18.04,用下面脚本快速安装OJ(install-ubuntu18.04.sh脚本地址):

  1. wget https://github.com/zhblue/hustoj/raw/master/trunk/install/install-ubuntu18.04.sh
  2. sudo bash install-ubuntu18.04.sh

基于Deepin15+安装

国内桌面用户Deepin15.9+,可以用下面脚本快速安装OJ(install-deepin15.9.sh脚本地址):

  1. wget https://github.com/zhblue/hustoj/raw/master/trunk/install/install-deepin15.9.sh
  2. sudo bash install-deepin15.9.sh

基于CentOS7安装

如果你的是CentOS7,可以用下面脚本快速安装OJ(install-centos7.sh脚本地址):

  1. wget https://raw.githubusercontent.com/zhblue/hustoj/master/trunk/install/install-centos7.sh
  2. sudo bash install-centos7.sh

REDHAT/CENTOS用户请浏览:
https://github.com/zhblue/hustoj/blob/master/wiki/CentOSx86_64.md
https://github.com/zhblue/hustoj/blob/master/wiki/CentOS.md

注意

  1. 如果安装过程中让你配置数据库,让你写数据库名字那就写root,然后设一个数据库密码。
  2. 有的时候直接运行脚本会出错,而且一运行就停不下来,那么你可以进入对应的脚本地址中,直接一句一句的复制执行脚本安装。

部署完成后使用浏览器访问http://localhost或http://127.0.0.1就可以访问自己的OJ了,如果是用服务器部署的,直接输入http://公网IP就可以访问了。

二、添加权限

安装完成,用admin作为用户名注册一个用户,可自动成为超级管理员
当然如果你嫌admin不好听,也可以申请一个普通账户,然后再手动添加管理权限,这就涉及到数据库的操作了。

1.随便注册一个账户,然后执行:

  1. mysql -u root -p -A

输入自己设置的密码进入数据库。

2.进去后查看已有的数据库列表:

  1. show databases; #注意末尾有分号

然后会出现下面这个表:

  1. +--------------------+
  2. | Database |
  3. +--------------------+
  4. | information_schema |
  5. | jol |
  6. | mysql |
  7. | performance_schema |
  8. | sys |
  9. +--------------------+
  10. 5 rows in set (0.00 sec)

如果出现的不是这个请检查前面步骤。

3.我们选择jol数据库表:

  1. use jol;

4.为root账户 添加管理员权限:

  1. insert into privilege(user_id,rightstr) values('root','administrator');

5.然后我们就可以退出数据库了:

  1. exit

当然我们也可以按快捷键:Ctrl+D退出数据库管理。

三、HUSTOJ的配置

1.大部分功能和选项的开关和参数调整都在配置文件中,安装后几个重要配置文件的位置如下:

  1. /home/judge/etc/judge.conf #判题judged/judge_client
  2. /home/judge/src/web/include/db_info.inc.php #Web
  3. /etc/php5/fpm/php.ini /etc/php7.0/fpm/php.ini /etc/php.ini(in Centos7) #php
  4. /etc/nginx/sites-enabled/default /etc/nginx/nginx.conf(in Centos7) #nginx

HUSTOJ的两个重要配置文件(judge.confdb_info.inc.php),互相独立,分别供core和web使用。

core(judged/judge_client)使用的配置文件是judge.conf,内容如下:

  1. OJ_HOST_NAME=127.0.0.1 #用mysql连接读取数据库,数据库的主机地址
  2. OJ_USER_NAME=debian-sys-maint #数据库帐号
  3. OJ_PASSWORD=CM172iAvF10lrrKr #数据库密码
  4. OJ_DB_NAME=jol #数据库名称
  5. OJ_PORT_NUMBER=3306 #数据库端口
  6. OJ_RUNNING=4 #judged会启动judge_client判题,这里规定最多同时运行几个judge_client
  7. OJ_SLEEP_TIME=5 #judged通过轮询数据库发现新任务,轮询间隔的休息时间,单位秒
  8. OJ_TOTAL=1 #老式并发处理中总的judged数量
  9. OJ_MOD=0 #老式并发处理中,本judged负责处理solution_id按照TOTAL取模后余数为几的任务。
  10. OJ_JAVA_TIME_BONUS=2 #Java等虚拟机语言获得的额外运行时间
  11. OJ_JAVA_MEMORY_BONUS=64 #Java等虚拟机语言获得的额外内存
  12. OJ_JAVA_XMS=-Xms64M
  13. OJ_JAVA_XMX=-Xmx128M
  14. OJ_SIM_ENABLE=0 #//是否开启代码相似度比对,开启这个并且同时开启db_info.inc.php中static $OJ_SIM=false,才能启用OJ查重
  15. OJ_HTTP_JUDGE=0 #是否使用HTTP方式连接数据库,如果启用,则前面的HOST_NAME等设置忽略
  16. OJ_HTTP_BASEURL=http://127.0.0.1/JudgeOnline #使用HTTP方式连接数据库的基础地址,就是OJ的首页地址
  17. OJ_HTTP_USERNAME=admin #使用HTTP方式所用的用户帐号(HTTP_JUDGE权限),该帐号登录时不能启用VCODE图形验证码,但可以登录成功后启用。
  18. OJ_HTTP_PASSWORD=admin #使用HTTP方式所用的用户密码
  19. OJ_REDISENABLE=0
  20. OJ_REDISSERVER=127.0.0.1
  21. OJ_REDISPORT=6379
  22. OJ_REDISAUTH=123456
  23. OJ_REDISQNAME=hustoj
  24. OJ_OI_MODE=1 #是否启用OI(信息学奥林匹克竞赛)模式,即无论是否出错都继续判剩余的数据,在ACM比赛中一旦出错就停止运行。
  25. OJ_SHM_RUN=1 #是否使用/dev/shm的共享内存虚拟磁盘来运行答案,如果启用能提高判题速度,但需要较多内存。
  26. OJ_USE_MAX_TIME=1 #是否使用所有测试数据中最大的运行时间作为最后运行时间,如果不启用则以所有测试数据的总时间作为超时判断依据
  27. OJ_LANG_SET=0,1,2,3,4,5,6,7,8,9,10,11 #判题机评测语言,即C、C++、Java、Python......
  28. OJ_COMPILE_CHROOT=0
  29. OJ_TURBO_MODE=0
  30. OJ_CPU_COMPENSATION=0.88
  31. OJ_UDP_ENABLE=1
  32. OJ_UDP_SERVER=127.0.0.1
  33. OJ_UDP_PORT=1536

注意,core没有识别引号和注释的能力,所以不要自行增加任何引号或注释,否则可能影响judged的启动,上面的解释仅做阅读,不能放入配置文件。
web端使用的配置文件是db_info.inc.php,内容如下:

  1. static $DB_HOST="localhost"; //数据库服务器ip或域名
  2. static $DB_NAME="jol"; //数据库名
  3. static $DB_USER="debian-sys-maint"; //数据库账户
  4. static $DB_PASS="CM172iAvF10lrrKr"; //数据库密码
  5. static $OJ_NAME="HUSTOJ"; //左上角显示的系统名称
  6. static $OJ_HOME="./"; //主页目录
  7. static $OJ_ADMIN="root@localhost"; //管理员email
  8. static $OJ_DATA="/home/judge/data"; //测试数据目录
  9. static $OJ_BBS=false;//"bbs" for phpBB3 bridge or "discuss" for mini-forum or false for close any
  10. static $OJ_ONLINE=false; //是否记录在线情况
  11. static $OJ_LANG="en"; //默认语言
  12. static $OJ_SIM=false; //显示相似度
  13. static $OJ_DICT=false; //显示在线翻译
  14. static $OJ_LANGMASK=0; //1mC 2mCPP 4mPascal 8mJava 16mRuby 32mBash 1008 for security reason to mask all other language
  15. static $OJ_EDITE_AREA=true;//true: syntax highlighting is active
  16. static $OJ_ACE_EDITOR=true;
  17. static $OJ_AUTO_SHARE=false;//true: One can view all AC submit if he/she has ACed it onece.
  18. static $OJ_CSS="white.css";
  19. static $OJ_SAE=false; //using sina application engine
  20. static $OJ_VCODE=false; //验证码
  21. static $OJ_APPENDCODE=false; // 代码预定模板
  22. static $OJ_CE_PENALTY=false; // 编译错误是否罚时
  23. static $OJ_PRINTER=false; //启用打印服务
  24. static $OJ_MAIL=false; //内邮
  25. static $OJ_MARK="mark"; // "mark" for right "percent" for WA
  26. static $OJ_MEMCACHE=false; //使用内存缓存
  27. static $OJ_MEMSERVER="127.0.0.1";
  28. static $OJ_MEMPORT=11211;
  29. static $OJ_UDP=true; //使用UDP通知
  30. static $OJ_UDPSERVER="127.0.0.1";
  31. static $OJ_UDPPORT=1536;
  32. static $OJ_REDIS=false; //使用REDIS队列
  33. static $OJ_REDISSERVER="127.0.0.1";
  34. static $OJ_REDISPORT=6379;
  35. static $OJ_REDISQNAME="hustoj";
  36. static $SAE_STORAGE_ROOT="http://hustoj-web.stor.sinaapp.com/";
  37. static $OJ_CDN_URL=""; // http://cdn.hustoj.com/ https://raw.githubusercontent.com/zhblue/hustoj/master/trunk/web/
  38. static $OJ_TEMPLATE="bs3"; //使用的默认模板, [bs3 ie ace sweet sae] work with discuss3, [classic bs] work with discuss
  39. //if(isset($_GET['tp'])) $OJ_TEMPLATE=$_GET['tp'];
  40. static $OJ_LOGIN_MOD="hustoj";
  41. static $OJ_REGISTER=true; //允许注册新用户
  42. static $OJ_REG_NEED_CONFIRM=false; //新注册用户需要审核
  43. static $OJ_NEED_LOGIN=false; //需要登录才能访问
  44. static $OJ_RANK_LOCK_PERCENT=0; //比赛封榜时间比例
  45. static $OJ_SHOW_DIFF=false; //是否显示WA的对比说明
  46. static $OJ_TEST_RUN=false; //提交界面是否允许测试运行
  47. static $OJ_BLOCKLY=false; //是否启用Blockly界面
  48. static $OJ_ENCODE_SUBMIT=false; //是否启用base64编码提交的功能,用来回避WAF防火墙误拦截。
  49. static $OJ_OI_1_SOLUTION_ONLY=false; //比赛是否采用noip中的仅保留最后一次提交的规则。true则在新提交发生时,将本场比赛该题老的提交计入练习。
  50. static $OJ_OI_MODE=false;//是否开启OI比赛模式,禁用排名、状态、统计、用户信息、内邮、论坛等。
  51. static $OJ_SHOW_METAL=true;//榜单上是否按比例显示奖牌
  52. static $OJ_RANK_LOCK_DELAY=3600;//赛后封榜持续时间,单位秒。根据实际情况调整,在闭幕式颁奖结束后设为0即可立即解封。
  53. static $OJ_BENCHMARK_MODE=false; //此选项将影响代码提交,不再有提交间隔限制,提交后会返回solution id
  54. //static $OJ_EXAM_CONTEST_ID=1000; // 启用考试状态,填写考试比赛ID
  55. //static $OJ_ON_SITE_CONTEST_ID=1000; //启用现场赛状态,填写现场赛比赛ID
  56. /* share code */
  57. static $OJ_SHARE_CODE = false; // 代码分享功能
  58. /* recent contest */
  59. static $OJ_RECENT_CONTEST = false;// "http://algcontest.rainng.com/contests.json" ; // 名校联赛
  60. //$OJ_ON_SITE_TEAM_TOTAL用于根据比例的计算奖牌的队伍总数
  61. //CCPC比赛的一种做法是比赛结束后导出终榜看AC至少1题的不打星的队伍数,现场修改此值即可正确计算奖牌
  62. //0表示根据榜单上的出现的队伍总数计算(包含了AC0题的队伍和打星队伍)
  63. static $OJ_ON_SITE_TEAM_TOTAL=0;

有的时候,上面static $OJ_LANG="en";选的是英文,但是OJ网页上显示的却是中文,那么你可以将下面$OJ_LANG="cn";改成$OJ_LANG="en";试试,会有意想不到的惊喜呦,下面这个也是在db_info.inc.php文件中。
在这里插入图片描述
2.如果用户量比较大,报50X错误,可能需要修改/etc/nginx/nginx.conf中的设置:

  1. worker_processes 8; #其中数字8可以取CPU核心数的整数倍。
  2. events {
  3. worker_connections 2048;
  4. multi_accept on;
  5. }

3.如果遇到比赛人数多,比赛排名xls文件无法下载,请修改/etc/nginx/sites-enabled/default, 在fastcgi_pass一行的后面增加:

  1. fastcgi_buffer_size 128k;
  2. fastcgi_buffers 32 32k;

4.保存后,重启nginx:

  1. /usr/sbin/nginx -s reload

四、HUSTOJ的备份与恢复

1.备份

脚本安装的用户,可以使用install目录中的bak.sh进行备份:

  1. sudo bash /home/judge/src/install/bak.sh

备份后的数据在/var/backups/,如果学习了crontab的用法后,可以使用:

  1. sudo crontab -e

来定制自动备份计划,部分安装脚本中包含了自动备份,但可能需要运行上面的语句一次来激活。

2.恢复

如果要恢复,我们需要找到备份的两个压缩包,db_xxxxxxxx.sql.bz2hustoj_xxxxxxxx.tar.bz2,首先,我们将其解压缩:

  1. tar -jxvf hustoj_20191116.tar.bz2
  2. bzip2 -d db_20191116.sql.bz2

我们解压缩之后会有两个目录(home/var/)和一个数据库文件(db_xxxxxxxx.sql)。其中home里面存放的是一些数据,而var里面存放的和上面一样是db_xxxxxxxx.sql.bz2数据库文件。
然后,我们就进入新搭建好的HUSTOJ的数据库,将备份的数据库导入进去:

  1. sudo mysql -u root -p -A #登录mysql,这里的root根据你judge.conf而定,接着输入密码
  2. use jol; #进入jol数据库
  3. source /var/backups/db_xxxxxxxx.sql #旧OJ的sql文件路径

最后把home/judge文件夹上传覆盖即可。

五、HUSTOJ的升级

脚本安装的用户,可以使用install目录中的update-hustoj进行升级。

  1. sudo bash /home/judge/src/install/update-hustoj

升级脚本执行后,可能需要登陆web端管理后台,执行一次更新数据库

六、HUSTOJ的修复

自己不小心改坏了web代码,可以使用install目录中的fixing.sh进行系统修复。

  1. sudo bash /home/judge/src/install/fixing.sh

七、HUSTOJ的美化

1.首先就是OJ最下面的那两个二维码广告:

(1).我们可以通过修改/home/judge/src/web/template/bs3/js.php文件来去除:

  1. vim /home/judge/src/web/template/bs3/js.php
  2. #或者
  3. #cd /home/judge/src/web/template/bs3/
  4. #vim js.php

(2).找到这两行,将其注释或删除(注释://or/* */):

  1. $("body").append("<div id=footer class=center >GPLv2 licensed by <a href='https://github.com/zhblue/hustoj' >HUSTOJ</a> "+(new Date()).getFullYear()+" </div>");
  2. $("body").append("<div class=center > <img src='http://hustoj.com/wx.jpg' width='120px'><img src='http://hustoj.com/alipay.png' width='120px'><br> 欢迎关注微信公众号onlinejudge</div>");

(3).保存退出:wq,刷新网页,然后我们就可以看到广告消失了。

2.至于上面的广告就是公告了,进入后台管理,把公告删除就行了。

3.当我们发个新闻,新闻的下面会显示:
在这里插入图片描述
(1).这个我们可以在/home/judge/src/web/index.php:

  1. vim /home/judge/src/web/index.php
  2. #或者
  3. #cd /home/judge/src/web/
  4. #vim index.php

(2).在里面找到:

  1. $view_news .= "</div>";
  2. $view_news .= "<div class='panel-footer'>请到<a target='_blank' href='https://github.com/zhblue/hustoj'> GitHub</a>来,给我们加个星星! Please give us a star on <a target='_bla nk' href='https://github.com/zhblue/hustoj'>Github</a>!</div>";
  3. $view_news .= "</div>";

(3).将其注释掉或删除。

(4).如果你想去掉新闻标题后面的小尾巴:
在这里插入图片描述
(5).我们同样是在index.php文件中修改:

  1. vim /home/judge/src/web/index.php

(6).在里面找到:

  1. $view_news .= "<div class='panel-heading'><big>" . $row[ 'title' ] . /*"</big>-<small>" . $row[ 'user_id' ] .*/ "</small></div>";

(7).将"</big>-<small>" . $row[ 'user_id' ] .注释或删除掉:
在这里插入图片描述
4.OJ的评测结果默认是在后面加上一个分数的,例如Accepted100。
(1).如果想要去掉这个分数,我们只需要在/home/judge/src/web/status.php中找到(大概在295行左右):

  1. $view_status[$i][3].= "$mark</a>";

(2).将其注释或删除掉就行了:
在这里插入图片描述

Virtual Judge

一、Virtual Judge的安装

搭建Virtual Judge我还是推荐官方安装手册:https://github.com/zhblue/vjudge

如果你安装过HUSTOJ,并且是脚本安装的用户,那么你可以使用install目录中的install-vjudge.sh来进行安装:

  1. sudo bash /home/judge/src/install/install-vjudge.sh

如果不是,即可通过下面这个脚本命令来部署(脚本地址):

  1. wget https://github.com/zhblue/vjudge/raw/master/install.sh
  2. sudo bash install.sh

如果害怕中间会出错,可以上脚本地址中,一行一行地复制执行安装。

二、Virtual Judge的部署

Virtual Judge的配置文件是:config.properties,在/var/lib/tomcat7/webapps/vjudge/WEB-INF/classes/下。
1.首先,编辑config.properties设置数据库账号(如果有需要),将其中的两个路径修改成绝对路径:

  1. # remote OJ(absolute path)
  2. remoteAccountsConfig.location = remote_ accounts.json
  3. # HTTP client(absolute path)
  4. httpClientConfig. location = http_client.json

2.修改成:

  1. # remote OJ(absolute path)
  2. remoteAccountsConfig.location = /var/lib/tomcat7/webapps/vjudge/WEB-INF/classes/remote_ accounts.json
  3. # HTTP client(absolute path)
  4. httpClientConfig. location = /var/lib/tomcat7/webapps/vjudge/WEB-INF/classes/http_client.json

3.编辑remote_accounts.json设置各OJ网站的账号和密码。

4.到此,Virtual Judge就已经搭建完成了,在浏览器访问:http://服务器IP:8080/vjudge/即可使用vjudge。如果你是服务器搭建的话`服务器IP`就是你的`公网IP`,如果是本地客户端搭建的话问`服务器IP`就是`localhost`或`127.0.0.1`。

END

搭建的整个过程,主要是熟悉了一些Linux操作,并在其中体验了搭建制作完成后的快感。

如果本文有什么写的不对的地方或有什么建议和想法,欢迎在下方评论留言或私信我,大家一起进步学习!

发表评论

表情:
评论列表 (有 0 条评论,49人围观)

还没有评论,来说两句吧...

相关阅读