ACM队服务器结构详解与维护记

2015-12-23 14:37:09 ServerCUGB

我从2013年暑假开始接手ACM队服务器,到现在已经有两年半多了。当时情况是OJ服务器配置出了点问题,特别卡,经常挂,影响了小学期做题。魏神就把服务器的远程账号密码给了我,让我在OJ挂了的时候去重启服务(最后被学长们修好了,不用手动重启了。好像是因为MySQL的配置出了点问题),奉命于危难之间啊!

从接手到现在,实验室几经变迁,从教三楼307到教五楼415(临时)再到教三楼302,服务器也命途多舛,位置从307到科研楼B101地下机房再回到302,出现过各种各样大大小小的BUG,经历了更新换代。在此期间,服务器一直平稳地运行着,为大家服务。我的功劳还是不小的。

因为明年就要毕业了,服务器要交给学弟学妹们去维护,而且服务器的结构比较复杂,写一篇文章出来可以省去反复口述的时间,还是可以的。

由于不能一下子想到所有要记录的东西,所以一旦有想到的内容就会来更新。

概况

结构

ACM队现有三台服务器,两台普通PC和一台机架式服务器。acm.cugb.edu.cn域名解析到121.194.86.2,通过nginx反向代理的形式连接其他两台服务器上的内容。

不过自从“平安校园”建设工作蔓延到网站安全,学校就关闭了几乎所有二级网站的外网访问权限。只有一些学院网站和行政机构网站还可以,但是服务器必须给学校网络中心统一管理(例如信工院网站,本来是放在科研楼10楼王振华老师负责的机房里,现在学校重做了一个网站扔到网络中心统一管理了)。

因此OJ再也不能被外网访问了。

配置

121.194.86.2

CPU: Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz

MEM: 4G (DDR3 1333MHz)

DISK: 3T

OS: Ubuntu 14.04.3 desktop-amd64

121.194.86.238

CPU: Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz

MEM: 4G (DDR3 1333MHz)

DISK: 500G

OS: Microsoft Windows Server 2008 R2 Standard

121.194.86.237

DELL PowerEdge R630 Rack Mount Chassis

CPU: Intel(R) Xeon(R) CPU E5-2609 v3 @ 1.90GHz (2处理器)

MEM: 16G (DDR4 2133MHz)

DISK: 600G

OS: Microsoft Windows Server 2008 R2 Enterprise

(这服务器3000刀啊!)

服务器分工

121.194.86.2

.2作为域名的解析地址,所有挂到域名下的服务都得从.2做中转。前不久刚给.2重装了系统,不过之前的硬盘还在,防止要用到里面的东西。(因为我也不知道里面都有学长们的什么东西)

另外还有从坏掉的.223服务器上取下来的两块硬盘,我塞到了.2的机箱里。

目前在.2上只装了nginx,没有任何其他的服务。具体反向代理规则是这样的,指定一些内容转到.238:88和.237上,其他默认转到.238上。

由于这台机器的IP和MAC挂在张老师名下,在网络中心有绑定,因此这台机器不需要登录网关即可访问外网,但是IPV6不可以,因此我禁用了IPV6。其他两台服务器都必须登录网关才能访问外网。

所有的三台机器都是掉电后通电启动。

121.194.86.238

这台机器是OJ的主服务器,所有OJ相关的内容都在这上面,包括php页面,数据,判题内核等等。因此直接访问该IP也能访问OJ。在88端口有一个asp服务器,用于放置评优表彰网站(现已废弃,但是php的评优表彰信息上传网站依然使用)和校赛宣传的asp网站。(校赛共有一个php宣传网站+报名系统、一个asp宣传网站。以后可以把两个宣传网站合并了,都用php的,这样就不需要asp了)

该机器安装的软件如下:

  • AppServ(包含Apache, Php, MySQL)端口80
  • NetBox(相当于精简版IIS+asp)端口88

121.194.86.237

