zoukankan      html  css  js  c++  java
  • 加速境外用户访问网站的一些尝试的记录与思考

    最近有人反映,公司的产品有一部分境外用户(主要在北美洲和欧洲)在上网高峰期有加载缓慢和失败的情况,本来中国这种网络的大环境就是如此,在境外用国内的服务,心里就应该有点B数,但是无奈领导说这部分用户的收入占整体的13%,不能不管啊。无奈之下,也只好想办法解决。

    这篇随笔包含了各种不专业并且不够优雅的的解决方式,其实都是向历史包袱和现实状态的妥协。在有限的资源下尽量节省成本,解决问题。

    服务主要分三部分 

    A, 动态服务部分 提供主要功能 特点是读写均衡,每个用户的数据有横向对比,只有为了保证数据准确性读缓没有写缓(Apache 2.4 php 7.1 MySQL 5.6  Redis 3.2  不要吐槽这玩意,历史包袱而已,小公司人少事多,时间久了问题堆积的也比较要命)

    B, 网站上大部分的图片、视频、字体等静态资源,以及A里面用到的一部分富文本编辑器里面引用的资源

    C, 网站内容提供者上传的多媒体课件包,体积不小。但是都比较独立 这应该是最简单的部分。

    首先要说,这里没有采用智能DNS的原因

    1. 部署多台服务器会造成管理成本,而且历史悠久的项目细节太多,很多没有文档,贸然部署新服务器,有可能造成某些地区的用户遇到BUG,或者服务中断的情况,不到万不得已,我是尽量不想让用户感受到服务有中断的。
    2. SSL证书配置麻烦,因为要同一套证书,而且用的是Let's Encrypt,这样就要在一台Let's Encrypt服务器所在地区的服务上做认证,然后同步到其他服务,想想就脑袋大
    3. DNS解析用的阿里云,免费解析不支持细分区域,你问我为啥不用收费的?没钱啊,节省成本。

    然后来分块解决问题

    先说C ,这部分很好办,开一台北美的云主机,假设Rsync和HTTP服务,然后同步课件过去,域名配置成C1 和原来的C做镜像,然后在A上面判断访客IP的来源,动态切换域名即可

    这里要记录的关键点

    • PHP 使用geoip判断IP的来源(只在访问课件的部分判断)
    • rsync的搭建 (这个东西很好安装 直接yum就行了,但是很难配置,搞了很久,主要遇到两个问题,一个是网络不通,后来发现是云平台自带一个端口过滤的规则,打开就好了。另一个问题是权限问题,怎么配置都搞不定最后放弃了,走了SSH通信的方式,导致第一个问题也不存在了)

    具体做法可以自行搜索

    /usr/bin/rsync -vzrtopg --progress --delete -e ssh root@源服务器:/data/iSpring_htdocs/ /data/iSpring_htdocs/

    然后是B区域,这里正确的做法是CDN(成本不足放弃了)或者智能解析(同C的理由也放弃了)业务逻辑很复杂,很多资源特别混乱,外加有混合在富文本编辑器生产的内容里面引用的资源,所以也不能轻易替换域名,后来发现云平台有个服务可以加速境外访问,但是大概算了一下成本,乖乖一个月要14万大洋,这肯定也不行。好吧,正常可以用的方案都不能用了,下面就从其他方面考虑。

    首先明确一点,响应速度和加载速度是两码事,我们这里要解决的主要是加载失败,而不是响应速度,也就是说,可以加载慢一点点(当然也不能太慢)毕竟只是上网高峰期慢,但是尽量不要让用户不能使用。于是我想到了基于用户IP来源的地区在nginx上面做域名跳转到镜像站。这样A区域的所有域名都不需要更改,自动会302跳转到B的镜像服务器域名B1上了。

    这里要记录的关键点

    rsync同步文件(同C)

    ngx_http_geoip_module 模块 

    nginx重新编译(lnmp.org 支持配置文件自定义编译参数,添加好模块判断来源 写跳转规则)https://www.cnblogs.com/lixigang/articles/5130052.html

    #安装 MaxMind 的 GeoIP 库
    wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
    tar -zxvf GeoIP.tar.gz
    cd GeoIP-1.4.8
    ./configure
    make
    make install
    echo '/usr/local/lib' > /etc/ld.so.conf.d/geoip.conf
    ldconfig

    #下载 IP 数据库 wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz gunzip GeoIP.dat.gz mv GeoIP.dat /usr/local/nginx/GeoIP.dat chmod 544 /usr/local/nginx/GeoIP.dat #lnmp.conf里面 Nginx_Modules_Options=' --with-http_geoip_module' 保存 运行upgrade.sh 升级nginx 然后nginx -V 查看模块 编辑nginx.conf http段增加 geoip_country /usr/local/nginx/GeoIP.dat; fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code; server段 vhost判断 if ($geoip_country_code = CN) { rewrite ^(.*) https://baidu.com; } if ($geoip_country_code != CN) { rewrite ^(.*) https://163.com; }

    最后是A,也是最难弄的部分,代码没做前后端分离,很多事情特别难搞,外加第三方服务的接入乱七八糟的,需要整理代码,尽量把不相关的静态资源放到B上面去,A模块就只保留PHP业务逻辑和HTML动态输出,开启gzip,(apache暂时不能换成nginx,问题太多了不好一一解决),开发层面上优化和分离代码,数据库层面上,建立海外镜像节点,做同步,同步的通信端口通过多个代理根据ping值来动态切换。但都是权宜之计,最终还是要做智能DNS解析,然后部署海外镜像,不过代码没整理好之前,暂时不动,观察一下用户访问的体验反馈。

    2018.11.29更新

    发现letsencrypt续期和IP来源判断冲突 这里需要单独判断一下 所以配置文件修改

     1         set $flag 0;
     2         if ($http_user_agent ~* (letsencrypt)){
     3             set $flag "${flag}1";
     4         }
     5         if ($geoip_country_code != CN) {
     6             set $flag "${flag}2";
     7         }
     8         if ($flag = "02") {
     9             rewrite ^(.*) http://国外镜像服务器域名/$1 permanent;
    10         }

     本文未完成,细节没有补充

  • 相关阅读:
    geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)
    我的2016,感恩、乐观、努力
    我的奋斗——从印刷工人到地理信息大数据系统程序员
    geotrellis使用(二十七)栅格数据色彩渲染
    用户画像
    栈和队列在python中的实现
    跳一跳第一天总结
    在pycharm中使用scrapy爬虫
    用户使用手册
    项目测试报告和用户使用手册
  • 原文地址:https://www.cnblogs.com/toumingbai/p/9782582.html
Copyright © 2011-2022 走看看