文章目录
SYZOJ 安装记录
前言
时间: 2020.2.17
系统:Ubuntu 18.04.2 LTS
服务器:阿里云轻量应用服务器
登录用户:root
本记录仅供参考,最权威安装指南请认准官方wiki
安装宝塔面板 (可选)
因为网上说宝塔面板管理器来比较方便,而且配置 LNMP 很方便,所以我个人选择安装。
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh
sudo bash install.sh
中途会提示是否重启,先选择 No
,以后再说。
其他的选择 Yes
就可以。
安装完成会显示
=================================================================
Congratulations! Installed successfully!
==================================================================
Bt-Panel: http://服务器ip:8888/安全入口
username: 初始用户名
password: 初始密码
Warning:
If you cannot access the panel,
release the following port (8888|888|80|443|20|21) in the security group
==================================================================
记录下来你的初始用户名、密码,由安全入口登录。如果无法登录,按照上面的提示开放相关端口。
进入面板,自动弹出窗口,我选择安装 LNMP
环境,你可以自行选择相关软件版本。
安装过程对于 1核 2GB
的服务器来说还是有点慢的。
安装完成后建议在宝塔管理页面里的软件商店检查 mysql
是否正常运行,这里可能因为权限原因导致 mysql
无法启动,我们需要执行:
chmod 644 /etc/my.cnf
chmod 644 /www/server/mysql/my.cnf
然后重启 mysqld
服务:
service mysqld restart
安装系统依赖
首先执行
apt update
惊奇地发现阿里云家的服务器已经自己换上了阿里云的软件源,速度很快。
有些软件包在阿里云的镜像中已经自带了,因此我没有在这里写,它们包括但不限于: git
, curl
, nginx
(如果没有安装宝塔面板的话)。
上述软件包使用 apt install <软件包名>
即可安装。
Node.js 和 npm 的安装
经过测试可用的 Node.js 版本为 8 和 10,更低的版本不受支持,更高的版本可能有未知的兼容性问题。
命令行输入
apt install nodejs
apt install npm
等待安装完成之后检查版本:
node -v
这里我安装之后显示版本为 v8.10.0
,不用更新。
如需更新请参考博文:Ubuntu16.04安装最新版nodejs(2018)
注意在上面的博文中,安装 nodejs
那句命令应该为:
n v10.19.0
以安装版本 10。
Yarn 的安装 (可选,可由 npm 代替)
请参考官方文档进行安装。
检测是否安装完成:
yarn --version
目前最新版本为 1.21.1
安装 MariaDB 10.3 与 Redis 5
注:如果安装了宝塔面板,并且配置过 mysql
, 需要先卸载mysql
,再安装时选择mysql-mariadb-10.3
,而 Redis 5
可以轻松地在软件商店里安装。
首先为了使用 add-apt-repository
命令,需要安装 software-properties-common
:
apt install software-properties-common
依次执行命令:
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.3/ubuntu bionic main'
add-apt-repository ppa:chris-lea/redis-server
apt update
apt install -y mariadb-server redis-server
注意在第二行命令中 bionic
为 Ubuntu 18.04 LTS
的代号,使用 Ubuntu 16.04 LTS
的读者可改成 xenial
。(博主未进行实验,不确定是否可行)
而第三行命令需要按 Enter
确定。
安装 MariaDB 10.3
的时候会让你设置用户密码,可以自行设置。
安装命令行工具
另外需要安装命令行工具 7z、pygmentize 和 clang-format。
安装 7z
(解压缩)和 clang-format
(代码格式化)
apt install p7zip-full clang-format python-pygments
详情请参考这篇博客:Ubuntu 安装 clang-format、7z、pygmentize
网站端部署
注:
其中如果需要你填写密码/密钥之类的,为了安全起见,可以使用命令:
echo $(dd if=/dev/urandom | base64 -w0 | dd bs=1 count=20 2>/dev/null)
生成一个 20 个字符的随机密钥,并记录下来。
下载 syzoj
我们将把 syzoj
安装在 /opt/syzoj
中。
依次执行:
mkdir -p /opt/syzoj
cd /opt/syzoj
git clone https://github.com/syzoj/syzoj
mv syzoj web
cd web
其中使用 git
那一行国内服务器下载较慢,请耐心等候。(阿里云华北服务器下载速度 30 KiB/s
,真是醉了…,我家电脑都有 680 KiB/s
)
如果觉得慢,可以自行下载,并上传至 /opt/syzoj
目录。
使用 npm
安装:
npm install
使用 yarn
安装:
yarn
注:
如果国内服务器在安装时,yarn
卡在了 Fetching packages
部分,因为无法下载某一个软件包。可以尝试:(参考博客包管理工具安装速度慢或许是 lock 文件的坑 )
rm yarn.lock
但是不保证可行。
配置 syzoj
这一部分官方文档中介绍地很详细:
从配置文件模板创建用于 SYZOJ 网站端的配置文件。
mkdir -p /opt/syzoj/config
cp /opt/syzoj/web/config-example.json /opt/syzoj/config/web.json
ln -s ../config/web.json /opt/syzoj/web/config.json
编辑 /opt/syzoj/web/config.json
,如下是您可能需要修改的一些配置项。其中名称加粗的配置项是您很有可能需要修改的。
- title:网站的标题。显示在网站每个页面的左上角与标题栏中。
- hostname:网站端监听的
IP
地址。如果您按照本教程配置Nginx
反向代理,请保留默认值127.0.0.1
,否则,如果您希望SYZOJ
网站能够从本机之外访问,请改为::
。 - port:网站端监听的
TCP
端口。 - db:数据库的连接方式。
- session_secret:为安全起见,请使用随机密钥填写。
- judge_token:为安全起见,请使用随机密钥填写。
- google_analytics:如果您使用
Google Analytics
统计您的SYZOJ
网站访问数据,请设置为Google
提供的形如UA-XXXXXXXX-X
的字符串。保留默认值将禁用Google Analytics
。
创建独立的目录用于存放数据和临时文件,这将便于您对网站的维护:
mv /opt/syzoj/web/uploads /opt/syzoj/data
ln -s ../data /opt/syzoj/web/uploads
mkdir /opt/syzoj/sessions
ln -s ../sessions /opt/syzoj/web/sessions
创建 syzoj 用户
为安全起见,我们不推荐在生产环境中使用 root 账户运行 SYZOJ 网站端。建议为 SYZOJ 单独创建一个用户运行,该用户必须能够写入 sessions 和 data(uploads)文件夹
输入命令
adduser --disabled-password --gecos "" syzoj
chown -R syzoj:syzoj /opt/syzoj/data /opt/syzoj/sessions /opt/syzoj/config/web.json
(这段原来官方wiki中有,不知为何被删减了)
创建数据库
输入命令
mysql
进入 mysql
数据库。
依次执行
CREATE DATABASE `syzoj` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON `syzoj`.* TO "syzoj"@"localhost" IDENTIFIED BY "<password>";
FLUSH PRIVILEGES;
注意 <password>
需要换成你刚才填写的数据库密码。
使用 systemd
创建 /etc/systemd/system/syzoj-web.service
文件:
touch /etc/systemd/system/syzoj-web.service
填入如下内容
[Unit]
Description=SYZOJ web service
After=network.target mysql.service rc-local.service
Requires=mysql.service rc-local.service
[Service]
Type=simple
WorkingDirectory=/opt/syzoj/web
User=syzoj
Group=syzoj
ExecStart=/usr/bin/env NODE_ENV=production /usr/bin/node /opt/syzoj/web/app.js -c /opt/syzoj/config/web.json
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
执行命令:
systemctl start syzoj-web
systemctl enable syzoj-web
使用 Nginx
如果安装了宝塔面板,执行以下步骤:
创建一个网站,网站名为你需要的域名,不需要数据库和 ftp
。
接下来配置 Nginx
nginx.conf
文件的位置:
- nginx.conf文件路径:/www/server/nginx/conf/nginx.conf
- 多域名Nginx配置文件:/www/server/panel/vhost/nginx/你的域名.conf
修改成如下内容:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name syzoj.example.com;
location / {
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://127.0.0.1:5283;
}
}
或者在宝塔面板里为你的站点添加反向代理,指向 http://127.0.0.1:<你的端口,默认为5283>
。
现在可以输入你的域名进入 syzoj
了。
如果出现问题,请使用
cd /opt/syzoj/web && node app.js
观察错误信息。
测评端部署
准备沙箱
这一部分官方文档中介绍地很详细:
SYZOJ
的评测全部在沙箱中进行。其沙箱实现基于 Linux
内核中一些不默认开启的特性,您需要在引导器中添加一些参数来开启这些特性,以 Ubuntu
的默认引导器 GRUB 2
为例,编辑 /etc/default/grub
。
在其中
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
之后加入 cgroup_enable=memory swapaccount=1
,变为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash cgroup_enable=memory swapaccount=1"
运行以下命令更新 GRUB 2
的配置,然后重新启动。
update-grub && reboot
PS:如果你是用宝塔面板,建议在面板里设置重启
然后下载沙箱:
wget -O /sandbox-rootfs.tar.xz https://github.com/syzoj/sandbox-rootfs/releases/download/181202/sandbox-rootfs-181202.tar.gz
如果是国内服务器建议自己本地下好后再上传。
解压沙箱文件:
mkdir -p /opt/syzoj/sandbox/rootfs
cd /opt/syzoj/sandbox/
tar xvf /sandbox-rootfs.tar.xz
建立需要的文件夹:
mkdir -p /opt/syzoj/sandbox/{bin,tmp1}
安装系统依赖
执行
apt install build-essential libboost-all-dev
apt install rabbitmq-server redis-server
下载、配置、使用 systemd
这一部分请阅读官方wiki, 教程很详细。
至此,进入你的域名,你可以进入你自己搭建的 syzoj
,并且注册了。