分类:建站运维

服务器再搬家

昨天刚好是7月13号,距离我把主服务器从 sakura vps 迁出刚好整一年。这一年里我使用的是论坛成员推荐的海星云服务器。虽然存在比较大的丢包情况,但在七牛 cdn 的加成下总体也还算比较平稳。但在上个月,因为备案失效而被迫从中国大陆地区迁出的口袋维基迁移到这台服务器的时候,每个月 1TB 的流量配额就显得特别捉襟见肘了。

VPS 6月流量总图

为此,我还特意把剩余的几个月加钱升级了高配,就为了多买一点流量。临近一年整,靠升配续命终归不是正道,于是服务器再次搬家就成为了一个议题。

这不,好容易有个闲暇时间,赶紧把家搬了。

这次选用的是 Wenjing network 旗下的 HostKVM 。看 IP 分配,感觉跟之前海星在同一个机房,但丢包情况得到了不少改善。按照老规矩,观察几天,看看情况。

近况和Natsu.APP

自打 WordPress 升级编辑器为 Gutenberg 之后,我就一直懒着没有写新的文章。也加上最近确实比较忙。

先从最近的开始说吧。海底光缆好像又出事儿了。博客和论坛所在的这台东京服务器闪断的问题一直没有特别好的缓解,感觉明年或多或少肯定还要再折腾一下。

稍远一点,沙特在美帝又一次准备收拾我国的时候干了一件刷新大家下限的事情。无论当事人多不是人,这种玩法是违反所有人的共识的。当然,前提是大家的共识是同一件事。如果有人对这个有异议,那就可以不用聊了。

再稍远一点,大狗老师因为我的《番禺游记》通过邮件联系上了我。聊了很多,感谢大狗老师为我们这些普通的不能再普通的玩家留下了记录。更多的不能再说了,等待更多的新情报吧。

更远一点,是中秋节。潍坊的舞萌maimai 机台坏掉了。具体来说的话是机器里面的两台 LG 液晶显示器坏掉了——背光挂了。潍坊的这台机器是最早的一批精文世嘉机器,屏幕的型号是 LC420EUN 。如果在阅读文章的您也需要维修的话,欢迎您给我发邮件。我会尽我的可能来帮助您。

我只买了灯条,剩下的还是皇家的机修操作的。

再远一点,在公司内部遇到了不少感兴趣的同好,大家约定了在上周末进行了一次聚餐。喜欢大家。

(这个是不可能有图的www)

闲白的最后,是已经咕咕咕掉的8月本来要写的东西。潍坊的太鼓达人14街机坏掉了。

潍坊的 太鼓达人14
潍坊的太鼓达人14机器

这台机器是我用一些资源交换的手段换来的,因为是复制版所以质量就不是很好。委托在潍坊的朋友发了个快递过来。顺便看了一下 SYSTEM256 的复制。

想起来三年前跟老外聊天,老外表示2010年的时候就已经完全解密了 System256 。

买了适宜的编程器和储存芯片,却被 Block 在了自己不会拆装储存芯片。只有这种时候才有点后悔自己没有学相关的专业。

硬盘的复制倒是比较轻松,直接在命令行下用 dd 即可。不过失败的尝试是使用 TF-IDE 和 SATA-IDE 都失败了,看上去很难给 System256 使用新一点的储存设备了。

闲白完了,现在可以聊聊 natsu.app 了。我是个小城孩子,潍坊城不大,但是好在市面比较平和。所以虽然不像从小在农村长大的孩子那样有非常丰富的上山下水的经历,但是赶上了小城开发的我也在各种保留了7、80年代风貌的改造场地获得了自己的乐趣。

山东毕竟还算是北方(虽然近几年我才知道山东是算华东的),所以冬天蛮冷的一般也不怎么出去玩,最多就是在大院里玩玩雪。所以更多有意思的回忆还是夏天。最多最多的印象是一台金凤牌的电扇。从小用到大,好像现在还是可以继续使用的。

找到了类似型号的同牌子电扇说明书,但是我家那个稍微高级一点,可以上下摇摆,框子周围还有一圈彩色的灯。

但是,更多的还是怀念那种无所事事的夏天。不过这张想象中的图跟小时候的真实场景倒是没什么关系就是了。

更多的原因还是因为前段时间 Google 开放 .app 后缀注册,我顺手买到了 natsu.app 。虽然作为一个喜欢水君的家伙应该爱屋及乌地喜欢冬天,但是冬天更多的是带着人情味儿的回忆。夏天则是真的是没心没肺的记忆。于是就拜托 @FeiyaZ 鸭子老师帮我画了一下这张图。

