参考、借鉴链接: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