如何科学地制作一个镜像反代站点
请注意,本文仅供交流学习使用,任何利用此方式违反法律的行为将会收到制裁。云服务厂商知道你在干违法的事。
今天因为某些原因,vjudge.net 的服务器在大陆(尤其是我们学校)无法访问。但是我们要在那个平台上刷题。
正巧手上有台双程 CN2 GIA 的服务器(腾讯云新加坡轻量),计划着做个镜像。服务器在学校的访问速度(四川移动)还行。
0x00. 反代镜像的要点
- 服务器对外对内速率都很好,要不然可能会负优化。
- 被镜像的网站在国内的访问速度必须要慢(雾
- 不要反代违法违规网站,要不然会被叫去喝茶。
- 可以适当通过重写内容来阻止谷歌广告。
- 可以通过 Caddy + Nginx 反代,Nginx 重写规则,Caddy 用来 SSL(因为 Nginx + Acme.sh 我懒得搞)
接下来上教程。
0x01. Caddy 的碰壁
Caddy 是一款非常方便的 Web 服务器,虽然之前测试出来效率比 Nginx 慢至少 50%,但是个人网站 Caddy 的性能已经足够客观。并且 Caddy 配置方便,例如:
imken.moe {
reverse_proxy https://example.com
}
于是,依葫芦画瓢,镜像站上线了。
private.vjmirror.imken.moe {
reverse_proxy https://vjudge.net
}
但是,上线测试无法登录,因为 Cookie 的 Domain 不对。
set-cookie: ...xxxxx=xxxxx; Domain=vjudge.net;
查阅资料,Caddy 无法有效删除 Cookie。所以,只能上 Nginx。
0x02. Nginx 反代+屏蔽部分 Cookie
先放配置文件为敬。
server {
# 监听端口
listen 5663;
# 域名
server_name private.vjmirror.imken.moe;
# ssl 配置,由于要过一层 Caddy,注释掉了
# ssl on;
# ssl_certificate /path/to/ssl/cert.pem;
# ssl_certificate_key /path/to/ssl/private.key;
# 反代配置
location / {
# 不用我说了吧
proxy_pass https://vjudge.net;
# 设置 Referer 标头防止被某些 WAF 察觉
proxy_set_header Referer https://vjudge.net;
# 防止 Content Security Policy 阻止内容加载
sub_filter 'http-equiv="Content-Security-Policy"' '';
# 修改内部链接
sub_filter 'vjudge.net' 'private.vjmirror.imken.moe';
# 允许修改响应内容
sub_filter_last_modified on;
proxy_set_header Accept-Encoding deflate;
sub_filter_types *;
sub_filter_once off;
# 修改响应 Cookie 的 Domain
proxy_cookie_domain vjudge.net private.vjmirror.imken.moe;
}
}
接下来是 Caddy:
private.vjmirror.imken.moe {
# 这里添加 http:// 会导致 Caddy 不会将请求的 Host 添加到反向代理的 Host 里
reverse_proxy localhost:5663
}
0x03. 广告屏蔽
上线之后,网站快了许多,但还是有点慢。经检查,是谷歌广告的加载很慢。
在配置文件里加两行:
# 把规定文本改为空字符串
sub_filter 'adservice.google.com.hk' '';
sub_filter 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9098591903020457' '';
成功。镜像站上线,速度还可以。
总的 Nginx 配置:
server {
# 监听端口
listen 5663;
# 域名
server_name private.vjmirror.imken.moe;
# ssl 配置,由于要过一层 Caddy,注释掉了
# ssl on;
# ssl_certificate /path/to/ssl/cert.pem;
# ssl_certificate_key /path/to/ssl/private.key;
# 反代配置
location / {
proxy_pass https://vjudge.net;
# 设置 Referer 标头防止被某些 WAF 察觉
proxy_set_header Referer https://vjudge.net;
# 防止 Content Security Policy 阻止内容加载
sub_filter 'http-equiv="Content-Security-Policy"' '';
# 修改内部链接
sub_filter 'vjudge.net' 'private.vjmirror.imken.moe';
sub_filter 'adservice.google.com.hk' '';
sub_filter 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9098591903020457' '';
# 允许修改响应内容
sub_filter_last_modified on;
proxy_set_header Accept-Encoding deflate;
sub_filter_types *;
sub_filter_once off;
# 修改响应 Cookie 的 Domain
proxy_cookie_domain vjudge.net private.vjmirror.imken.moe;
}
}
dsy4567
2023年5月21日 @ 11:32
拿 CF Workers 撸了一个,
在 GFW 不发飙的时候又快又稳定(中国移动家宽)。由于 CF Workers 不让改 set-cookie 请求头,需要使用修改 Cookies 的方式登录镜像站。
详见 使用 CloudFlare Workers 免费搭建 Virtual Judge 反代
Imken Luo
2023年5月21日 @ 13:04
其实u1s1拿vercel搓反代会更快吧((dsy4567
2023年5月21日 @ 11:33
我是个穷逼,买不起服务器(