构图是我想的,不过动笔完全是鸭子老师的。稍微拆了一下图层用 svg.js 做了一下动画,也算是某种程度上的纪念了吧。

如果以后开家店,就以这个为基础起名吧。毕竟最早想到的 hanabi (烟花)的名字,总有一种转瞬即逝的短命感,哈哈。

替换 Discuz! 6 的默认验证码

PTB 今年已经是第 11 年了,代码也是 10 年前的代码了。
这次又遇到什么问题了呢?就是我们的验证码机制被攻破了。
而且其实挺遗憾的,因为 PTB 最初的安全设计是严进宽出,即你注册需要有相当繁琐的步骤和漫长的验证期,之后几乎没有什么限制。

然后很尴尬,我们被撞库了。

就是前一分钟我们还在微信群里面谈笑风生一分钟之后刷出来发现对面那个人的 ID 在论坛灌了 1000 多个台湾找小姐这样。

然后我就按照之前双子的思路打开了验证码。

但是很尴尬, Discuz 6 有一个很严重的逻辑漏洞。这其实也不是逻辑漏洞,是当年大家对 ajax 的理解都不到位而已。

按照惯例,我们来读代码。

DISCUZ_ROOT./ajax.php:64


...
} elseif($action == 'checkseccode') {

	if($seclevel) {
		$tmp = $seccode;
	} else {
		$key = $seccodedata['type'] != 3 ? '' : $_DCACHE['settings']['authkey'].date('Ymd');
		list($tmp, $expiration, $seccodeuid) = explode("\t", authcode($_DCOOKIE['secc'], 'DECODE', $key));
		if($seccodeuid != $discuz_uid || $timestamp - $expiration > 600) {
			showmessage('submit_seccode_invalid');
		}
	}
	seccodeconvert($tmp);
	strtoupper($seccodeverify) != $tmp && showmessage('submit_seccode_invalid');
...

以及

DISCUZ_ROOT./include/global.func.php:888


function submitcheck($var, $allowget = 0, $seccodecheck = 0, $secqaacheck = 0) {
	if(empty($GLOBALS[$var])) {
		return FALSE;
	} else {
		global $_SERVER, $seclevel, $seccode, $seccodedata, $seccodeverify, $secanswer, $_DCACHE, $_DCOOKIE, $timestamp, $discuz_uid;
		if($allowget || ($_SERVER['REQUEST_METHOD'] == 'POST' && $GLOBALS['formhash'] == formhash() && (empty($_SERVER['HTTP_REFERER']) ||
			preg_replace("/https?:\/\/([^\:\/]+).*/i", "\\1", $_SERVER['HTTP_REFERER']) == preg_replace("/([^\:]+).*/", "\\1", $_SERVER['HTTP_HOST'])))) {
        		if($seccodecheck) {
        			if(!$seclevel) {
        				$key = $seccodedata['type'] != 3 ? '' : $_DCACHE['settings']['authkey'].date('Ymd');
        				list($seccode, $expiration, $seccodeuid) = explode("\t", authcode($_DCOOKIE['secc'], 'DECODE', $key));
        				if($seccodeuid != $discuz_uid || $timestamp - $expiration > 600) {
        					showmessage('submit_seccode_invalid');
        				}
        				dsetcookie('secc', '', -86400 * 365);
        			} else {
        				$tmp = substr($seccode, 0, 1);
        			}
        			seccodeconvert($seccode);
        			if(strtoupper($seccodeverify) != $seccode) {
        				showmessage('submit_seccode_invalid');
        			}
				$seclevel && $seccode = random(6, 1) + $tmp * 1000000;
        		}
			if($secqaacheck) {
        			if(!$seclevel) {
        				list($seccode, $expiration, $seccodeuid) = explode("\t", authcode($_DCOOKIE['secq'], 'DECODE'));
        				if($seccodeuid != $discuz_uid || $timestamp - $expiration > 600) {
        					showmessage('submit_secqaa_invalid');
        				}
        				dsetcookie('secq', '', -86400 * 365);
        			}
        			require_once DISCUZ_ROOT.'./forumdata/cache/cache_secqaa.php';
        			if(md5($secanswer) != $_DCACHE['secqaa'][substr($seccode, 0, 1)]['answer']) {
        			        showmessage('submit_secqaa_invalid');
        			}
				$seclevel && $seccode = random(1, 1) * 1000000 + substr($seccode, -6);
        		}
			return TRUE;
		} else {
			showmessage('submit_invalid');
		}
	}
}

不难看出,其实对于验证码的过期,后台的判断只是基于时间(600秒)和是否是属于这个用户。
这其实是有很大的问题的,因为没有重试次数限制,对于不复杂的非中文验证码,一秒钟发出几千个请求cover掉所有数字和大部分字母组合是很轻松的事情。
因此干脆就把它从代码里面摘掉。

主要修改的是下面几个文件。因为现在就是这么做的,因此具体的细节就不展开说了。

include/javascript/post_editor.js
摘掉里面对原有验证码的前端校验

template/seccheck.htm
摘掉原有验证码的展示代码,同位置增加极验的前端代码

ajax.php
屏蔽掉前端校验接口
global.func.php
common.inc.php
摘掉原有验证码后端校验的内容部分,保留 Cookies 校验部分
增加极验后端校验代码

总结一下,其实 discuz 6 在代码设计上真的是完美无缺的。这么老的代码改起来也没有什么不适感(最起码比在公司里吃的那些 s**t 要好得多太多了)。基本就是搜“submit_seccode_invalid”就可以解决这次的问题。
总之双站都是靠极验老版本去 cover 机器人了,毕竟防御价值没那么高,就不去针对 geetest v3 做适配升级了。
屏蔽掉机器人就已经解决绝大部分问题了。

一次古典互联网服务器迁移记录

严格上说,我们这一代前站长(因为现在事实上没有高活跃度会员),赶上的是 Web2.0 刚刚开始起步的那段时间。
谁能想到两三年前 PHP 已经被划作前端范畴了,而最近这一两年前端技术又这么发达了呢。
然而既然决定了保留这些互联网遗迹,那就得让他们在目前为止最好的工作状态下工作。

2007 年春,口袋根据地站长 nfopo 宣布暂时关站,同期,我们筹划成立口袋社区 Poke The BBS (当时英文名叫 Pokemon The BBS)。那时候开一个网站的成本是非常低的。互联网刚刚跨进 Web2.0 ,人人分享的平台还是每人在计算机上创建自己的网站。 CNNIC 联合国内的域名服务商推出了 1 元甚至 0 元购买 .cn 域名的活动。口袋社区最早是以 poketb.cn 作为主域名的,后来购入了同名的 .com 域名,并沿用至今。
poketb.cn whois
最早的口袋社区是 Discuz! 4.1F ,服务器是现在仍然在僵尸的梦游科技美国合租。彼时还没有智能 DNS 和 CDN 这样的高科技玩意儿,以至于现在 PTB 的代码里面还有这样的历史遗迹。
ptb 分站列表
其实后来 PTB 的命途也比较坎坷。无非就是我们比口袋根据地的站长年纪小了几分,最后大家都没有逃过高考这一关。从梦游科技迁出后, PTB 先后托管在 iFastNet 、 vultr vps 上。因为国内互联网环境日趋复杂,导致总有一些会员无法成功访问网站。这也就是导致论坛会员日趋减少的一个重要原因。
我是大概 2013 年的时候决定重新将网站开放出来的。当时的想法也比较简单,就是无论自己当年多么中二,这段记忆总还是要在的。毕竟还是一个可以向后人吹牛逼的资本:“看,你爹当年就是对这个玩意儿上瘾了” —— by liuyanghejerry
之后在潘达的帮助下我将服务器迁移到了日本的 sakura vps 。樱花当年的速度是真好,服务也比较稳定。
sakura vps
只不过美中不足的是,樱花也是个古典 vps 提供商。它们的账户甚至还需要人工去确认日本本地地址。而 vps 除了稳定之外,在性价比上更是一塌糊涂。前一年我使用单台机器承载了所有流量。这在一台双核 1G 内存的机器上来说真是个大型的挑战。要知道 MySQL + PHP-fastcgi 可是吃内存磁盘的大户。机器常常被拖得十分卡顿。于是在大概一年以前我拜托潘先生另外购买了一台同机房的 sakura 节点用于单独跑 MySQL ,并拿来做 SS 节点。
现在来看这个决策是很正确的,虽然多花了一点钱,但是可以有效承载更大的用户流量。这也为成功托管口袋双子星打下了一个良好的基础。
然后一年前接手了口袋双子星,并为其在口袋社区服务器的 php5.6 环境下运行做了大量的改动。
近几年,互联网,特别是移动互联网进一步普及,使得中国的互联网环境空前复杂。面试、考试中简单的从一台计算机 A 连接到服务器 B 这样理想的情况已经不复存在(虽然看上去还是那样的)。于是在去年晚些时候我又花了一些时间为双子、口袋社区部署了一个用于 CDN 的域名 suicune.cn 并进行了加速。
然而,还是很慢。发现原因是 sakura vps 到大陆的速度变的越来越差,于是就有了这次迁移。
这次迁移出于平衡的考虑(因为数据库节点不涉及到访问中国大陆,因此只要在日本就好),我选择了一台仍然在日本但是速度相对较好的 vps 。经过测试后有中文客服,并且速度还不错的海星云成为了我的首选。
接下来的事情就是测试一下稳定性,以决定是否继续使用了。

============2018.06.04更新。

先说结论吧:总体来说服务的稳定性没有 sakura 好。
毕竟是二道贩子嘛,比不过自建线路的地头蛇的。刚好在敏感时期,刚迁移完就发现有奇怪的问题。这次迁移之后我对 vps 本身的改动是有三个:其一,升级了 linux 内核到 4.3 ,默认开了 bbr ;其二,调整了 php5.6-fpm / php7-fpm 的编译参数,这个测试没有什么影响; 其三,测试几个小流量站点直接 Caddy – PHP ,去掉了中间的 nginx。第三条这个测试后来摘掉了,因为发现维护起来实在是太麻烦了。
总体来说还是维持 外部流量 – Caddy – Nginx – php5.6/7 – 代码 的这个逻辑。按理来说迁移应该是无感的, 因为环境配置和代码位置甚至临时文件位置都是一样的。但是依然出现了奇怪的丢包。
现在在怀疑是特殊时期导致的,等这两天过去之后再确认一下吧。

nginx前端代理导致nginx暴露监听端口问题解决

其实我还是挺想吐槽一下我国的网络管理制度的。一刀切的政策导致很多爱好者交流的地方直接就毁灭于无形之中了。比如说中华相声网,再比如更多名声更小的论坛。

中华相声网

其实这个事情很简单,在我国开论坛需要企业资质+24小时值守,这两条我我们很多爱好者性质的论坛就完全没戏。
当然有些论坛我不知道是怎么备过案的,比如某新生代,再比如某吧

算了,不扯非技术,来聊聊应付这一规定中间的一些技术难题吧。

就在前两天,我们伟大的电信网络开启了前所未有的海外网站白名单制度。不仅是在黑名单上的网站、 IP 无法访问,其他的未进行白名单备案的服务器和 IP 也只能有限的访问 22 80 443 这几个端口(经过实测有些灰色 IP 比如本机甚至只能访问 443 端口)。这就逼着我把拖延症拖了快一年的全站升级 https 的事情放上议程。

经过花花的推荐,我选择了 Caddy 对 Nginx 外面包裹一层的方法来解决这个问题。

小课堂:
Caddy是个用 Go 语言开发的轻量级 http 服务器,特点是内置了全自动续命 续期的 Let’s Encrypt 服务。而后者是有效期较短的免费 https 证书服务,旨在进一步提高互联网的安全等级,最重要的还是免费。

于是按照教程写了一万个 redirect 和 https 域名适配,之后发现一个很严重的 bug 。

根据这位仁兄博客的说法,具体的问题是:

但是访问子目录时,除非在子目录后面再加一条“/”,否则就会遇到网址自动重定向至Nginx监听的端口。假设你Nginx站点监听的端口是123,你本来访问的地址是http://domain.com/wp-admin,会自动重定向至http://domain.com:123/wp-admin

这位仁兄当然也给出了解决方案,也就是在 nginx 的 http 段增加配置:

port_in_redirect off;

然而在本机未生效。后来发现是 nginx 版本过低。具体的发现过程如下:

阅读 nginx 官方文档对这个参数的定义

http://nginx.org/en/docs/http/ngx_http_core_module.html#port_in_redirect

然后查看其关联指令absolute_redirect ,发现版本是1.90。
于是怒升1.8到1.12.2(上周刚发布的),搞定。

试图去保护一个逝者的梦

各位看到这篇文章的时候,我可能已经写了很久了。这篇文章里面不会有连续的干货,是我以一个局外人的身份,试图拯救一个逝者生前遗愿的过程。
当然,如果失败了,这篇文章可能永远都不会发出来,但是我依然想尽自己最大的努力。

雪拉比是我最喜欢的 精灵宝可梦·金银 世代的超神兽。这也是一个已经因病逝去的精灵宝可梦同好站 —— PM双子星 的站长的昵称。
下面的豆瓣链接是网站继任写在头七的文章。
https://www.douban.com/note/274999353/

20170223
今天早上把 PTB 的首页修整了一下,于是进行日常的友情链接清理。果然又发现了一个挂掉的链接。但是,却是我最不想看到挂掉的链接。
PM双子星。
其实我现在的角色真的有点像守墓人,每天日常清理一下 PTB 遗留下来的垃圾,挨个点一下友情链接看看谁有挂掉了。双子跟我们的关系其实是很不错的。当年从 PM杂货店 时代开始就有联系,我还去玩了一把版主。后来双子的图区几位朋友都是很好的人,包括上次去香港见到的阿米
去查了一下whois,域名是一个月以前过期的。
当然,毕竟是我是局外人,还是要先从联系相关人士起步。
根据《纪念森林の宇》一文的描述,貌似在很多年前来北京的时候跟一个相关人士有面基。于是通过方法找到了联系方式。
是的,是咖啡哦。
微博和QQ都没有理我。
更新:好在通过朋友,联系上了。
然后去搜了一下域名的备案和所有人的信息。域名的所有者留的电话,还是不要去打扰比较好。

原因有两个:
1、域名注册已经12年了,不知道信息是否还存在,虽然知道升号之后的规则。
2、不知道是谁的电话,假如是原站长的,贸然打扰逝者家属不好。

总之把消息散布出去了,看看其他人的回应吧。

23:25
域名果然过期了。外人只能干着急。

有人跑路了,真是令人悲伤啊。

23:38
拿到了后台的管理账号密码,小 IDC 真是不靠谱。

总之提个工单,明天上班打电话。

20170224
早上睡不着很早就醒了。赶紧起来电话联系空间商。
南京毕竟是安徽省会(哈哈哈),普通话还是很标准的。
好在赶在deadline之前把域名费用给结清了。
多少钱已经不重要了。

好在域名安全了。

真是松了一口气。

将博客的静态资源迁移到了七牛

最近实在是比较忙。高估了自己的能力。
现在主要是编码速度实在不尽如人意。以后针对这一点好好做一下训练吧。

最近抽空把博客速度慢的问题好好解决了一下。主要使用七牛云来作为主要的托管媒介。
细分一下这个需求的话分为如下两点:
1、域名未备案导致的解析速度缓慢,由于页面内存在比较多的本地资源,导致加载速度感人,手机上的表现是白屏,电脑上也时不时抽风。
2、图片资源使用七牛默认域名(测试域名),导致新版Chrome认为资源不安全,拒绝加载。
3、JS类库来自本地或海外cdn,速度感人。

于是花了大概十分钟的时间解决了一下这个问题。不得不说,七牛的工具虽然做的比较烂,但是能用。

现将步骤记录在这里。

1、WP侧安装插件七牛云储存
插件链接:https://wordpress.org/plugins/wpjam-qiniu/
也可以直接在后台搜索安装。
正常配置,填写AK和SK, 同时为你的储存区域分配一个SSL域名(这是要收钱的,不过4毛钱1G也就那样了吧),填写为你的加速域名

2、在服务器上下载七牛迁移工具(应该是同步工具)
https://qiniu.kf5.com/hc/kb/article/68954/
按照页面说明初始化,并将wp-contents和wp-include目录中的静态资源(css、js)按照路径,以分别的目录前缀(wp-contents/和wp-include/)上传到七牛云的储存空间。

然后就可以正常的享受这个加速了。

更换了一个页面里面的cdn源

昨晚顺手把文章发到了朋友圈里,朋友过来跟我说,手机上根本打不开。
看了下有可能导致速度很慢的原因,就只剩 Google 了。
reCaptcha 是 lazyload ,应该不会导致这个问题,最多只是无法评论。
那就是字体了。
翻看这个主题的源码,找到了罪魁祸首。
国内 cdn 找了好几家,看了下还是贵科大的比较叼。
USTC Blog强制对 Google 字体加速/

按照这个文章里面说的把字体的cdn改换过去,虽然速度一般,至少不会白屏了。

———
更新:
https://gist.github.com/gaoyifan/680da074330d2c499d6b
按照官方博客里面的配置,发现在新版的 nginx 里面,关键字已经被修改为 sub_filter ,不再是复数形式。
修改后恢复了正常。

———
更新:中科大源还是挂了。
换了360的公共源,直接修改了主题的CSS。