不知不觉已经很久没有更新 Blog 了。 正好最近参加了书院的先导课程建设,昨天花了一下午把课程主页和 Open Judge 系统部署到了学校提供的服务器上。
这是我第一次运营这么大的网站项目,写一篇手记来记录一下这次宝贵的经历。
部署过程中听的音乐:
0x01 系统基本设置
服务器是阿里云的共享标准型 s6 实例,2 vCPU 和 4 GiB 的 RAM 对于一个静态主页和 OJ 系统来说已经挺够用了,操作系统我选择了 Debian 10.4 而不是服务器常用的 CentOS ,原因是我熟悉的 Linux 发行版只有 Debian(笑)。

用 root 用户登录之后,马上新建了一个用户 server 用来跑 nginx 服务器,毕竟把服务直接用 root 用户跑起来是绝对 NG 的!
$ user add server
$ passwd server
$ mkdir /home/server && chmod 777 /home/server #为server用户创建 ~/ 文件夹
Debian 使用 sudo
命令以系统管理者的身份执行指令,但是此时 server 用户还没有被添加到 /etc/sudoers
文件里,因此他不能使用 sudo
,我们需要先把 server 手动添加进去。需要注意的是,/etc/sudoers
文件默认权限是 440 ,并且只有在其权限为 440 时 sudo
命令才会执行。
$ chmod 777 /etc/sudoers
$ nano /etc/sudoers
server ALL=(ALL)ALL #添加用户server
$ chmod 440 /etc/sudoers
$ su -server
在切换到 server 之后,发现 server 用户的默认 Shell 是 sh,需要手动改成 bash,修改 /etc/passwd
文件即可。

为了安全性考虑,接下来所有的操作都将在 server 用户下进行,通过 sudo
来运行需要 root 权限的指令。

#2)键入指令时三思。
#3)权限越大,责任越大。
0x02 安装软件(nginx 、 docker 和 mkdocs)
- Nginx(发音同 engine x)是一款轻量级的 Web 服务器,配置灵活并且系统资源消耗较低,之前我一直都在使用 Apache 服务器,使用 nginx 还是第一次。
- 同时还需要安装开源的应用容器引擎 docker 和部署程序 docker-compose ,主要用来快速部署青岛大学提供的开源 Open Judge 项目。
- 本次课程的课程主页是学长使用静态站点生成器 mkdocs 生成的,也需要部署到服务器端。mkdocs 主要负责把 Markdown 格式的文档转换成 HTML 文档,作为课程主页。
nginx 没什么好说的,直接用 apt-get
就行了。
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install -y vim python-pip curl git
$ sudo apt-get install nginx
$ curl -I 127.0.0.1 #测试 nginx 是否正确安装

docker 使用 sh 脚本一键部署,而 docker-compose 则是使用 pip
部署。
$ sudo curl -sSL https://get.daocloud.io/docker | sh
$ sudo pip install docker-compose

而在部署 mkdocs 时遇到了一系列问题,根据官方文档,只需要:
$ sudo pip install mkdocs
$ sudo pip install mkdocs-material
但是这一过程中却出现了软件包仓库中 mkdocs
版本过低,导致 mkdocs-material
在安装时无法找到依赖的问题。同时在安装 Markdown
库的插件 pymdown-extensions
时甚至出现了 Markdown
库版本不能满足依赖的问题。

尝试手动指定安装版本,依然失败,大概花了 30 分钟思考和尝试之后,我开始怀疑这些库当中的部分库已经停止了 Python 2 版本的更新维护,于是:
$ sudo pip3 install mkdocs
$ sudo pip3 install mkdocs-material
$ sudo pip3 install Markdown
$ sudo pip3 install pymdown-extensions
使用 pip3
就没问题,符合我的猜测,接下来使用 pip
已经安装的几个库卸载掉:
$ sudo pip uninstall mkdocs
$ sudo pip uninstall mkdocs-material
尝试使用 mkdocs ,按照文档给的指令并不能运行,使用 Python 的 -m 参数倒是可以。
$ mkdocs
-bash:mkdocs:command not found
$ python3 -m mkdocs
至此,需要的软件算是安装好了。
0x03 生成静态课程主页——使用 mkdocs
一同参与建设的学长@ichn-hu:https://github.com/ichn-hu ,已经用 Markdown 写好了主页的框架,我只需要用 mkdocs 对他所写好的项目进行 build 即可。

直接将已经准备好的项目 clone 到本地进行 build ,将 build 好的 HTML 放到 nginx 的网页文件夹就好了 :
$ git clone https://github.com/ichn-hu/Prior-Course-Fudan.git && cd Prior-Course-Fudan
$ python3 -m mkdocs build
$ sudo cp -rf docs/* /var/www/html
通过浏览器访问一下:

静态的课程页面部署完成。
不过,现在课程主页只有一个大概框架,后续助教团队会通过 GitHub 提交 pull request 的方式完善内容,服务器会定期同步并且 rebuild 课程主页。
0x04 部署 Open Judge 系统
Open Judge 系统我直接选用了青岛大学几位大牛用 Python 和 Vue 开发的 qduoj 开源项目,他们将代码托管在 GitHub :https://github.com/QingdaoU/OnlineJudge 并且还撰写了严谨完整的文档,我在佩服他们的技术的同时也很感谢他们能将如此出色的代码开源。
这个项目主要使用 docker-compose 来进行 Docker 容器集群的快速编排:
$ git clone -b 2.0 https://github.com/QingdaoU/OnlineJudgeDeploy.git && cd OnlineJudgeDeploy
$ sudo docker-compose up -d
但是马上就出现了异常:

尝试更新 ssl_match_hostname
库:

也就是说ssl_match_hostname
库是已经安装好的,但是在 import 时出现了问题,根据之前 pip 给出的目录找到这个库,把它直接复制到 docker-compose 安装目录下试一试:
$ cd /usr/local/lib/python2.7/dist-packages
$ cp -r backports /usr/local/lib/python2.7/dist-packages/docker/transport
再次运行,发现又有一个 Import Error :

用 pip search
好像找不到这个库,Google 了一下之后发现这是 iPython 的文件,问题解决:
$ sudo apt-get install ipython
之后再次运行sudo docker-compose up -d
,docker 直接从仓库 Pull 所需的镜像:

在部署 docker 容器集群完成后,运行 sudo docker ps -a
查看容器的运行情况:

四个容器全部正常运行,登录 Open Judge 后台做了一系列设置并且发布了两个简单的小题目,Open Judge 系统也算是部署完成了:

0x05 收获
特别感谢周雅倩老师和郑达安老师的支持(她们豪爽地划服务器经费的样子很帅),同时也感谢其他助教的支持,尤其是胡志峰学长。
其实在部署网站时,除了 Linux 基本指令和 docker基本指令之外,其他大多数都是边学边做,例如 mkdocs 的使用就是一边看英文文档一边熟悉使用的,应该对提升我的自学能力有所帮助吧。此外,这次部署的先导课程网站也是我运行过最大的项目,算是一种经验积累。
接下来打算稍稍深入研究一下 Nginx 的端口映射使用,把 docker 容器的端口转发到 URL ,不过因为确实水平精力有限,可能做不到吧(悲)。
对了,特别推荐ヨルシカ乐队的音乐,就算遇到焦头烂额的 Bug 只要听着 suis 的歌声都能平复下来心情:
正为Nginx代理失败而焦头烂额的Wisp
2020年7月17日
Comments | 1 条评论
Test