.237是机架式服务器,主要用于挂载OJ以外的网页,例如ACM队blog(WordPress)、ACM校赛宣传和报名系统、校评优表彰信息上传系统(这些通过.2的nginx挂在域名上),以及我写的课表查询、自习室查询、网关登录等(这些可通过http://proj.fanzheng.org/访问)。服务器安装的软件如下:

  • XAMPP(包含Apache, Php, MySQL)端口80
  • 创新实验室门禁系统(张老师研究生编写)

该机器的XAMPP想要开机启动,在“启动”文件夹里添加快捷方式和添加注册表启动项都没用,只有在登录账户后才会启动,不知道为什么。最后是用任务计划解决的这个问题。

此外,在该机器上还装了Shadowsocks,并通过任务计划开机启动,连至.2的SS服务端,用于浏览器和一些PHP程序访问外网。

nginx转发规则

通过分工也就可以知道nginx具体的转发规则了。主要有3个转发内容:

.238:88(用于asp网页)

  • .238:88/contest201x/ : 校赛asp宣传页面
  • .238:88/outstanding/ : 校评优表彰网站

.237(用于其他php页面)

  • .237/blog/ : ACM队博客
  • .237/campus201x/ : 校赛php宣传页面+报名系统
  • .237/pingyou201x/ : 校评优表彰信息上传网站

.238(用于OJ的php页面)

其他的都默认转发到.238

OJ判题原理与相关配置

判题内核OJ.exe以服务形式驻留,一旦数据库中有待测记录,就会调用编译器进行判题,给出结果,再写回数据库。

OJ的C/C++现有4个提交选项,分别为GCC,G++,C和C++,Pascal。GCC和G++分别对应MinGW32(GCC 4.4.1)的C和C++编译器,C和C++分别对应VC2008的C和C++编译器。MinGW32(GCC 4.4.1)即为CodeBlocks 10.05自带的MinGW版本。

Pascal为Free Pascal 2.2.4,JAVA为jdk1.6.0_13。

编译选项为:

  • g++ -o file.exe file.cpp(MinGW)
  • gcc -o file.exe file.c(MinGW)
  • cl.exe file.cpp(VC2008)
  • cl.exe file.c(VC2008)
  • fpc.exe -Sg file.pas(fpc)

服务器相关重要路径

121.194.86.2

  • nginx配置文件:/etc/nginx/nginx.conf (使用sudo nginx -s reload应用修改后的配置文件)
  • nginx文件目录:/usr/share/nginx/html

121.194.86.238

  • AppServ文件目录:D:\AppServ\www\newacm
  • OJ判题内核(包括源代码、可执行程序和log):E:\OJE:\OJ\OJ\bin\DebugE:\OJ\OJ\bin\Debug\Log
  • 判题内核使用的编译器:E:\Compiler
  • 评测数据:E:\data
  • NetBox asp服务器:E:\aspserver

121.194.86.237

  • 门禁系统:I:\menjin,可执行程序在I:\menjin\Icco_Secondary development\bin\Debug\Icco_Secondary development.exe
  • XAMPP文件目录:I:\xampp\htdocs

维护相关

  • 重置用户密码:OJ使用了MD5(不加盐)保存密码,因此重置用户密码只需在数据库中将密码修改为相应的MD5值即可。例如修改密码为111111只需改成MD5(111111)也就是96e79218965eb72c92a549dd5a330112即可。

  • 比赛的standing页面加载过慢:由于历史问题,榜的生成效率非常低。目前榜生成方法是每60s生成一次html缓存。但是加载速度仍然过慢,目前能想到的办法是先把数据库中contest_status表备份一遍,再删除大量以前比赛的提交记录。另外如果榜没有自动生成,可以先把60s生成缓存的代码注释掉,让它生成一次榜即可。

  • OJ判题卡住:在服务中重启OJ.exe。

  • 门禁授予权限:打开创新实验室门禁系统,将IP地址改为192.168.0.178,点击“读版本信息”,如有提示则说明可正常使用。点击“读取(清空)记录”,则可以读取到刷卡信息。前两个字段分别是卡序列号和刷卡时间。卡序列号为400100000003且最后两位状态码为80,01表示的是内部按钮开门的记录。后两位状态码为02,01表示的是刷卡进门的记录。后两位状态码为EA,02表示的是未授予权限的刷卡记录。在右侧输入卡序列号、学号、姓名和有效期,点击上传通行卡,即可完成权限授予。

  • Realtime Judge Status页面下报错Warning: Unknown: open(C:/Users/ADMINI~1/AppData/Local/Temp/1******) failed: No such file or directory。具体什么原因目前不太清楚,解法方法是在那个路径下新建一个所要求的文件夹。(注意ADMINI~1是DOS的缩写写法,这里指的是Administrator)

  • 远程端口:.238为22,其他为默认的3389(可以不填)。

  • OJ多文件判题比单文件慢得多,所以出题时最好都用单文件,例如data.indata.out,以免造成不必要的开销。

  • 提交Special Judge题目:需要编写check.exe,从stdin读取数据,进行判断。stdin数据格式为,先是该样例的输入数据,紧接着下一行开始是用户程序的运行结果。check.exe需要根据样例输入和用户的输出,在stdout输出"YES"或"NO",分别代表测试结果为AC或WA。SPJ暂时无法判定用户是否RE。

维护期间增加的功能

在我接手服务器两年多的时间里,我做了大大小小各种各样的修改,主要的有以下几个:

  • 给比赛standing页面增加了颜色,使用的是杭电的配色,当时不会用js写这个功能,因此是求助怡红公子写的。
  • 给OJ题目页面增加了$$\LaTeX$$公式支持,使用的是MathJax。
  • 在userinfo页面增加了最近x天做题情况功能。
  • 重写了校赛报名系统。
  • 修复Pascal判题。
  • 修复Java判题会卡死的BUG。这个是gyshgx868在搞,暂时还没有完全搞定。
  • status页面、比赛Clarify页面等等的各种小BUG。
  • 重写了评优表彰网站信息上传系统。
  • 写了校赛软件下载和注意事项页面。
  • 优化加题页面功能。

此外,我还对于校内的一些其他服务做了贡献,例如:

  • 修复旧pt站(知行pt系统)无法中文用户名登录的问题。
  • 为moodle接入在线评测系统。
  • 学院网站的维护和功能扩充。

旧时的样子

在2014年以前

那时ACM队共有.2、.237和.223三台服务器。.2还是现在的.2,.237是现在的.238,而.223在2014年主板坏了。

如果没记错的话,.223上面应该是IIS+asp+php的配置。

.223上面主要挂载了:

  • JudgeOnline: 旧OJ,使用POJ开源版搭建。(以前POJ首页还有申请获得源代码的提示信息,现在没了)
  • contest201x和campus201x: 后来被我迁移到现在的.238:88和.237上了。

.2上挂载了:

  • blog: ACM队blog(已被我迁移至现在的.237)
  • 猫哥余票查询相关: 在12306余票查询系统还很烂的时候,这个网站还是具有很大影响力的。当时实验室IP打不开12306,我估计是因为这个爬虫导致12306把121.194.86.*网段给封杀了。不过现在解封了,网站也没人用了,.2也重装系统了。

实验室搬迁

2014年暑假由于实验室和学工办公室装修的时间差问题,实验室由教三楼307搬迁到302。装修期间ACM队辗转教五楼415和科研楼1013训练,在此期间OJ服务器(现在的.238)托管在了科研楼B101地下机房,IP为202.204.102.161。

而在实验室搬迁到302之后,购置了一台戴尔机架式服务器,IP被定为.237,等原来的.237从科研楼搬迁回来时,只能使用其他IP,定为.238。

小插曲

我校教务系统只能内网访问,但由于当时我们ACM队的服务器可以被外网访问,因此我们可以做一个反向代理,把教务系统映射带外网去,供同学们放假回家查成绩。

而这一接口被mycugb团队所知,他们做了一个查课表和成绩的服务,但是似乎没有做存储,导致数据量很大。同时,他们将消息出卖给了课程格子(或者是超级课程表,忘了是哪个了,反正都不是啥好鸟),导致网络流量剧增。

后被网络中心发现,要求我们关闭这一接口,同时教务系统登录页面也增加了验证码,这便是那个反人类的验证码的由来。

如果长时间无法加载评论,请对 *.disqus.com 启用代理!