为了熟悉熟悉linux系统及各种命令,最近在电脑上装了虚拟机安装ubuntu16.04,在尝试安装hustoj过程中碰到各种问题,分享一下:
在网上查博客也有2019安装OJ的,看了很多,知道直接可以直接两行命令安装成功但是又不确定。由于不了解,看有人还准备LAMP环境配置,自己也开始怼。配置好了LAMP一步一步的和人家博客上也都一样,以为再把两行命令输入就可以。可是输入了两行命令开始各种报错。发现是nginx的问题,各种查、配置文件。还是不可以。最后看到是apache2和nginx两个web服务器端口冲突,关闭了apache。nginx可以访问了这个时候OJ也可以进入,可以正常判题什么的了。后来才从github网页上看到安装说明,了解到hustoj老版本的是用apache的,新版本用的是nginx。(自己不做好准备工作的后果啊,提醒以后安装的同志们要先看看官网怎么说啊,多看一些资料,不要直接按别人的来)hustoj安装说明:https://github.com/zhblue/hustoj#安装说明
由于第一次安装的种种问题,卸载重新安装了一次,按照github安装说明直接获取github上的脚本,执行脚本安装。
首先安装ubuntu16.04(推荐使用,php7速度杠杠的),然后用下面脚本快速安装OJ:
wget https://raw.githubusercontent.com/zhblue/hustoj/master/trunk/install/install-ubuntu16+.sh
sudo bash install-ubuntu16+.sh
直接执行脚本也能安装成功,但是直接运行脚本且一运行就停不下来怕会报错,直接一句一句的复制的脚本安装;
不过在运行脚本之前我先安装了php7.0、mysql以及nginx;测试nginx后再进行复制脚本。
#!/bin/bash
apt-get update
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 flex g++ clang libmysqlclient-dev libmysql++-dev php-fpm php-common php-xml-parser nginx mysql-server php-mysql php-gd php-zip fp-compiler openjdk-8-jdk mono-devel php-mbstring 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 backup
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 judge 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 backup
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 -R www-data src/web/
chown www-data src/web/upload data
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
if grep "added by hustoj" /etc/nginx/sites-enabled/default ; then
echo "default site modified!"
else
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
fi
/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
sed -i 's/;request_terminate_timeout = 0/request_terminate_timeout = 128/g' `find /etc/php -name www.conf`
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
一些命令解释:
apt-get update #获取更新资源包
apt-get upgrade #本机软件全部更新
apt-get install -y mysql-server mysql-client #安装mysql
apt-get install -y php7.0 #安装php7.0
apt-get install -y nginx #安装nginx服务器
apt-get install -y subversion #安装SVN(版本管理软件系统)
/usr/sbin/useradd -m -u 1536 judge #建立用户judge且自动建立用户的登入目录指定id。
cd /home/judge/ #到judge目录下
svn co https://github.com/zhblue/hustoj/trunk/trunk/ src #在你的当前目录下, 创建一个src的文件夹, svn的trunk的文件的内容, 会复制到当前src文件中。
-----------------------------------------------------------------------------------------
使用apt install和使用apt-get install的区别是什么?
区别:前者是通过本地安装,后者是通过网络获取安装包安装。
apt-get是老版的命令,apt是新版的命令。
---------------------------------------------------
apt-get -y install中的-y是什么意思?
是同意的意思。没有 -y的命令也可以执行,系统会提示你是否安装,输入y,回车,就会安装了
apt-get -y install这个指令则是跳过系统提示,直接安装。确认的意思
关于OJ的配置问题:看了网上都说要改两个文件中数据库的用户和密码,我安装好之后两个文件中的数据库用户名密码都是一串字符,发现不改也可以进入OJ(应该是github上在更新的原因)
两个文件:一个是 /home/judge/src/web/include 目录下的db_info.inc.php文件,
另一个是 /home/judge/etc目录下的judge.conf 文件。
配置文件db_info.inc.php
21||isset($_GET['dark'])) $OJ_CSS="dark.css";
if( isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && strstr($_SERVER['HTTP_ACCEPT_LANGUAGE'],"zh-CN")) {
$OJ_LANG="cn";
}
if (isset($_SESSION[$OJ_NAME.'_'.'OJ_LANG'])) $OJ_LANG=$_SESSION[$OJ_NAME.'_'.'OJ_LANG'];
require_once(dirname(__FILE__)."/pdo.php");
// use db
//pdo_query("set names utf8");
if(isset($OJ_CSRF)&&$OJ_CSRF&&$OJ_TEMPLATE=="bs3"&&basename($_SERVER['PHP_SELF'])!="problem_judge")
require_once(dirname(__FILE__)."/csrf_check.php");
//sychronize php and mysql server with timezone settings, dafault setting for China
//if you are not from China, comment out these two lines or modify them.
//date_default_timezone_set("PRC");
//pdo_query("SET time_zone ='+8:00'");
配置文件judge.conf注释
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 #判哪些语言的题目
这个时候在浏览器输入127.0.0.1就可以访问自己的OJ了,我是在虚拟机ubuntu下安装的,本机win 10输入ubuntu的ip也可进入OJ,但是不明白为什么局域网内的其他电脑访问不了,也试着改了nginx的配置,还有虚拟机的网络适配器,都不行。但是在服务器上试的(安装的也是Ubuntu16.04)不用改任何配置文件就可以局域网访问。(希望有大佬能给我解惑)
OJ安装完成后注册一个admin用户为超级管理员。
去除OJ广告:修改/home/judge/src/web/template/bs3/js.php文件
删除其中两行去除广告
对于网上说不能修改公告的问题我没有碰到,新版应该也对这进行了优化。