新域名,新服务器及对应面向大陆方向提速方案

Before

很早之前没有信用卡,购买域名和服务器都是通过 Alipay(CNY) -> Bitcoin(BTC) 的方式的方式购买,自然,可以选择的域名和服务器商就不多,比如托管 digitalnova.me 域名的 Namecheap 和 yunyun 服务器所在的 YourServer.se,一直以来对一些大型的服务商(比如 DO,Linode)就只好望洋兴叹,可望而不可及.

有了信用卡之后服务器方面租用了 Scaleway 的荷兰机器,内存 4G,一下子 Docker,Wordpress 都可以跑起来了,虽然官方说的是不限制流量且高速的访问,但毕竟是欧洲的服务器,在大陆地区的访问情况总是有点出乎意料,延迟普遍超过 350ms,如下图:

虽说荷兰的机器有着比较好的流量清洗设备,ASIC 硬件防火墙,但是其超慢的大陆访问速度总会影响到大部分用户.

关于域名,Namecheap 对于一些比较好记的单词域名似乎总是想保持自己占有,最初打算开博客的时候以 nova 为关键字搜索发现全部是 Make Offer 状态,哪怕对应的域名并没有被注册,只好选了个 digitalnova.me 这个域名暂时先用着.

After

最近在 Gandi.net 上面搜索 nova 时就发现了这个域名,果断买下,并打算长期使用.

由于 yunyun 服务器将于 2 月中旬到期,我新租用了一台台湾的服务器 (Void) 作为反向代理加速大陆地区的网站访问速度,经过一小段时间的调整,延迟方面已经可以做到大陆普遍小于 60ms,且网站速度方面目前的 无缓存 反向代理已经可以做到以下水平:


首先需要说明的是,部分人可能有个误区认为反向代理总是能提高网站响应速度或者 QPS,比如你用 Docker 搞了个官方的 Wordpress(内置了 Apache 服务器),这个时候在本机做一个 Nginx 反代其实并不会加速访问 (新的 HTTP 协议除外),这个时候的反代主要是用来配置策略和过滤流量使用的 (说到过滤流量,OpenResty 是不是一个更好的选择?).

而本站使用反向代理的原因是:大陆 -> 荷兰速度很慢,大陆 -> 台湾速度很快,台湾 -> 荷兰速度较快,所以大陆 -> 台湾 -> 荷兰就可以获得 比较好 的一个访问速度.

考虑反向代理的过程其实我还是想了一段时间,由于域名是一样的 (最终肯定都需要同一个域名),且服务器不在一个内网网段,所以并不能像网上许多教程教授的反代 Google(域名不一样),或者 IP + 端口的形式 (太不优雅).

最终稍加研究,得出以下可用 (目前看来还是不很优雅,仅仅是可用) 的反向代理方案,首先我的源服务器依然监听这个域名,Nginx 部分配置如下:

1
2
3
4
5
6
7
server {
listen 80;
listen [::]:80 http2;
server_name nova.moe;
...
index index.html;
}

在台湾服务器上有一个配置文件 proxy.conf 会被 Nginx 加载,文件内容如下:

1
2
3
4
5
6
7
8
9
10
proxy_redirect          off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 2000m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;

台湾服务器上的 Nginx 反向代理设置如下,由于我的服务器都依靠 rDNS,且没有多个上游源,暂且就一个 proxy_pass 解决了事情:

1
2
3
4
5
6
7
8
9
server {
server_name nova.moe;

location / {proxy_pass http://destiny.n0vad3v.me;}

listen 443 ssl;
...
if ($scheme !="https") {return 301 https://$host$request_uri;}
}

为了尽可能少的影响到 SEO,我需要将原来的 URL 的流量给 301 过来,比如 digitalnova.me/about 需要被 301 到 nova.moe/about,这个时候需要在源站的 Server Block 上做一个策略规则,如下:

1
return 301 https://nova.moe$request_uri;

Protential Problems

目前的网络结构设计达到了以下优点:

  • 看上去不那么像一个课程设计
  • 更快的大陆访问速度
  • 更好的反向代理策略保护

不过也有以下可能的问题,例如

  • Speed
    虽然 Void 服务器在大陆访问比较快,但是在其他地方可能还是延迟较大,最终的希望能成为像 Leonax 那样的网络结构,或者至少往那个方向去靠拢吧,他的 AnyCast IP 可以做到全球延迟全部小于 50ms,看着就爽~
    要想让自己的网站能在全球范围内拥有更高的速度,目前我想到两个方案,一个是 Leonax 的 AnyCast IP 的方式,另一个是通过 DNS 负载均衡和分地区解析的方式,后者开销较少,我会优先考虑后者.

  • Half baked SSL
    类似下图,用户到 Void 服务器的流量是加密的,但是 Void 到 Destiny 部分是没有加密的,虽然仅仅是博客,开一个 SSL 目前主要是装饰效果和防止 ISP 劫持(目前我还没去深究过 HTTP/2 的一些特性),不过这个可能是一个安全隐患. 如果要解决这个问题的话我需要在两个服务器上都部署 SSL 证书,太过麻烦,暂时不想去折腾.

  • DNS
    如上述配置,Void 服务器上的反向代理请求的是 Destiny 服务器的 rDNS 名称而非其对应 IP,这样在我迁移 Destiny 服务器到另一个 IP 时就只需要改一次 IP 了 (其它需要指向那台服务器的 DNS 都是 CNAME 记录),但是 Void 服务器所在机房的 DNS 是否不会被劫持,或者出现其他问题,这个还很难说.

  • IPv6
    Void 服务器暂时还没有 IPv6 地址,不过我认为这个问题会比较快地被解决.

  • Pricing & Anti DDoS
    Void 服务器使用的是 Google Cloud Platform,暂时还没有看到具体的防攻击和流量计价方式,不过听说往大陆的流量是 0.23$/GB,不清楚是否真实,有了解的朋友可以底下留言告知我以下. (别像 AWS 一样被 D 了一夜之间信用卡产生个 4000$ 的流量费就好 2333)

  • Cache
    如前文所说,Void 服务器目前是 无缓存 反代,上了缓存之后可以虽然将速度进一步提升,潜在的问题是,如果源站更新了,该如何通知缓存刷新,这个是一个问题,或者仅仅缓存 CSS,JS 等文件?


我的博客使用了Disqus评论框,如果你看不到评论框,那么多半Disqus服务在你所在的地区被墙,请使用代理访问。