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

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部分配置如下:

server {
    listen 80;
    listen [::]:80 http2;
    server_name nova.moe;
    ...
    index   index.html;
}

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

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解决了事情:

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上做一个策略规则,如下:

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服务在你所在的地区被墙,请使用代理访问。