/images/avatar-home.jpeg

简书移动端Web劫持、跳转app问题

背景

每次手机上搜资料时,只要进入了简书,那么必定会跳转到各种app(淘宝、京东、天猫、京东金融等等),很烦的啊。
2020-02-02 更新:
在csdn、豆瓣上也发现这个问题。

我还以为是我本地宽带或者dns劫持,但是我本地dns用的是114和119,很少出现这种问题,而且简书也是https,浏览器也是绿标,
所以就usb chrome 远程调试看了下,不看不知道,居然会唤醒这么多app和跳转网页。

https://img.curlc.com/images/2019/08/31/35792449738f2b472537e8669855632a.png

临时解决方案

屏蔽  ad.lflucky.com 这个域名(建议屏蔽这个域名下的所有二级域名),host改也行。

方法一: 手机端使用 火狐浏览器,安装 AdGuard 广告过滤插件,屏蔽 ad.lflucky.com  

方法二、有位读者推荐的软件也很不错,AdGuard Home ,安装在软路由中使用~

2020-03-09:

广告代码改为https://jian.t58b.com/js/jan/jian.js所以,继续屏蔽 jian.t58b.com

  最后想了下,既然是cdn劫持,那么我把cdn域名一刀切怎么样,别说,效果还蛮不错的,界面干净了。 屏蔽整个cdn下的js,不过这样带来的后果是文章不能动态加载出来,只适合偶尔使用简书。

