我这校区新的微机老师斗志昂扬,准备让我们这学校萎靡的信息技术竞赛重振雄风。然后有一次我半开玩笑地说建一个自己的OJ吧,老师也就鼓励我去做了。
开什么玩笑……!我可是马上要参加NOIP的人!
于是老师说,慢慢来吧。
嗯,正好我也有兴趣,那就慢慢来吧。先策划一下。
然后我就被吓到了。
(注:以下内容纯属纸上谈兵,若坑了请善待><)
零、服务器何在
话说老师办公室里有N台学校淘汰下来的机子,用来做服务器再合适不过了,随便捉一台来装上Linux(学会Linux真是有必要),放在老师办公室24小时挂着,还不用交电费。
至于访问,暂时只准备学校内网用。虽然破掉了学校的总网关,可以映射端口,然而80端口被电信残忍地封掉了。准备以后要外网访问就用VPN连上我那VPS,VPS再反向代理让公网访问……
因为OJ还早,所以上面放了个App Inventor给FTC机器人竞赛的用。啊,物尽其用=。=
一、拿来,还是原创
首先我先搜索了一下现成的OJ。我是觉得Vijos、Codevs什么的相当精美好用,然而……不开源啊。
看上了一个叫hustoj的开源OJ,演示站点感觉还不错,然而——
真实效果丑哭了好吗!尤其是后台!绝对是我打开方式不对……
然后后台添加个题目,提交试试,然后是无尽的等待编译……目测是哪个服务没配置好。懒得检查了,反正我爱折腾,让我自己写个!
二、技术困难,和脑补的应对措施
建一个OJ,感觉技术困难还是挺多的……在这把能想到的列举一下,附带臆测的解决方案。其中部分借鉴了hustoj和网上(主要是知乎)的信息。
0.整个OJ的运行架构
目前我想的是Web+n个分离的评测机。当然Web也可能兼任一个评测机。
Web:PHP + MySQL
评测机:Python + CPP + MySQL
其中Web部分平台应该Windows和Linux都可以,而评测机应该不能跨平台,因为调用的系统API不同。想了想决定评测机放在Linux平台,主要是Linux服务器更主流,开发时网上资料多些(对我这技术渣Google是必备的)。而且安全方面也好操作些。
1.OJ运行流程
目前想象的是这样:
用户提交-->Web界面-->Web服务器在数据库中新建评测-->Web服务器找到应轮到的评测机,下发评测指令和相关数据(用户代码、标准输入输出)-->评测机开始评测,向数据库写入结果-->用户在Web界面获取结果
上面是我乱想的……真的OJ是不是这样也不清楚……因为我只看了hustoj的一点点代码。
2.安全问题
这是个重要问题……要是来一发恶意代码,整个网站挂掉了……甚至服务器完全沦陷。俗话网上说得好,毕竟别人写代码给你运行,就算限时1秒都能干很多事了。
现在对于这个重大问题,我的方案是:
0.首先,必须在fork时限制使用的内存和CPU时间,然后禁止网络访问,权限给它弄到几乎为0。
1.然后,听闻Docker的大名,虽然我到现在一次都没有用过……准备把程序放在Docker里面,只留一个读写评测数据的目录和母机互通。
2.如果Docker启动速度非常快的话……那就每次评测都重启一次Docker虚拟机。
3.如果Docker启动速度没那么快……那就要在母机程序中加一个监测的,状态不对再重启虚拟机。
4.母机程序准备用Python(因为好写),虚拟机内程序用C++(因为快又方便控制资源)。
然而以上纯属臆想……我是否方了还需时间验证……(〃∀〃)
3.其他的小问题
其他还有一些小问题,比如如何监测评测机的在线状态,挂了自动转移……还有Web界面让我这个美工废怎么动刀……
但这都是小问题了,毕竟专业挖坑三百年,只管挖坑不管填(つд⊂)