hustoj
最近在学习linux,就想着搭建一个oj玩玩。在网上找了好多教程,发现因为版本比较老,好多文件已经变了。装了好几次,中间出现各种问题,但是也借着这次机会对linux命令有了进一步的理解和认识。
因为网上下载的脚本安装时会出现各种情况,且最后还不能保证一定能搭建成功,文章后边有一个脚本,是经过修改的,可直接执行脚本搭建oj。
本文介绍了我在搭建中遇到的一些常见问题及解决办法,最后总结了一个脚本,直接运行即可安装成功,中间会有四个文件无法创建或无法连接,属于正常情况,不用理会,直接登录网站即可。在安装前期会提示设置数据库密码,请全部设置为root。
#####一、下面是我第一次安装成功的过程和一些解决办法:
1、先将用户切换为root,因为需要安装一些软件和执行一些命令,这样方便。
sd@sd:/$ su root
密码:
输入密码就行了
2、将下边的命令粘贴到终端,最好先C++d到home目录,下载之后的install-ubuntu16+.sh脚本就在home目录
wget HTTPs://raw.githubusercontent.com/zhblue/hustoj/master/trunk/install/install-ubuntu16+.sh
3、在运行install-ubuntu16+.sh脚本的时候cd到home目录,因为脚本里的一些重要软件可能安装不上,所以先提前安一下。
apt-get update
apt-get install mysql-server mysql-client
//在执行完这句后,会弹出一个窗口让设定mysql的密码,要设定为root
apt-get install nginx
//这个容易出错,我之前直接运行脚本,这个安装会有错误。在安装完之后再运行一下下边的命令看一下有没有错误,有的话直接解决,不然后边很麻烦。
nginx -t
apt-get install php7.0
下面是运行nginx -t之后的结果,说明没问题。如果报错可能是有一个文件里多注释了一行,会有提示是哪个文件,对照一下{}(花括号)就知道哪行是多注释的了。
root@sd:/# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
将以上三个安装好之后其实就可以避免绝大多数问题了,剩下的问题可能也就是少了个文件啊啥的。
4、接下来就是运行脚本了,但是不建议直接运行脚本进行安装,因为中间可能会出现问题,然后再去改的花会很麻烦的,所以,强烈建议自己手动复制命令去运行,一旦出现问题直接去解决,这样会容易很多。我就是自己手动执行的,虽然你会感觉很麻烦,还慢,但是最后你会发现自己手动执行比执行脚本不止快了一点,因为执行脚本一旦出现问题,不会直接停下来,等停下来可能已经出好多错误了。
5、在执行 chown www-data src/web/upload data run0 run1 run2 run3 这条命令时,可能会报错没有run0 run1 run2 run3文件夹,那么基本上就是之前的命令没有执行对
if grep “OJ_SHM_RUN=0” etc/judge.conf ; then
mkdir run0 run1 run2 run3
chown www-data run0 run1 run2 run3
fi
解决办法:
在执行这句命令之前,就去 etc/judge.conf 中看看 OJ_SHM_RUN=0这句是否等于0,如果不是,将值改为0,然后在运行上边的命令即可。
6、还有就是在执行 ./make.sh 这句的时候会报错,是因为make.sh脚本中
rm /usr/bin/sim_rb /usr/bin/sim_sh
//这句会报错 因文件不存在无法删除
ln -s /usr/bin/sim_c /usr/bin/sim_cc
//这句会报错 因为文件已存在无法连接
这两个错误可以不用理会,因为那两个文件本来就需要删除的,第二句链接既然已经存在了,也就不用再去连了。
7、后边基本上就可以安装成功了。
8、打开oj,打开浏览器,输入127.0.0.1进入oj的页面,如果标签那块已经显示oj的图标了(像下图那样),但是页面上一片空白,也没有报错
是因为数据库没有给密码,无法连接到数据库的原因。先打开/home/judge/src/web/include/db_info.inc.php
找到图片中最后一行的 static $DB_PASS=“root”,我这里双引号中的root是数据库的密码(就是最开始安装数据库时弹窗里填写的密码),你的这里双引号中应该是什么都没有的,将密码填进去就OK了。
9、到这里基本就是我安装这个oj的大致过程了。因为遇到的情况有限,如果出现其他问题,请根据install-ubuntu16+.sh脚本 中的命令自行更正。
#####二、用修改过后的脚本安装,一键搞定
上面的安装方法虽然也能安装上,但还是会出现各种问题,不一定一次就装上了。
后来发现其中的安装脚本在安装重要软件的时候总是会出错,或者配置出错导致不能正常判题,我就出现过永久等待,刚解决完又是永久编译,然后就是一直编译错误。
永久等待可能是judged没有启动服务,可以用 ps -A命令来查看,如果找不到judged那就输入judged,来启动服务。如果启动后还是永久等待的话,就需要查看/home/judge/etc/judge.conf 和 /home/judge/src/web/include/db_info.inc.php 这两个目录下的配置是否正确,特别是/home/judge/etc/judge.conf里边的 OJ _RUNNING=4 。
下面是我修改过后的脚本:
#!/bin/bash
apt-get update
sudo apt-get upgrade
apt-get install -y mysql-server mysql-client
apt-get install -y php7.0
apt-get install -y nginx
apt-get install -y subversion
/usr/sbin/useradd -m -u 1536 judge
cd /home/judge/
svn co https://github.com/zhblue/hustoj/trunk/trunk/ src
apt-get install -y make
apt-get install -y flex
apt-get install -y g++
apt-get install -y clang
apt-get install -y libmysqlclient-dev
apt-get install -y libmysql++-dev
apt-get install -y php-fpm
apt-get install -y php-common
apt-get install -y php-xml-parser
apt-get install -y php-mysql
apt-get install -y php-gd
apt-get install -y php-zip
apt-get install -y fp-compiler
apt-get install -y openjdk-8-jdk
apt-get install -y mono-devel
apt-get install -y php-mbstring
apt-get install -y php-xml
apt-get install -y php-memcache memcached
USER=`cat /etc/mysql/debian.cnf |grep user|head -1|awk '{print $3}'`
PASSword=`cat /etc/mysql/debian.cnf |grep password|head -1|awk '{print $3}'`
cpu=`grep "cpu cores" /proc/cpuinfo |head -1|awk '{print $4}'`
mkdir etc data log
cp src/install/java0.policy /home/judge/etc
cp src/install/judge.conf /home/judge/etc
chmod +x src/install/ans2out
if grep "OJ_SHM_RUN=0" etc/judge.conf ; then
mkdir run0 run1 run2 run3
chown www-data run0 run1 run2 run3
fi
sed -i "s/OJ_USER_NAME=root/OJ_USER_NAME=$USER/g" etc/judge.conf
sed -i "s/OJ_PASSWORD=root/OJ_PASSWORD=$PASSWORD/g" etc/judge.conf
sed -i "s/OJ_COMPILE_CHROOT=1/OJ_COMPILE_CHROOT=0/g" etc/judge.conf
sed -i "s/OJ_RUNNING=1/OJ_RUNNING=$CPU/g" etc/judge.conf
chmod 700 etc/judge.conf
sed -i "s/DB_USER=\"root\"/DB_USER=\"$USER\"/g" src/web/include/db_info.inc.php
sed -i "s/DB_PASS=\"root\"/DB_PASS=\"$PASSWORD\"/g" src/web/include/db_info.inc.php
chmod 700 src/web/include/db_info.inc.php
chown www-data src/web/include/db_info.inc.php
chown www-data src/web/upload data run0 run1 run2 run3
if grep client_max_body_size /etc/nginx/nginx.conf ; then
echo "client_max_body_size already added" ;
else
sed -i "s:include /etc/nginx/mime.types;:client_max_body_size 80m;\n\tinclude /etc/nginx/mime.types;:g" /etc/nginx/nginx.conf
fi
mysql -h localhost -u$USER -p$PASSWORD < src/install/db.sql
echo "insert into jol.privilege values('admin','adMinistrator','N');"|mysql -h localhost -u$USER -p$PASSWORD
sed -i "s:root /var/www/HTML;:root /home/judge/src/web;:g" /etc/nginx/sites-enabled/default
sed -i "s:index index.html:index index.php:g" /etc/nginx/sites-enabled/default
sed -i "s:#location ~ \\\.php\\$:location ~ \\\.php\\$:g" /etc/nginx/sites-enabled/default
sed -i "s:#\tinclude snippets:\tinclude snippets:g" /etc/nginx/sites-enabled/default
sed -i "s|#\tfastcgi_pass unix|\tfastcgi_pass unix|g" /etc/nginx/sites-enabled/default
sed -i "s:}#added_by_hustoj::g" /etc/nginx/sites-enabled/default
sed -i "s|# deny access to .htaccess files|}#added by hustoj\n\n\n\t# deny access to .htaccess files|g" /etc/nginx/sites-enabled/default
/etc/init.d/nginx restart
sed -i "s/post_max_size = 8M/post_max_size = 80M/g" /etc/php/7.0/fpm/php.ini
sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 80M/g" /etc/php/7.0/fpm/php.ini
COMPENSATION=`grep 'mips' /proc/cpuinfo|head -1|awk -F: '{printf("%.2f",$2/5000)}'`
sed -i "s/OJ_CPU_COMPENSATION=1.0/OJ_CPU_COMPENSATION=$COMPENSATION/g" etc/judge.conf
/etc/init.d/php7.0-fpm restart
service php7.0-fpm restart
cd src/core
chmod +x ./make.sh
./make.sh
if grep "/usr/bin/judged" /etc/rc.local ; then
echo "auto start judged added!"
else
sed -i "s/exit 0//g" /etc/rc.local
echo "/usr/bin/judged" >> /etc/rc.local
echo "exit 0" >> /etc/rc.local
fi
if grep "bak.sh" /var/spool/cron/crontabs/root ; then
echo "auto backup added!"
else
echo "1 0 * * * /home/judge/src/install/bak.sh" >> /var/spool/cron/crontabs/root
fi
ln -s /usr/bin/mcs /usr/bin/gmcs
/usr/bin/judged
cp /home/judge/src/install/hustoj /etc/init.d/hustoj
update-rc.d hustoj defaults
附录:安装后几个重要配置文件的位置
/home/judge/etc/judge.conf
/home/judge/src/web/include/db_info.inc.php
/etc/php/7.0/fpm/php.ini
/etc/nginx/sites-enabled/default
如遇其他情况可以针对这几个文件进行修改,也有可能是某个软件没有安装导致的OJ不能正常运行。
目录:/home/judge/etc/judge.conf
OJ_HOST_NAME=127.0.0.1 #mysql host ip
OJ_USER_NAME=root #mysql host username
OJ_PASSWORD=root #mysql host password
OJ_DB_NAME=jol #mysql DB name
OJ_PORT_NUMBER=3306 #mysql port
OJ_RUNNING=4 #max concurrent threads number of judge_client
OJ_SLEEP_TIME=5 #judged work Interval
OJ_TOTAL=1 #Deprecated: total number of judged (hosts/processes)
OJ_MOD=0 #Deprecated: the number of this judged(host)
OJ_JAVA_TIME_BONUS=2 #java's extral time
OJ_JAVA_MEMORY_BONUS=512 #java's extral memory
OJ_SIM_ENABLE=0 #using sim
OJ_HTTP_JUDGE=0 #using http link to database(if enabled,mysql is not used anymore)
OJ_HTTP_BASEURL=http://127.0.0.1/JudgeOnline #http link basedir
OJ_HTTP_USERNAME=admin #account in db that has http_judge privilege
OJ_HTTP_PASSWORD=admin #password of this account
OJ_OI_MODE=0 #using oi (Olympiad in Informatics) mode
OJ_SHM_RUN=0 #using /dev/shm for fast running & low harddisk wear
OJ_USE_MAX_TIME=0 #use the max time of all testcase rather than total time
OJ_LANG_SET=0,1,2,3,4 #selective judge solution of languages
OJ_HOST_NAME=127.0.0.1 如果用mysql连接读取数据库,数据库的主机地址
OJ_USER_NAME=root 数据库帐号
OJ_PASSWORD=root 数据库密码
OJ_DB_NAME=jol 数据库名称
OJ_PORT_NUMBER=3306 数据库端口
OJ_RUNNING=4 judged会启动judge_client判题,这里规定最多同时运行几个judge_client
OJ_SLEEP_TIME=5 judged通过轮询数据库发现新任务,轮询间隔的休息时间,单位秒
OJ_TOTAL=1 老式并发处理中总的judged数量
OJ_MOD=0 老式并发处理中,本judged负责处理solution_id按照TOTAL取模后余数为几的任务。
OJ_JAVA_TIME_BONUS=2 Java等虚拟机语言获得的额外运行时间。
OJ_JAVA_MEMORY_BONUS=512 Java等虚拟机语言获得的额外内存。
OJ_SIM_ENABLE=0 是否使用sim进行代码相似度的检测
OJ_HTTP_JUDGE=0 是否使用HTTP方式连接数据库,如果启用,则前面的HOST_NAME等设置忽略。
OJ_HTTP_BASEURL=http://127.0.0.1/JudgeOnline 使用HTTP方式连接数据库的基础地址,就是OJ的首页地址。
OJ_HTTP_USERNAME=admin 使用HTTP方式所用的用户帐号(HTTP_JUDGE权限),该帐号登录时不能启用VCODE图形验证码,但可以登录成功后启用。
OJ_HTTP_PASSWORD=admin 密码
OJ_OI_MODE=0 是否启用OI模式,即无论是否出错都继续判剩余的数据,在ACM比赛中一旦出错就停止运行。
OJ_SHM_RUN=0 是否使用/dev/shm的共享内存虚拟磁盘来运行答案,如果启用能提高判题速度,但需要较多内存。
OJ_USE_MAX_TIME=1 是否使用所有测试数据中最大的运行时间作为最后运行时间,如果不启用则以所有测试数据的总时间作为超时判断依据。
OJ_LANG_SET=0,1,2,3,4 #判哪些语言的题目
目录:/home/judge/src/web/include/db_info.inc.php
static $DB_HOST="localhost"; 数据库的服务器地址
static $DB_NAME="jol"; 数据库名
static $DB_USER="root"; 数据库用户名
static $DB_PASS="root"; 数据库密码
// connect db
static $OJ_NAME="HUSTOJ"; OJ的名字,将取代页面标题等位置HUSTOJ字样。
static $OJ_HOME="./"; OJ的首页地址
static $OJ_ADMIN="root@localhost"; 管理员email
static $OJ_DATA="/home/judge/data"; 测试数据所在目录,实际位置。
static $OJ_BBS="discuss";//"bbs" 论坛的形式,discuss为自带的简单论坛,bbs为外挂论坛,参考bbs.php代码。
static $OJ_ONLINE=false; 是否使用在线监控,需要消耗一定的内存和计算,因此如果并发大建议关闭
static $OJ_LANG="en"; 默认的语言,中文为cn
static $OJ_SIM=true; 是否显示相似度检测的结果。
static $OJ_DICT=true; 是否启用在线英字典
static $OJ_LANGMASK=1008; //1mC 2mCPP 4mpascal 8mJava 16mRuby 32mBash 1008 for security reason to mask all other language 用掩码表示的OJ接受的提交语言,可以被比赛设定覆盖。
static $OJ_EDITE_AREA=true;// 是否启用高亮语法显示的提交界面,可以在线编程,无须IDE。
static $OJ_AUTO_SHARE=false;//true: 自动分享代码,启用的话,做出一道题就可以在该题的Status中看其他人的答案。
static $OJ_css="hoj.css"; 默认的css,可以选择dark.css和gcode.css,具有有限的界面制定效果。
static $OJ_SAE=false; //是否是在新浪的云平台运行web部分
static $OJ_VCODE=true; 是否启用图形登录、注册验证码。
static $OJ_APPENDCODE=false; 是否启用自动添加代码,启用的话,提交时会参考$OJ_DATA对应目录里是否有append.c一类的文件,有的话会把其中代码附加到对应语言的答案之后,巧妙使用可以指定main函数而要求学生编写main部分调用的函数。
static $OJ_MEMCACHE=false;是否使用memcache作为页面缓存,如果不启用则用/cache目录
static $OJ_MEMSERVER="127.0.0.1"; memcached的服务器地址
static $OJ_MEMPORT=11211; memcached的端口
static $OJ_RANK_LOCK_PERCENT=0; //比赛封榜时间的比率,如5小时比赛设为0.2则最后1小时封榜。
static $OJ_SHOW_DIFF=false; //显示WrongAnswer时的对比