网站架构

Version1.0:单站点

对于个人博客的想法应该从1年前说起,刚好有些零碎的时间想来写一写博客。

当时有考虑在CSDN,CNBLOG等等写一写,可惜不在国内访问速度有一定的问题的。

所以考虑了自己搭建一个server用WordPress来做一个个人站点,当然自由度和灵活性是大大优于博客站的。

当时的想法很简单,有一台server能撑起WordPress就可以了,说干就干。本网站起始于一台淘汰的笔记本,使用VMware workstation 创建的虚拟机4C4G的CentOS系统,使用的IP地址是标准的NBN动态IP。

直接安装LNMP自己维护是一种选择,可能起初没什么问题,但是一旦出现关于php或者mysql等等的问题就需要自己花很多时间去解决。包括软件的持续更新的问题,软件替换的问题等等都对系统运行存在着很大的挑战。

从另一个角度出发,一台4C4G的虚拟机在家用带宽的网络上运行,没有硬防火墙没有软防火墙没有WAF是非常不安全的,很容易被攻击。当然可以做安全防护但是不能面面俱到。

我的想法是把有限的时间投入到写博客上面也不多的去关注系统上的问题。

所以我选择了一个web图形化面板:cPanel

1.1 cPanel是什么呢?

可能cPanel你没有听说过,但是宝塔。。总是听说过吧,这个就是外国的宝塔可以这么理解。

Cpanel=Control Panel=控制面板

简单的说就是,类似于Windows中的控制面板,可以找到用于管理Windows中的各种功能和配置,

而Cpanel就是你用来管理你的网站的“控制面板”,其提供了一个集成的界面,里面有你想要管理你的网站所需的,几乎所有的功能。

网站架构

cPanel包括了一系列套件增强了系统的健壮性:

  • 自动的SSL证书部署,由cPanel自动申请和部署,并且是免费的。只需要站点是由cPanel创建的,DNS验证通过之后就会自动激活
  • PHP多版本支持,可以支持从php5.6-7.2的所有版本并不停机切换
  • 黑白名单,基于端口和IP地址的访问策略
  • multi-factor authentication 类似于google authentication
  • 系统安全漏洞扫描等等
  • ModSecuriy WAF防火墙
  • 插件:CSF+LFD防火墙,基于策略和用户行为自动封锁可疑用户
  • 插件:Engintron,cPanel默认的web服务器是Apache。。。有老外在论坛了提new feature request,但是一直也没有提供nginx。这一款是适配cPanel的nginx做了很多优化—缓存,安全,Cloudflare适配,x-head-forward等等

网站架构

1.2 Cloudflare是什么呢?

cloudflare 是一家国外的 CDN 加速服务商,还是很有名气的。提供免费和付费的加速和网站保护服务。以前推荐过的百度云加速的国外节点就是和 cloudflare 合作使用的 cloudflare 的节点。

cloudflare 提供了不同类型的套餐,即使是免费用户,cloudflare 提供的功能也是很全面的。

  • 前面也提到了网络使用了家用NBN,就算我们有了WAF,软防火墙。。。但是有一个问题他不防DDOS啊。所以我使用cloudflare作为我的DDOS防火墙和CDN代理,不得不说cloudflare的CDN在国外的速度还是#1的。
  • Cloudflare在国外的普及率非常高,基本上中小企业都可以看到Cloudflare的身影。包括各种国外的免费视频站,小说站,技术博客,包括学校的部分教学系统,绝大部分海外华人论坛等等。

网站架构

Version 2.0:双CDN加持

网站架构

2.1 为什么要选用双CDN呢?

问题就发生在Cloudflare对于中国用户的支持上面,可以这么理解。Cloudflare CDN缓存命中率速度等等在全世界范围之内都是屈指可数的。。。。但是!但是!除了中国!

但是作为一个中文站,中国用户才是最重要的,所以我考虑了使用阿里云的全站CDN(DCDN)反向代理我的网站。

  • 首先要考虑一个问题就是用户跳转和来源判断的问题:
    • 用户跳转:之前考虑过分域名,比如:
      • en.llycloud.com—国外—Cloudflare
      • cn.llycloud.com—国内—阿里云DCDN
      • 这存在一个问题就是用户需要手动选择和跳转,对用户非常不友好。而且用户信息和访问信息也不同步。
      • 所以需要做的就是国外用户直接访问cloudflare资源,国内用户直接访问阿里云DCDN的资源
    • 来源判断:
      • 使用阿里云DNS的自定义线路
      • 国内线路—阿里云DCDN
      • 国外线路—Cloudflare
      • 在用户没有感知的情况下根据GeoIP进行流量分离

2.2 还存在的问题:

  • 阿里云DCDN没用想象中Cloudflare的缓存能力,基本上所有访问都需要回源,因为Aliyun DCDN无法缓存动态资源。Cloudflare通过设置基本上可以缓存所有资源,包括整个前段页面。
  • 最简单的一个例子使用17ce进行curl网站测试,cloudflare只要命中缓存。在源站的nginx access log根本没有任何访问,很大的减轻了源站的压力。
  • 而Aliyun的阿里云DCDN所有请求都需要回源,然后从源站respond 给用户http 头!!!是的差距还是很大的。

2.3 动态页面速度测试比较:

http://en.llycloud.com/search/test-talk

测试页面是一个动态搜索页面,双方都需要回源:

新加坡—国外节点–cloudflare:

网站架构

北京-国内节点-aliyun DCDN

网站架构

测试完整文件如下:

Beijing_test_result

Singapore_test_result

所以下一代系统架构也就出现了:

网站架构

Version 3:跨国双节点同步!

对,没错不是跨机房!是跨国!

其实mysql双主同步,rsync同步文件等等都是基础的配置。可以说google一搜一大把:

网站架构

在进行实际架构之前考虑了一些问题:

3.1 安全问题

首先一个问题就是mysql同步需要两台服务器能够互相访问mysql端口。但是端口开在公网上是一个非常危险的做法,就算有强密码保护依然存在很多问题。(虽然我见过一个地区门户论坛10多台服务器公网开着3306。。。)

  • 在网上看了一些案例和实践,大部分是大型的生产业务。解决方案是走vpn,设置是走专线。
  • 这些方案很好也很实际,但是对于我的网站规模来说有点“不太实际”
  • 使用SSH建立隧道变成了我最佳的选择。

3.2 网络问题

  • 延迟问题:从阿里云ECS ping 国外站点大概有300毫秒左右的延迟,有关于mysql复制的文章上有写高延迟会导致同步失败。

  • 带宽问题:从国外源站推送文件更新速度是否会太慢,导致文件更新出现问题。

  • 当然这两个问题在系统搭建完成之后也有了解释,延迟和带宽暂时还是没有问题的。

  • 一个很神奇的问题:可能和Grant Firewall有关。。。

    • 从阿里云ECS wget 国外站点的文件到本地,带宽在100-200KB/s之间
    • 从国外站点推送文件到阿里云ECS,带宽在1.5M-2M/s之间
    • 阿里云带宽15M,国外站点上传带宽跑满在35-40M之间

结语:

随着三次网站架构的改变,这就是你现在看到的LLYCLOUD ITSC了!后续会更新文章来描述mysql双主同步,rsync + inotify实时同步的文章!敬请期待。