在Centos8上部署基于jnoj二次开发的qluoj的流程,以及出现的问题和解决方法


一、部署流程

系统Centos8.0

预安装:

  • LNMP环境一键安装(mysql 5.5.62, php7.4.21, nginx1.20.1):
    wget http://soft.vpser.net/lnmp/lnmp1.8.tar.gz -cO lnmp1.8.tar.gz && tar zxf lnmp1.8.tar.gz && cd lnmp1.8 && ./install.sh lnmp
    
  • Git安装:
    yum install -y git
    

部署命令:(在root用户下)

git clone https://github.com/linkscx/qluoj
cd qluoj
vim config/db.php #修改mysql配置,主要是修改密码
./yii install
useradd -m -u 1536 judge #创建一个用于判题的用户
yum install mysql-devel #安装编译的依赖
cd judge
make
./dispatcher
cd ../polygon
make
./polygon

配置nginx.conf

server {
        listen       80;
        listen [::]:80 default_server;
        
        # 填qluoj/web目录的位置
        root /home/wwwroot/qluoj/web;
        
        index index.php;
        
        server_name _;
        
        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                include fastcgi.conf;

				# 填find / -name "*php*.sock"的位置
                fastcgi_pass unix:/tmp/php-cgi.sock;
        }
}

二、出现的问题描述和解决方法


· 在qluoj目录下执行./yii install时,出现“Error: passthru() has been disabled for security reasons”

原因:php默认禁用部分函数
解决方法:修改php.ini,从中找到

disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server

disable_functions前面加分号; 注释掉这句代码


· 编译judge和polyogn时,编译信息为“fatal error: ‘mysql/mysql.h’ file not found”

原因:缺少libmysqlclient-devlibmysql++\-dev编译的依赖

解决方法:

yum install mysql-devel

· 使用LNMP一键安装环境,访问网页500错误,nginx_error.log为"FastCGI sent in stderr: "PHP message: PHP Warning: require(): open_basedir restriction in effect. "

解决方法:关闭防跨目录设置

1.如果网站根目录下有.user.ini,进入到网站根目录

chattr -i .user.ini
rm -f .user.ini

需要重启php-fpm

2.找到 /usr/local/nginx/conf/fastcgi.conf 里面的 fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";在该行行前添加 # 或删除改行,需要重启nginx


· 在OJ中提交的代码一直处于Pending状态,评测机日志(./judge/log/client.log)为"Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2) ; MySQL server has gone away"

解决方法: 编辑 ./judge/config.ini./polygon/config.ini
取消注释这句话,

# OJ_MYSQL_UNIX_PORT=/var/lib/mysql/mysql.sock #MySQL 连接套接字路径

并且把OJ_MYSQL_UNIX_PORT路径换成如下find命令找到的的结果

find / -name "mysql.sock"

· 在OJ中提交的代码,Compile Error信息为"/usr/bin/ld: cannot find -lc,-lm,-lstdc"

错误信息:
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lm
/usr/bin/ld: cannot find -lstdc
collect2: error: ld returned 1 exit status

解决方法:安装glibc-staticstdlibc++\-static静态链接

wget http://mirror.centos.org/centos/8/PowerTools/x86_64/os/Packages/glibc-static-2.28-151.el8.x86_64.rpm
rpm -ivh glibc-static-2.28-151.el8.x86_64.rpm  --nodeps
wget 	http://mirror.centos.org/centos/8/PowerTools/x86_64/os/Packages/libstdc++-static-8.4.1-1.el8.x86_64.rpm
rpm -ivh libstdc++-static-8.4.1-1.el8.x86_64.rpm  --nodeps

· Polygon出题时保存SPJ时无法自动编译,在qluoj/polygon/data/polygon_id/目录下找不到spj可执行文件

解决方法:
1.把网站根目录下的ilbraries/testlib.h复制到gcc头文件目录中(一般是/usr/include)

cp libraries/testlib.h /usr/include/testlib.h

2.找到安装的php根目录下的etc/php-fpm.conf配置文件,一般是在/usr/local/php/etc/php-fpm.conf,可以用find命令查找
在最后面添加

env[PATH] = /usr/local/bin:/usr/bin:/bin

重启php-fpm,在前端页面中重新保存spj程序

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linkscx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值