1、前言
HOJ的判题机底层使用的是go-judge,本教程介绍如何基于服务器直接部署go-judge判题服务;
官网:GitHub - criyle/go-judge: Sandbox Server in REST / gRPC API. Based on Linux container technologies.
官方中文文档:go-judge/README.cn.md at master · criyle/go-judge · GitHub
go-sandbox 官网 https://github.com/criyle/go-sandbox
go-judge是由REST / gRPC API实现的,底层是go-sandbox
部署go-judge有两种方式:
(1)直接服务器部署,用官网给的可执行文件;
(2)Docker部署,用官网给的命令,会基于官网镜像生成docker容器。
以上两种方式都不需要额外安装go环境,但判题环境比如c++,python等需要安装。
官网也给出了使用go-judge的例子:GitHub - criyle/go-judge-demo
在该例子中,可基于Dockerfile.exec,构建自己的镜像。给出了如何构建一个go-judge镜像。
2、部署流程
2.1 下载可执行二进制文件
官网:GitHub - criyle/go-judge: Sandbox Server in REST / gRPC API. Based on Linux container technologies.
官方中文文档:go-judge/README.cn.md at master · criyle/go-judge · GitHub
自行根据自己的服务器版本选择,一般情况下是选这个:
2.2 上传至服务器目录
把他放到服务器某个目录下:
楼主放到了
[root@VM-12-11-centos go-judge]# pwd
/root/cicyle/go-judge
[root@VM-12-11-centos go-judge]# ls
go-judge go-judge_1.8.2_linux_amd64.tar.gz mount.yaml
[root@VM-12-11-centos go-judge]#
然后解压缩go-judge_1.8.2_linux_amd64.tar.gz文件
执行:tar -zxvf go-judge_1.8.2_linux_amd64.tar.gz
解压之后会多出来两个文件,其中go-judge是可执行文件,mount.yaml是配置文件,默认情况下不用动即可。
2.3 启动go-judge
然后终端执行 ./go-judge 即可在控制台部署运行go-judge
默认监听的端口是:默认监听localhost:5050
2.4 开启外网访问
在生产环境下,判题机一般是内网部署,因此只localhost访问即可,但我们为了测试其功能,本地需要也能访问到判题机服务,因此需要开放外网访问。
首先云服务器放行5050端口,相信你肯定知道如何设置。
然后在启动./go-judge时,输入控制参数,详细参数见官网
我们使用 ./go-judge -http-addr=0.0.0.0:5051 再次运行,这样即可开放外网访问,0.0.0.0的意思就是任何IP都可以访问我的服务。
成功会显示以下信息:
2.5 测试调用
部署好之后,我们使用POSTman或者APIFOX工具,进行调用。
接口样例官网有
POST方式请求http://x.x.x.x:5051/run
body内容
{
"cmd": [
{
"args": [
"/usr/bin/g++",
"a.cc",
"-o",
"a"
],
"env": [
"PATH=/usr/bin:/bin"
],
"files": [
{
"content": ""
},
{
"name": "stdout",
"max": 10240
},
{
"name": "stderr",
"max": 10240
}
],
"cpuLimit": 10000000000,
"memoryLimit": 104857600,
"procLimit": 50,
"copyIn": {
"a.cc": {
"content": "#include <iostream>\nusing namespace std;\nint main() {\nint a, b;\ncin >> a >> b;\ncout << a + b << endl;\n}"
}
},
"copyOut": [
"stdout",
"stderr"
],
"copyOutCached": [
"a"
]
}
]
}
显示Accepted则表示成功
2.6 以后台方式运行
直接./go-judge -http-addr=0.0.0.0:5051 运行,等我们关掉了控制台,服务就关闭了,如果想让其一直运行,可以使用nohup命令。
nohup ${JAVA_HOME}/bin/java -Denv=${ENV} -Dport=${PORT} -jar ${JAR_NAME}.jar >> ${APP_HOME}/${GIT_PRO_NAME}/${JAR_NAME}.log 2>&1 &
nohup ./go-judge -http-addr=0.0.0.0:5051 >>go-judge-log.log 2>&1 &
&:让命令在后台执行,终端退出后命令仍旧执行。
2>&1:是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到日志文件中。
成功!
关键字:
【HOJ部署系列】判题机部署-GoJudge部署之服务器部署,go-judge本地部署,服务器部署,online judge系统部署,竞赛训练系统部署,判题机部署,判题机搭建,C语言判题环境,Java判题环境,C++判题环境,如何设置go-judge外网访问,go-judge请求参数样例,go-judge请求返回样例。