最近有人反映,公司的產品有一部分境外用戶(主要在北美洲和歐洲)在上網高峯期有加載緩慢和失敗的狀況,原本中國這種網絡的大環境就是如此,在境外用國內的服務,內心就應該有點B數,可是無奈領導說這部分用戶的收入佔總體的13%,不能無論啊。無奈之下,也只好想辦法解決。php
這篇隨筆包含了各類不專業而且不夠優雅的的解決方式,其實都是向歷史包袱和現實狀態的妥協。在有限的資源下儘可能節省成本,解決問題。html
服務主要分三部分 nginx
A, 動態服務部分 提供主要功能 特色是讀寫均衡,每一個用戶的數據有橫向對比,只有爲了保證數據準確性讀緩沒有寫緩(Apache 2.4 php 7.1 MySQL 5.6 Redis 3.2 不要吐槽這玩意,歷史包袱而已,小公司人少事多,時間久了問題堆積的也比較要命)數據庫
B, 網站上大部分的圖片、視頻、字體等靜態資源,以及A裏面用到的一部分富文本編輯器裏面引用的資源apache
C, 網站內容提供者上傳的多媒體課件包,體積不小。可是都比較獨立 這應該是最簡單的部分。後端
首先要說,這裏沒有采用智能DNS的緣由api
而後來分塊解決問題服務器
先說C ,這部分很好辦,開一臺北美的雲主機,假設Rsync和HTTP服務,而後同步課件過去,域名配置成C1 和原來的C作鏡像,而後在A上面判斷訪客IP的來源,動態切換域名便可網絡
這裏要記錄的關鍵點前後端分離
具體作法能夠自行搜索
/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)
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 }
本文未完成,細節沒有補充