前言
随着跨境贸易的发展以及一带一路倡议的铺开,越来越多的中国企业需要走出去,去开拓海外用户。由于线下的生产厂家在国内,所以海外用户能看到的门面也就一个企业官网网站了,但是很多官网的服务器可能是位于国内的,在海外打开就会像我们打开一个海外网站一样,速度慢到绝望啊!
借着虽然不是一带一路成员国但却毗邻大量一带一路沿线国家的印度-孟买地域开通之际,我们就来试试如何实现企业官网的海外加速吧。
介绍
这里介绍的海外加速就是开通一个临近海外消费者的服务器,然后选择同步数据或者进行镜像缓存,同步数据和附件的话其实费用还是蛮高昂的,一般来说选择镜像缓存也就是反向代理就可以。
如果针对的是海外的华人消费者,那么中文网站直接反代就行,如果是歪果仁的花,可以考虑在新加坡地域建立一个英文版源站(毕竟英文再全球还是蛮通行的),然后在南美洲、欧洲、中东等地域建立服务器进行反代就行。
要求 & 收获
需要使用到的产品: 阿里云ECS 海外地域
通过本文你将讲学到: Nginx、OpenResty 的反向代理、全静态缓存、缓存清理、内容替换、CC防御解决方案
教程
如果按标准的来建一个海外站点,那就得搭建一个一模一样的环境,然后实时同步数据库和附件,不过这样做成本太高了。一般的话,我们可以考虑使用反向代理,将网站的内容做一个镜像到海外服务器。这个做法也应用于很多的地方门户,比如可以将客户提供的一个广告专题通过反代到网站目录中,看起来就像是网站自己做的专题,搜索引擎也会优先收录这个专题页面。
为了保障这个反代教程的可用性,我们还需要额外的几个模块,如果参考上述教程已经安装过 OpenResty 的朋友,可以编译升级 OpenResty 来增加模块。参考:【云计算的1024种玩法】手把手教你如何编译升级 OpenResty
没有安装 Nginx 可以参考:《【云计算的1024种玩法】手把手教你如何编译一个高性能 OpenResty》 直接按下面的增加模块进去就行:
地域选择
关于地域的选择,阿里云的16个节点最适合服务哪些地域还可以参考我的专题:阿里云全球十六个节点评测分析
参与聚能聊: 由新开的第16个数据中心,来评价阿里云的全球化部署,一起讨论阿里云的全球战略赢得丰厚奖品!
添加模块
需要添加的是:(如果不参考后面的进阶教程,其实可以跳过添加模块)
ngx_cache_purge - 缓存刷新扩展,值得一提的是现在由 nginx-modules
继续维护的新版本,原作者FRiCKLE
从14年提供 2.3 版本后就不再进行更新,国内很多教程都是用的 FRiCKLE
旧版。
replace-filter-nginx-module - Nginx替换过滤文本模块,OpenResty 提供的模块,不过由于尚处于 RC 阶段所以没有纳入 OpenResty 主线。
一、添加版本变量
NgxCachePurgeVersion='2.4.2';
二、下载源码
cd /root/src
wget https://github.com/nginx-modules/ngx_cache_purge/archive/$NgxCachePurgeVersion.tar.gz
tar xzf $NgxCachePurgeVersion.tar.gz
git clone https://github.com/openresty/replace-filter-nginx-module.git
三、编译依赖
git clone https://github.com/openresty/sregex.git
cd sregex
make && makeinstall
四、编译 OpenResty
参考全新安装教程或者编译升级教程,在 ./configure
参数中中的 --add-module=../ngx_pagespeed-$PageSpeedVersion-beta \
后添加:
--add-module=../ngx_cache_purge-$NgxCachePurgeVersion \
--add-module=../replace-filter-nginx-module \
升级的花稍微麻烦点,需要杀进程然后安装替换二进制文件
设置教程
一、创建缓存目录,用以加速静态资源的访问
mkdir /data/cache/path -p
mkdir /data/cache/temp
chmod -R www-data /data/cache
二、修改 /usr/local/openresty/nginx/conf/nginx.conf 文件,在 http{}
最后加入:
proxy_temp_path /data/cache/path;
proxy_cache_path /data/cache/temp levels=1:2 keys_zone=cache_one:500m inactive=7d max_size=10g;
# 500m为最大内存占用,10g为最大磁盘占用,7d是7天无访问删除
三、创建虚拟主机配置文件,如下:
yourdomian.conf
是虚拟主机配置文件名称,改为域名就行,例如:www.mf8.biz.conf
server_name yourdomian;
中的 yourdomian
改为和反向代理的原网站一样的域名就行,例如原网站是 https://www.mf8.bi 那就是 www.mf8.biz
root /data/wwwroot/yourdir;
中的 yourdir
也改成网站域名就行,都是可以自定义的
重要:
proxy_pass http://反代域名;
将 http://反代域名
换成自己需要反代的域名即可
如果需要考虑 HTTPS,请参考:《【云计算的1024种玩法】10分钟轻松设置出 A+ 评分的 HTTP/2 网站》
cat >> /usr/local/openresty/nginx/conf/vhost/yourdomian.conf << EOF
server {
##运行端口
listen 80;
##这里需要改成你的域名
server_name yourdomian;
index index.html index.htm index.php; #首页文件优先级
access_log /data/wwwlogs/access_nginx.log combined; #日志目录
location / {
proxy_cache_key "$scheme://$host$request_uri";
#缓存key规则,用于自动清除缓存。
proxy_cache cache_one;
#缓存区名称,与前面定义的相同
proxy_cache_valid 200 304 4h;
#正常状态缓存 4 小时
proxy_cache_valid 301 3d;
# 301状态缓存3天
proxy_cache_valid any 10s;
#其他状态缓存(如502 404)10秒
proxy_pass http://反代域名;
#指定后端ip或者网址,可以加端口
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#向后端传递访客真实ip
proxy_set_header Referer http://example.com;
#强制定义Referer,程序验证判断会用到,修改为反代域名
proxy_set_header Host $host;
#定义主机头
#proxy_cache_use_stale invalid_header error timeout http_502;
#当后端出现错误、超时、502状态时启用过期缓存,谨慎用。
}
EOF
通过这一个方法可以制作出一个完全静态的网站来,从而避免了动态请求,如果网站突然遭遇 CC 攻击可以考虑通过这个方式来应对,攻击者就无法请求动态内容了。
进阶教程
刷新缓存
之前我们设置的是全静态的缓存,如果被反代的网站修改了内容并不会在这个反代的网站是显示的,因为有缓存。那么我们就要刷新缓存,在虚拟主机配置文件中添加这一段:
location ~ /purge(/.*)
{
allow 127.0.0.1; #允许访问刷新缓存的 IP
proxy_cache_purge cache_one $host$1$is_args$args;
}
这样访问 https://www.mf8.biz/logo.png
,OpenResty 就会去请求 https://www.mf8.biz/logo.png
,保存存在就输出。
如果源站的 logo.png 我们进行了更新,则需要刷新缓存,访问海外的 https://www.mf8.biz/logo.png
,就会提示 Successful purge
,如果这个文件没有被缓存过,则提示404 Not Found
内容替换
很多教程用的是 ngx_http_substitutions_filter_module
不过 replace-filter-nginx-module
更好用,而且和 OpenResty 更配,等稳定了就会融入主线都不需要重新添加这个模块了。
在虚拟主机配置文件的反代 location{}
中添加:
replace_filter 米饭粑 云栖社区 ig;
意思是将 米饭粑
全文替换为 云栖社区
,后面的 i
表示 不区分大小写
,g
表示 全文搜索并替换
更多用法:https://github.com/openresty/replace-filter-nginx-module#replace_filter
这样我们就打造好了一个功能完备的 OpenResty 反向代理了。