cdn2.jianshu.io/*.js

手机端用yandex浏览器,装广告屏蔽插件,屏蔽  ad.lflucky.com 这个域名(建议屏蔽这个域名下的所有二级域名),我个人装的是广告终结者,本来想装uBlock的,懒得折腾就没装。或者路由器ad插件屏蔽这个域名。添加屏蔽域名后完美,终于不再跳转。

分析

因为我的前端是废的,所以也只能进行简单点的分析,大佬们看看就好了。 简单分析了一下跳转js,点击 VM2486:1 进入到js,格式化后的代码如下

(function() {
	function getJson(a, b) {
		var c = new XMLHttpRequest();
		c.open("get", a);
		c.send(null);
		c.onreadystatechange = function() {
			if (c.readyState == 4 && c.status == 200) {
				b && b(eval("(" + c.responseText + ")"))
			}
		}
	}
	function ProductLink(a) {
		this.product = a.productJson;
		this.disabledArea = ["UNITED STATES", "JAPAN", "SINGAPORE", "CANADA", "香港", "北京", "上海"];
		this.avokeTime = a.avokeTime
	}
	ProductLink.prototype.init = function() {
		var b = this;
		if (window.navigator.platform.indexOf("Win") > -1 || window.navigator.platform.indexOf("Mac") > -1) {} else {
			this.isDisabled(function() {
				var a = true;
				try {
					for (var i = 0; i < b.disabledArea.length; i++) {
						if (returnCitySN["cname"].indexOf(b.disabledArea[i]) > -1) {
							a = false;
							break
						}
					}
				} catch(e) {}
				if (!a) {
					return
				}
				b.addElement()
			})
		}
	};
	ProductLink.prototype.isDisabled = function(a) {
		var b = document.createElement("script");
		var c = false;
		document.body.appendChild(b);
		b.src = "https://pv.sohu.com/cityjson";
		b.onload = function() {
			if (!c) {
				c = true;
				a && a()
			}
		};
		setTimeout(function() {
			if (!c) {
				c = true;
				a && a()
			}
		},
		4000)
	};
	ProductLink.prototype.addElement = function() {
		var a = this;
		setTimeout(function() {
			a.showMainProject();
			a.showSecondaryProduct()
		},
		2000)
	};
	ProductLink.prototype.showMainProject = function() {
		this.showAllKind(this.product.mainProduct.appLink, this.product.mainProduct.cancelTime)
	};
	ProductLink.prototype.showSecondaryProduct = function() {
		var b = this;
		var c = this.product.secondaryProduct.concat();
		var d = c.length;
		var e = null;
		e = setInterval(function() {
			if (d <= 0) {
				clearInterval(e);
				return
			}
			var a = Math.floor(Math.random() * d);
			b.showAllKind(c[a].appLink, c[a].cancelTime);
			c.splice(a, 1);
			d--
		},
		b.avokeTime * 1000)
	};
	ProductLink.prototype.showAllKind = function(a, b) {
		var c = a.concat();
		var d = c.length;
		var e = false;
		var f = this.getCurrentDate();
		while (d > 0 && !e) {
			var g = Math.floor(Math.random() * d);
			if (c[g].type == "random") {
				this.newIframe(c[g].link, b);
				e = true
			} else if (c[g].type == "date") {
				if (c[g][f]) {
					this.newIframe(c[g][f], b);
					e = true
				} else {
					c.splice(g, 1);
					d--
				}
			}
		}
	};
	ProductLink.prototype.getCurrentDate = function() {
		var a = new Date(),
		Y = a.getFullYear() + "-",
		M = (a.getMonth() + 1 < 10 ? "0" + (a.getMonth() + 1) : a.getMonth() + 1) + "-",
		D = a.getDate() < 10 ? "0" + a.getDate() : a.getDate();
		return Y + M + D
	};
	ProductLink.prototype.newIframe = function(b, c) {
		var d = document.createElement("iframe");
		d.style.display = "none";
		d.src = b;
		document.body.appendChild(d);
		var e = document.createElement("iframe");
		e.style.display = "none";
		e.src = "./counturl.html?url=" + encodeURIComponent(b);
		document.body.appendChild(e);
		setTimeout((function(m, a) {
			return function() {
				document.body.removeChild(m);
				document.body.removeChild(a)
			}
		})(d, e), c * 1000)
	};
	getJson("./json/product.json",
	function(a) {
		new ProductLink(a).init()
	})
})();

嗯,上面有个getJson方法,搜索了下加载记录发现域名是:

hetzner ex42 款机器网速只能达到一半解决方法

问题

上个月买的ex42机器,到今天才有时间测试,结果发现网速达不到G口,只有500m的样子,在群里大佬的帮助下,确定了是网卡驱动的问题,但是这款机器的网卡不一定全部一样,我的是

I219-LM

https://img.curlc.com/images/2019/08/30/ab4e8320ba90d6ec12806b25288e5c47.png

系统自带模板中的网卡驱动有问题,DMA访问时间过长,NIC在繁重的UDP流量上挂起,这会影响TCP性能。

修复方法:

为了重新获得完整的传输速度,可以通过以下命令关闭TCP分段卸载:

ethtool -K <interface> tso off gso off

暂时关闭后可以达到标准速度,但是并不完全理想,实际上需要更新驱动程序,我就不折腾了。 https://img.curlc.com/images/2019/09/02/34e46c264472f5201dbdcaac76f0202c.png

官方wiki说明:https://wiki.hetzner.de/index.php/Low_performance_with_Intel_i218/i219_NIC/en

开机启动自动加载NIC配置的方法:https://forum.manjaro.org/t/solved-only-half-gigabit-eth-with-intel-i219-lm-v-under-kernel-4-14-to-4-19/58886/37

上手一台Dell R720

最近上手一台dell R720 的服务器,配置如下:

cpu:E5 2650*2  
内存:128G ddr3 1600  
三星ssd *1 (具体型号忘记了)  
2T 7200 sas硬盘 *2  
双电源  H710阵列卡  
iDRAC7 远程控制卡  

然后我把原来的两块sas硬盘拆了装到这个机器上,组Raid5,平时没跑东西时功耗 98W(更新,功率计测试 106 W),CPU满载260W。
然后通过ipmitool限制风扇转速(因为硬盘不是原厂的,导致识别不了风扇会提高转速)为20%,这样就不吵了,同时写脚本监控,如果cpu温度大于50°就开启风扇自动控制,以免温度过高,脚本参考链接

https://img.curlc.com/images/2019/08/20/fc71702ad7e9f1cfa63d4d55ea735639.png

https://img.curlc.com/images/2019/09/10/272df7c3330bda67f87211aa65923608.png

https://img.curlc.com/images/2019/08/20/d2f583e385cc81c8b6f57ee5f7685b44.png

https://img.curlc.com/images/2019/08/20/2257186d9e364a2d6173f01c28628c2f.png

hetzner EX42款机器测试

这个月hetzner机器都没有安装费,上手了一台EX42款的机器试一下,听说只有正价机器才有ddos防御?

我运气不错,开到的cpu是7700,随便玩玩就做的raid0,反正数据每半个小时就会同步到google drive,还好是无限空间,随意传~

https://img.curlc.com/images/2019/07/16/5cbedd933b1403d9e83467ac2288eba0.png

https://img.curlc.com/images/2019/07/16/1b1214b1aba4a25557f0a83884946cb5.png

电信的路由不错,联通就是绕美了 宝塔娱乐跑分,在docker下

https://img.curlc.com/images/2019/07/17/20eca06c2c8e7ee4340299a5c1043f46.png

PVE安装RouterOS CHR

1、新建虚拟机

这一步就不多说了,和平常新建的一样。硬盘给1G,反正到后面都要删掉。

2、修改配置

  1. 分离硬盘并删除
  2. 添加网络设备

3、添加RouterOS CHR固件

#下载RouterOS CHR固件 想下别的版本请在 [mikrotik官网下载](https://mikrotik.com/download)
wget https://download.mikrotik.com/routeros/6.43.16/chr-6.43.16.img.zip -O chr.img.zip
#解压缩
gunzip -c chr.img.zip > chr.img
#转换映像重命名
qemu-img convert -f raw -O qcow2 chr.img vm-100-disk-1.qcow2
#查看映像信息
qemu-img info vm-100-disk-1.qcow2
#增加映像大小 根据自己使用调整
qemu-img resize -f qcow2 vm-100-disk-1.qcow2 +1G
#加载映像到虚拟机
qm importdisk 100 vm-100-disk-1.qcow2 local-lvm

请注意红色的文字(也就是 100),你新建的虚拟机的id是多少,那么你要将红色部分改为新建虚拟机的ID。

4、添加镜像到虚拟机并修改启动引导项

在pve界面添加硬盘…….略….

因为已经删除了新建时候的硬盘,所以这里需要将引导项改为新的硬盘

https://img.curlc.com/images/2019/06/25/31a42d41528a953a15bd504f7724a7fd.png

[转]真正的inotify+rsync实时同步 彻底告别同步慢

我们公司在用inotify+rsync做实时同步,来解决分布式集群文件一致性的问题。但当web文件越来越多(百万级数量html,jpg等小 文件),同步就越来越慢,根本做不到实时,按照网上的调优方法都尝试过,问题根本没有解决。经过我一翻细致研究,终于把慢的核心问题研究明白,先总结一句 inotifywait响应不会有延迟,rsync也很快。大家同样有慢的烦恼,那是因为网上的inotify+rsync的教程都是坑。下面我们来分 析。

inotifywait 单独分析

/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib /data/

执行上面命令,是让inotifywait监听/data/目录,当监听到有发生modify,create,delete,attrib等事件发生时,按%Xe %w%f的格式输出。 在/data/目录touch几个文件

touch /data/{1..5}

观看inotify输出

ATTRIB /data/1 -- 表示发生了ATTRIB事件 路径为/data/1 ATTRIB /data/2 ATTRIB /data/3 ATTRIB /data/4 ATTRIB /data/5

  知道上面的输出效果之后 我们应该想得到,可以用rsync获取inotifywait监控到的文件列表来做指定的文件同步,而不是每次都由rsync做全目录扫描来判断文件是否存在差异。