hustoj安裝
爲了熟悉熟悉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安裝
首先安裝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
<?php @session_start();
ini_set("display_errors","Off"); //set this to "On" for debugging ,especially when no reason blank shows up.
ini_set("session.cookie_httponly", 1);
header('X-Frame-Options:SAMEORIGIN');
//for people using hustoj out of China , be careful of the last two line of this file !
// connect db
static $DB_HOST="localhost"; //數據庫服務器ip或域名
static $DB_NAME="jol"; //數據庫名
static $DB_USER="root"; //數據庫賬戶
static $DB_PASS="root"; //數據庫密碼
static $OJ_NAME="HUSTOJ"; //左上角顯示的系統名稱
static $OJ_HOME="./"; //主頁目錄
static $OJ_ADMIN="root@localhost"; //管理員email
static $OJ_DATA="/home/judge/data"; //測試數據目錄
static $OJ_BBS="discuss3";//"bbs" for phpBB3 bridge or "discuss" for mini-forum
static $OJ_ONLINE=false; //是否記錄在線情況
static $OJ_LANG="cn"; //默認語言
static $OJ_SIM=false; //顯示相似度
static $OJ_DICT=false; //顯示在線翻譯
static $OJ_LANGMASK=0; //1mC 2mCPP 4mPascal 8mJava 16mRuby 32mBash 1008 for security reason to mask all other language
static $OJ_EDITE_AREA=true;//true: syntax highlighting is active
static $OJ_ACE_EDITOR=true;
static $OJ_AUTO_SHARE=false;//true: One can view all AC submit if he/she has ACed it onece.
static $OJ_CSS="white.css";
static $OJ_SAE=false; //using sina application engine
static $OJ_VCODE=false; //驗證碼
static $OJ_APPENDCODE=false; // 代碼預定模板
static $OJ_CE_PENALTY=false; // 編譯錯誤是否罰時
static $OJ_PRINTER=false; //啓用打印服務
static $OJ_MAIL=false; //內郵
static $OJ_MARK="mark"; // "mark" for right "percent" for WA
static $OJ_MEMCACHE=false; //使用內存緩存
static $OJ_MEMSERVER="127.0.0.1";
static $OJ_MEMPORT=11211;
static $OJ_UDP=false; //使用UDP通知
static $OJ_UDPSERVER="127.0.0.1";
static $OJ_UDPPORT=1536;
static $OJ_REDIS=false; //使用REDIS隊列
static $OJ_REDISSERVER="127.0.0.1";
static $OJ_REDISPORT=6379;
static $OJ_REDISQNAME="hustoj";
static $SAE_STORAGE_ROOT="http://hustoj-web.stor.sinaapp.com/";
static $OJ_CDN_URL=""; // http://cdn.hustoj.com/ https://raw.githubusercontent.com/zhblue/hustoj/master/trunk/web/
static $OJ_TEMPLATE="bs3"; //使用的默認模板, [bs3 ie ace sweet sae] work with discuss3, [classic bs] work with discuss
if(isset($_GET['tp'])) $OJ_TEMPLATE=$_GET['tp'];
static $OJ_LOGIN_MOD="hustoj";
static $OJ_REGISTER=true; //允許註冊新用戶
static $OJ_REG_NEED_CONFIRM=false; //新註冊用戶需要審覈
static $OJ_NEED_LOGIN=false; //需要登錄才能訪問
static $OJ_RANK_LOCK_PERCENT=0; //比賽封榜時間比例
static $OJ_SHOW_DIFF=false; //是否顯示WA的對比說明
static $OJ_TEST_RUN=false; //提交界面是否允許測試運行
static $OJ_BLOCKLY=false; //是否啓用Blockly界面
static $OJ_ENCODE_SUBMIT=false; //是否啓用base64編碼提交的功能,用來回避WAF防火牆誤攔截。
static $OJ_OI_1_SOLUTION_ONLY=false; //比賽是否採用noip中的僅保留最後一次提交的規則。true則在新提交發生時,將本場比賽該題老的提交計入練習。
static $OJ_SHOW_METAL=true;//榜單上是否按比例顯示獎牌
static $OJ_RANK_LOCK_DELAY=3600;//賽後封榜持續時間,單位秒。根據實際情況調整,在閉幕式頒獎結束後設爲0即可立即解封。
static $OJ_BENCHMARK_MODE=false; //此選項將影響代碼提交,不再有提交間隔限制,提交後會返回solution id
//static $OJ_EXAM_CONTEST_ID=1000; // 啓用考試狀態,填寫考試比賽ID
//static $OJ_ON_SITE_CONTEST_ID=1000; //啓用現場賽狀態,填寫現場賽比賽ID
/* share code */
static $OJ_SHARE_CODE = false; // 代碼分享功能
//$OJ_ON_SITE_TEAM_TOTAL用於根據比例的計算獎牌的隊伍總數
//CCPC比賽的一種做法是比賽結束後導出終榜看AC至少1題的不打星的隊伍數,現場修改此值即可正確計算獎牌
//0表示根據榜單上的出現的隊伍總數計算(包含了AC0題的隊伍和打星隊伍)
static $OJ_ON_SITE_TEAM_TOTAL=0;
static $OJ_OPENID_PWD = '8a367fe87b1e406ea8e94d7d508dcf01';
/* weibo config here */
static $OJ_WEIBO_AUTH=false;
static $OJ_WEIBO_AKEY='1124518951';
static $OJ_WEIBO_ASEC='df709a1253ef8878548920718085e84b';
static $OJ_WEIBO_CBURL='http://192.168.0.108/JudgeOnline/login_weibo.php';
/* renren config here */
static $OJ_RR_AUTH=false;
static $OJ_RR_AKEY='d066ad780742404d85d0955ac05654df';
static $OJ_RR_ASEC='c4d2988cf5c149fabf8098f32f9b49ed';
static $OJ_RR_CBURL='http://192.168.0.108/JudgeOnline/login_renren.php';
/* qq config here */
static $OJ_QQ_AUTH=false;
static $OJ_QQ_AKEY='1124518951';
static $OJ_QQ_ASEC='df709a1253ef8878548920718085e84b';
static $OJ_QQ_CBURL='192.168.0.108';
//if(date('H')<5||date('H')>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文件
刪除其中兩行去除廣告
對於網上說不能修改公告的問題我沒有碰到,新版應該也對這進行了優化。