加速境外用戶訪問網站的一些嘗試的記錄與思考

最近有人反映,公司的產品有一部分境外用戶(主要在北美洲和歐洲)在上網高峯期有加載緩慢和失敗的狀況,原本中國這種網絡的大環境就是如此,在境外用國內的服務,內心就應該有點B數,可是無奈領導說這部分用戶的收入佔總體的13%,不能無論啊。無奈之下,也只好想辦法解決。php

這篇隨筆包含了各類不專業而且不夠優雅的的解決方式,其實都是向歷史包袱和現實狀態的妥協。在有限的資源下儘可能節省成本,解決問題。html

服務主要分三部分 nginx

A, 動態服務部分 提供主要功能 特色是讀寫均衡,每一個用戶的數據有橫向對比,只有爲了保證數據準確性讀緩沒有寫緩(Apache 2.4 php 7.1 MySQL 5.6  Redis 3.2  不要吐槽這玩意,歷史包袱而已,小公司人少事多,時間久了問題堆積的也比較要命)數據庫

B, 網站上大部分的圖片、視頻、字體等靜態資源,以及A裏面用到的一部分富文本編輯器裏面引用的資源apache

C, 網站內容提供者上傳的多媒體課件包,體積不小。可是都比較獨立 這應該是最簡單的部分。後端

首先要說,這裏沒有采用智能DNS的緣由api

  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         }

 

 

 本文未完成,細節沒有補充

相關文章
相關標籤/搜索