hustoj安裝學習(2019)

                                                      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文件

刪除其中兩行去除廣告

 對於網上說不能修改公告的問題我沒有碰到,新版應該也對這進行了優化。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章