加速境外用户访问网站的一些尝试的记录与思考

2022年12月23日,本文已经过时,请不要参考,流程就跑不通。
以下是正文

最近有人反映,公司的产品有一部分境外用户(主要在北美洲和欧洲)在上网高峰期有加载缓慢和失败的情况,本来中国这种网络的大环境就是如此,在境外用国内的服务,心里就应该有点B数,但是无奈领导说这部分用户的收入占整体的13%,不能不管啊。无奈之下,也只好想办法解决。
这篇随笔包含了各种不专业并且不够优雅的的解决方式,其实都是向历史包袱和现实状态的妥协。在有限的资源下尽量节省成本,解决问题。

服务主要分三部分

A. 动态服务部分 提供主要功能 特点是读写均衡,每个用户的数据有横向对比,只有为了保证数据准确性读缓没有写缓(lnmp.org工具包环境)
B. 网站上大部分的图片、视频、字体等静态资源,以及A里面用到的一部分富文本编辑器里面引用的资源
C. 网站内容提供者上传的多媒体课件包,体积不小。但是都比较独立 这应该是最简单的部分。

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

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

#rsync 同步文件
/usr/bin/rsync -vzrtopg --progress --delete -e ssh root@源服务器:/data/iSpring_htdocs/ /data/iSpring_htdocs/

然后是B部分,正确的做法是CDN(成本不足放弃了)业务逻辑很复杂,很多资源特别混乱,外加有混合在富文本编辑器生产的内容里面引用的资源,所以也不能轻易替换域名,后来发现云平台有个服务可以加速境外访问,但是大概算了一下成本,乖乖一个月要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 库;地址可能失效了,官方git地址 https://github.com/maxmind/libmaxminddb/releases
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

debian的安装可以用apt 资料来源
apt install libmaxminddb* mmdb-bin

#下载 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;
}

因为服务器采用国外的letsencrypt的ssl证书,每次续期的时候是通过访问web目录文件实现的(如果可以的话 可以使用dnsapi的方式,就不需要下面的配置了)所以要把这个访问加到例外情况里面
配置方法如下

set $flag 0;
if ($http_user_agent ~* (letsencrypt)){
    set $flag "${flag}1";
}
if ($geoip_country_code != CN) {
    set $flag "${flag}2";
}
if ($flag = "02") {
    rewrite ^(.*) http://国外镜像服务器域名/$1 permanent;
}
posted @ 2018-10-13 12:59  鱼肉真好吃  阅读(1451)  评论(0编辑  收藏  举报