SNIProxy 实现服务器反向代理多个带加密网站

2019 更新: 目前已经改用 HAProxy。 之前通过 FRP 来实现了单个网站不泄露证书的 HTTPS 反向代理,但是缺点是一台服务器只能代理一个网站,即一个前端只能对应一个后端。这多少有些不够方便,也不方便与他人合租一台服务器。

SNIProxy 则是一个不错的解决方案。它通过浏览器访问时提供的 SNI 头来判断访问域名,然后可以根据域名来选择转发请求到何处。由于这个过程不涉及加密和解密,因此除了匹配正则表达式几乎没有性能损失,同时也不需要在前端服务器上部署 HTTPS 证书,也无需担心数据泄露的问题。 本教程适用的 Linux 发行版为 CentOS 7.4。 继续阅读 »

FRP 作为 TCP 反向代理的部署

最近发现经常出现 502 Bad Gateway,这让我很不爽,山河 OJ 刚刚火了不久,怎么就闹出这种事情来。 后来发现是 ZeroTier One 的锅,于是在 Menci 的建议下,采用 FRP 转发流量到家里的服务器。现在稍作记录,以备今后我自己查看和他人配置需要。

双边配置

首先执行 wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_amd64.tar.gz,下载 frp。并解压。这里我们假定你的 frp 程序在 /opt/frp/ 路径。 继续阅读 »

SYZOJ2 在 CentOS 上的搭建

SYZOJ2 官方只提供了 Ubuntu 的教程,在 CentOS 上,有些东西会不一样。 本文需要对照官方安装指南查看,详情请阅读 syzoj/syzoj on GitHubDemo 服务器账号及搭建指南 – 帖子 – Demo。 这里还有一篇很详细的 SYZOJ 部署指南,是 Masellum 写的。值得参考。

SYZOJ-Web

Web 的搭建相对比较简单。大部分都可以按照 SYZOJ2 官方的教程来做。 这里只说明不一样的地方。 对于在 Ubuntu 下的这段命令: 继续阅读 »

lemon 在 macOS 上的移植

lemon 是一个轻量的 OI 评测系统。它基于 Qt 编写,因此应当具有强大的跨平台特性。 但是 2012 年开始,lemon 就不再更新了。而且之前官方也没有管 macOS 的问题,直接 qmake 也是不可能通过。 所以,我去做了一个移植的工作。 这里就直接贴项目地址了(其实就是骗 Star): lemon-mac 在 GitHub 上的内容

如果你实在懒得折腾,也可以下载我构建好的版本,既可以去 GitHub Release 下,也可以点击这里下载。 lemon 界面 放张图就跑~ 另外,最近中国移动网络似乎会将 GitHub 解析到 127.0.0.1。访问不了 GitHub 的朋友们就去 Coding.net 吧。

图的存储与遍历

图的存储与一般有三种形式,邻接矩阵、邻接表、链式前向星(邻接表的一种)。 本文全文使用这个图来进行演示。 图示 我们规定,一共有 $n$ 个点,$m$ 条边。输入数据的格式为 “起点”、“终点”、“边权”。则这个图的输入数据为:

1 2 2
1 4 3
2 3 1
2 5 3
3 1 2
5 3 2
5 4 4

邻接矩阵

由于邻接矩阵空间消耗巨大,一般不使用。 邻接矩阵初始化时,我们使用无穷。 继续阅读 »

欧几里得算法、欧拉筛模板

扩展欧几里得

int gcd(int const a, int const b) {
    return !b ? a : gcd(b, a
}

int lcm(int const a, int const b) {
    return a / gcd(a, b) * b;
}

int exgcd(int const a, int const b, int &x, int &y) {
    int ans = a;
    if (b == 0) {
        x = 1, y = 0;
        return ans;
    }
    else {
        ans = exgcd(b, a
        y -= x * (a / b);
        return ans;
    }
}

欧拉筛

bool is_prime[MAXN];
int primes[MAXN], query[MAXM];
int n, m, p;

void sieve(int const n) {
    memset(primes, 0, sizeof(primes));
    memset(is_prime, 1, sizeof(is_prime));
    is_prime[1] = false;
    for (int i = 2; i <= n; i++) {
        if (is_prime[i]) {
            primes[p++] = i;
        }
        for (int j = 0; j < p && i * primes[j] <= n; j++) {
            is_prime[ i * primes[j] ] = false;
            if (! (i
                break;
        }
    }
}