由电信宽带封堵443端口引发的一系列折腾
很久木有搭理博客了,最近冠状病毒肆虐也只能窝在家里,要么带娃要么刷新闻。最近折腾KONG网关正好有一些心得,就想到博客整理下,结果发现后台打不开。检查一看,原来我部署在群晖上的源站早就挂B了,只剩CloudFlare的CDN缓存在勉强支撑。进一步诊断了下,根因就是电信宽带443端口被封了,因此CloudFlare回源吃了个闭门羹。
心里默默的问候了一下(河蟹),然后快速想了多个方案:
- 研究CloudFlare能否指定源站端口,然后在路由器上加一个端口映射就可以解决问题;
- 搬迁博客到国外云主机,比如AWS的lightsail,和群晖分手快乐;
- 在腾讯云主机上搭建一个反向代理,代理NAS上的源站,然后将CloudFlare的源站指向腾讯;
- 在路由器上装一个花生壳内网穿透来解决端口映射问题;
- 投诉电信,让其放通443端口;
- 寻求支持自定义端口的CDN服务,而且只能是海外CDN加速,因为无法备案;
- 利用CF的Workers来做反向代理(最新补充于文末);
- 最终落地方案(最新补充于文末)。
本文纯属折腾口水文,不感兴趣的就别浪费时间了。
最简单最快速的肯定是第1个方案,因此先看了下CF的面板发现不支持,然后搜了资料发现CF很久之前有个Proxy anything的功能内测,做的就是这种任意端口的代理,可惜现在已经是商业化了,需要最贵的企业版才支持,只好作罢!
第2、3种方案:都需要买一个云主机,既然都买云主机了,我干嘛要放到群晖呢?
第4种方案:看了下需要备案域名而且收费300多一年,当我没说好吧!
第5种方案:试着找了下微信电信客服,客服给我分配了一个错误的电信故障案例,说是疫情期间宽带故障检修会慢一些,要我耐心等下工程师过来(后面电话确认才发现错误分配到了一个宽带故障的小区),然后搜了下电信封堵443,发现一片哀嚎,看来管控又收紧了不少,还是算了吧。
看来只有第6种方案了,已知腾讯云是支持自定义回源端口的,而且我也是腾讯云海外加速的内测用户,但是腾讯云海外CDN节点在国内访问真的慢出翔,ping探测全面飘红:
继续爬了多家CDN,只有阿里云支持自定义回源端口,因此接入试了下。结果发现经常504或503错误,提工单让客服看了下,和预想的差不多,阿里云海外CDN节点到国内的源站并不稳定(功夫王立了大功),所以断断续续的。实际测试发现阿里云的海外加速节点从国内过去的延迟很低,基本在100ms以内,比CF强,真是可惜了!
看来暂时还是只能用腾讯云海外加速了,但是直接到腾讯云海外CDN节点延迟太高,这里继续套了一层CF来缓解下,因此临时方案为:
CloudFlare–>腾讯云海外CDN–>NAS源站。
很快就搞定了,效果当然比之前直接CF套NAS要慢不少,不过总算是可以正常访问了,回头弄个预缓存脚本定刷一下,前台打开速度基本也就凑合了:
搞定之后,打算继续花点时间写个KONG网关相关经验的草稿(没办法有娃之后时间真的靠挤),结果发现后台卡到吐血,基本没法写文章。之前CF直接套源站实际上后台也比较卡,但是家里宽带的443端口是正常的,所以我自己访问博客都是用host直接回源来解决卡的问题。
继续YY了几个方案:
- 后台通过自定义端口访问,然后用hosts绑定到源站IP;
- 只能在家里用hosts绑定192.168.x.x来访问博客后台;
- 独立博客后台域名,绑定一个备案过的域名。
第1,2种方案不够优雅,果断放弃。很明显第3种方案还是不错的,因此开始折腾。
更换后台域名的步骤如下:
1、在wp-config.php增加如下配置:
|
//定义前台地址(可选优化)
|
|
|
define(‘WP_HOME’, ‘https://zhang.ge’);
|
|
|
//定义后台地址
|
|
|
define(‘WP_SITEURL’, ‘https://admin.xxoo.com’);
|
|
|
//后台开启https访问
|
|
|
define(‘FORCE_SSL_ADMIN’, true);
|
|
|
if (strpos($_SERVER[‘HTTP_X_FORWARDED_PROTO’], ‘https’) !== false){
|
|
|
$_SERVER[‘HTTPS’]=‘on’;
|
|
|
}
|
|
|
//定义静态文件地址,不指定会输出admin地址
|
|
|
define(‘WP_CONTENT_URL’, ‘//res.zgboke.com/wp-content’);
|
|
|
//define(‘WP_CONTENT_URL’, ‘/wp-content’); //如果没有二级静态域名可以使用这个配置
|
2、在主题functions.php添加如下功能函数,解决上传图片地址变成admin这个域名的问题:
|
/**
|
|
|
* 小松博客www.phpsong.com
|
|
|
* 添加的图片还是用前台的地址
|
|
|
**/
|
|
|
add_filter( ‘upload_dir’, ‘wpabcd_custom_upload_dir’ );
|
|
|
function wpabcd_custom_upload_dir( $uploads ) {
|
|
|
$uploads[‘baseurl’] = str_replace(get_option(‘siteurl’),get_option(‘home’),$uploads[‘baseurl’]);
|
|
|
return $uploads;
|
|
|
}
|
3、如果主题用到了RESTful API功能,则推荐在主题functions.php添加函数,将后台RESTful地址指向admin域名,否则无穷无尽的跨域问题烦死人,当然也是为了加速后台:
|
/**
|
|
|
* WordPress修改后台RESTful API域名 by zhang.ge
|
|
|
**/
|
|
|
if (is_admin()) {
|
|
|
add_filter(“rest_url”,function($url){
|
|
|
$url = parse_url($url);
|
|
|
return get_option(‘siteurl’).$url[“path”].$url[“query”];
|
|
|
});
|
|
|
}
|
添加完以上配置之后,后台基本就可以使用admin这个域名来访问了,走国内CDN线路,速度自然不可同日而语也。
4、修改了后台域名之后,CloudFlare插件会不能工作,定位发现是因为CF拿到的域名变成了admin这个了,修复方法:
|
找到文件:网站根目录/wp-content/plugins/cloudflare/src/WordPress/WordPressWrapper.php
|
|
|
将代码里面的 get_site_url 改为 get_home_url 即可。
|
5、如果后面发现还有前台还有个别输出为admin域名的链接,这里可以继续在functions.php加一段终极替换代码:
|
/**
|
|
|
* WordPress替换前台静态地址
|
|
|
* 1. 修改 admin\.xxoo\.com 为后台独立域名地址,小数点需要反斜杠
|
|
|
* 2. 如果是有自己的静态文件域名,将res.foo.com改为自己的静态域名,如果没有直接删除 //res.foo.com 即可。
|
|
|
**/
|
|
|
if (!is_admin()) {
|
|
|
ob_start(“rewrite_static_domain”);
|
|
|
}
|
|
|
function rewrite_static_domain($buffer_out) {
|
|
|
$buffer_out = preg_replace(‘/http(s|):\/\/admin\.xxoo\.com\/wp-([^”\’]*?)\.(jpg|png|gif|bmp|jepg|jpeg|css|js|woff|woff2|ttf|svg|eot|wo|otf|sv|eo)/i’,‘//res.foo.com/wp-$2.$3’,$buffer_out);
|
|
|
return $buffer_out;
|
|
|
}
|
6、最后,如果不想让网站的任意资源能够通过admin访问到,那么还是在源站加一个虚拟主机配置,如下所示:
|
server {
|
|
|
listen 80;
|
|
|
server_name admin.foo.com;
|
|
|
index index.html index.htm index.php default.html default.htm default.php;
|
|
|
root /data/wwwroot/zhang.ge;
|
|
|
# 禁止搜索引擎收录
|
|
|
if ($http_user_agent ~* “spider|bot|baiduboxapp”) {
|
|
|
return 403;
|
|
|
}
|
|
|
# admin 这个域名仅允许访问WP后台和内核资源,防止其他页面通过admin这个域名访问到
|
|
|
if ($request_uri !~* “^/wp-(admin|json|includes)” ) {
|
|
|
rewrite ^/(.*)$ $scheme://zhang.ge/$1 permanent;
|
|
|
}
|
|
|
# 以下配置保持和源站一致即可:
|
|
|
location ~ [^/]\.php(/|$) {
|
|
|
try_files $uri =404;
|
|
|
fastcgi_pass unix:/dev/shm/php-cgi.sock;
|
|
|
fastcgi_index index.php;
|
|
|
include fastcgi.conf;
|
|
|
}
|
|
|
location / {
|
|
|
try_files $uri $uri/ /index.php?$args;
|
|
|
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
|
|
|
}
|
|
|
location ~ /\. { deny all; access_log off; log_not_found off; }
|
|
|
access_log /data/wwwlogs/admin.foo.com.log access;
|
|
|
}
|
最后在CDN设置admin的回源域名使用默认的回源域名即可:
全部搞完,后台就可以非常顺畅的用admin独立域名访问了,顺便把这篇文章一写,之前计划的KONG网关的相关经验就没时间整理了,后面有空再说吧…
第二天补充:想了一晚上,感觉上面的方案在动态内容的访问上比过去慢太多了,很不爽还要继续改造下。
方案1:利用CF的Workers来做JS反向代理,这个在之前的文章也提到过。
在网上找了下就找到了2个开源项目:jsproxy和Workers-Proxy。
都试了下,前者其实就是一个写好的动态代理,指哪打哪,比如google、Youtube等(嘘…你懂的),不改造的话不适合我这个需求。后者就是一个固定代理到某个源站的脚本,但是目前不支持自定义端口,但是从我这个源站指向上文提到的腾讯云admin二级域名是可以成功的:
所以这个方案其实是行得通的:
CF Workers –> 腾讯云国内CDN –> DDNS+Port –> NAS
但是有个问题,Workers每次都是实时拉取然后返回内容,没做缓存。当然,CF Workers肯定是可以写缓存逻辑的,但是太折腾了,到时候一堆缓存规则需要自己写,还是算了。不过从上面的方案让我想到另一个可行方案:
CF(全缓存) –> 阿里云海外CDN(回源腾讯CNAME,缓存静态文件) –> 腾讯云国内CDN(缓存静态文件) –> DDNS+Port –> NAS
说干就干,当我把阿里云海外CDN的回源地址改为腾讯云国内CDN的CNAME记录之后,发现可以了,没有之前的断断续续50x错误了!!看来还是阿里云到自定义的端口有点坑啊。
简单总结:最终的方案相当于是利用阿里云海外CDN、腾讯云国内CDN做了2层中转代理,解决了CF免费版不支持设置回源HOST、不支持回源到自定义端口的问题。
第三天补充:当前最终方案
想了又想,其实没必要弄个admin二级域名,直接启用zhangge.net这个备案域名不就好了。。。所以,博客的最终架构如下图所示:
确实搞的无比复杂,想用NAS搭建站点朋友可以参考下。






