參考、借鑒鏈接:https://blog.csdn.net/k_young1997/article/details/81629818
校內ACM即將開展,本來我們的主服務器是能夠容納150支隊伍同時提交代碼進行判斷。只因今年獎品過於誘人,導致今年參賽隊伍在170到180支隊伍之間,大大超過我們估計值。這對主服務器也是一個不曉得考研。為了分擔主服務器的壓力與防止比賽過程中出現意外導致比賽不得不中止,我們主辦方打算采用分布式系統,再搭幾個OJ判斷機用來分擔主服務器的壓力。
因為在網絡上的教程與我真實的系統環境有點出入,中間出現各種問題, 重裝系統好幾次。所以寫一篇博客記錄下自己心路歷程。
本文介紹了我在搭建中的注意事項。在安裝前期會提示設置數據庫密碼,全部設置為root。
#####一、下面是我第一次安裝成功的過程
1、先將用戶切換為root用戶
$ sudo su
密碼:
2、先cd到home目錄下,再將下面的命令粘貼到終端,下載的install-ubuntu16+.sh腳本就在home目錄下
# cd # wget https://raw.githubusercontent.com/zhblue/hustoj/master/trunk/install/install-ubuntu16+.sh
3、先安裝下前置軟件,避免后面運行腳本時出現各種奇奇怪怪的問題
# apt-get update # apt-get install mysql-server mysql-client //在執行完這條命令后會提示設置mysql的密碼,一定要設置為root,不然會影響后面腳本的運行 # apt-get install nginx //這個很容易出錯,在安裝完后運行下排錯命令查看nginx安裝是否出錯 # nginx -t #apt-get install php7.0
下面是運行nginx -t排錯命令之后的結果,如果出現以下提示就說明沒問題。
root@max-studio3:~# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
使用以下命令查看nginx是否工作
# service nginx status
如果出現綠色的 active runing 就代表這個組件成功運行
先將mysql、nginx、php7.0三個前置軟件安裝好之后,后面可以避免大部分問題,剩下的問題大概就是配置文件沒配置對什么的。
4、接下來就是運行腳本了,很多博客不建議直接運行腳本進行安裝,因為中間路徑、文件、配置等等會出現各種各種問題。在這里我也建議打開腳本文件一條命令一條命令的去執行,出現問題立馬排錯。
接下來就是我手動執行命令踩過的坑
4.1、在home路徑下打開 install-ubuntu16+.sh腳本
# cd $HOME # gedit install-ubuntu16+.sh
4.2、當執行到第五行代碼時,這時的路徑就會發生改變
# cd /home/judge/
注:此后的命令很多都是在此路徑下運行的
4.3、執行到第一個if語句之前
if grep "OJ_SHM_RUN=0" etc/judge.conf ; then mkdir run0 run1 run2 run3 chown judge run0 run1 run2 run3 fi
先去/home/judge/etc 打開judge.conf配置文件 把 OJ_SHM_RUN=1 改為OJ_SHM_RUN=0
然后再退回到 /home/judge目錄,接着再執行以下命令,就能夠成功創建run0 run1 run2 run3 這四個文件夾
if grep "OJ_SHM _RUN=0" etc/judge.conf ; then mkdir run0 run1 run2 run3 chown judge run0 run1 run2 run3 fi
4.4、 執行以下命令時,一定要在 /home/judge的路徑下執行;並且接下來的代碼都要在這個路徑下執行
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
4.5、當執行到以下命令時有可能會出錯
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
報錯信息為:
mysql:[Warning] Using a password on the command line interface can be insecure.
解決辦法:將上述命令改為:
mysql -h localhost -u root -p < src/install/db.sql echo "insert into jol.privilege values('admin','administrator','N');"|mysql -h localhost -u root -p
4.6、當執行到下面的命令時
/etc/init.d/nginx restart
出現以下信息就證明nginx已成功配置並重啟服務
[ OK ] Restarting nginx ( via systemctl ): nginx.service.
4.7、執行這條命令時
/etc/init.d/php7.0-fpm restart
出現以下信息證明php已成功配置並重啟服務
[ OK ] Restarting php7.0 - fpm ( via systemctl ): php7.0 - fpm.service
4.8、執行以下命令時
cd src/core chmod +x ./make.sh ./make.sh //特別是這一句
會報錯,原因是在make.sh腳本中
rm /usr/bin/sim_rb /usr/bin/sim_sh //這句會報錯 因文件不存在無法刪除 ln -s /usr/bin/sim_c /usr/bin/sim_cc //這句會報錯 因為文件已存在無法連接
這兩個錯誤可以不用理會,因為那兩個文件本來就需要刪除的,第二句鏈接既然已經存在了,也就不用再去連了。
4.9、當執行以下命令時,其路徑要在 /home/judge/src/core 下執行
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
4.10、 當執行以下命令時,其路徑要在 /var/spool/cron/crontabs 下執行
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
最后幾條命令依然在 /var/spool/cron/crontabs 此路徑下執行。所有命令執行完畢后,OJ已經搭好了。在瀏覽器輸入http://127.0.0.1 回路地址測試。能順利打開本地網頁就證明 OJ已經搭建完畢。
附錄:OJ安裝后四個重要配置文件的位置
/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
