一次 ping 不通问题排查

线上一台服务器在重启后发现,有些机器无法 ping 通,有些机器可以。

机器情况如下:

host_a 192.168.1.111 192.168.11.1 x.x.x.x
host_b 192.168.1.112
host_c y.y.y.y 192.168.11.2
其中,host_a 和 host_b 在同一个局域网中 192.168.1.0/24,host_a 上运行着 openvpn server,host_c 运行着 openvpn client。

问题表现为在 c 机器上,ping b 的 ip,无法 ping 通,tcpdump 在 b 上抓包,有接收到 ping request 包,没有 ping reply 包。

正当我要按 stackoverflow 上的一个答案配置打开 log_martians 这个选项时,想到会不会是 b 的路由表配置问题,运行 ip route 查看路由发现果然。

ip route add 192.168.11.0/24 via 192.168.1.111

上述命令添加路由后问题解决。

 

参考:

  1. http://stackoverflow.com/questions/18536796/icmp-request-received-but-doesnt-reply
  2. https://www.cyberciti.biz/faq/linux-log-suspicious-martian-packets-un-routable-source-addresses/
  3. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/s1-networkscripts-static-routes.html

Incorrect key file for table ‘xxx’; try to repair it

2017-04-21 01:29:34 7f1d8c0bd700 InnoDB: Error: Write to file (merge) failed at offset 2095054848.
InnoDB: 1048576 bytes should have been written, only 978944 were written.
InnoDB: Operating system error number 28.
InnoDB: Check that your OS and file system support files of this size.
InnoDB: Check also that the disk is not full or a disk quota exceeded.
InnoDB: Error number 28 means ‘No space left on device’.
InnoDB: Some operating system error numbers are described at
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/operating-system-error-codes.html
2017-04-21 01:29:35 93551 [ERROR] Slave SQL: Worker 7 failed executing transaction ” at master log mysql-bin.001470, end_log_pos 931467087; Error ‘Incorrect key file for table ‘xxx’; try to repair it’ on query. Default database: ‘xxx’. Query: ‘ALTER TABLE xxx ADD xxx TINYINT(3) DEFAULT ‘0’ NOT NULL’, Error_code: 1034
2017-04-21 01:29:35 93551 [Warning] Slave SQL: … The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state. A restart should restore consistency automatically, although using non-transactional storage for data or info tables or DDL queries could lead to problems. In such cases you have to examine your data (see documentation for details). Error_code: 1756

报错信息如上,日志提示空间不够,df -h 确认 MySQL datadir 所在磁盘空间是足够的。后确认是修改表定义需新建临时表,临时表目录为 my.cnf 设置中 temdir 的路径(默认为 /tmp),修改该配置后重启 MySQL 服务,问题解决。

filebeat index out of range

filebeat 启动时出现如题报错,同样的配置文件有的机器正常有的机器报错。修改报错那台机器的 filebeat 配置文件重试多次后发现是

multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} '

导致的报错,把后面的空格去掉,改为

multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'

后正常。

疑问:1. 为什么同样的配置文件有的机器报错有的不报错,2 为什么多一个空格会导致这个报错。

补充信息:报错的机器是 CentOS 7.3,正常机器是 CentOS 6.8。

nginx fpm 常见错误对比分析

fastcgi_read_timeout 8; // nginx.conf
request_terminate_timeout=0 // php-fpm.conf

sleep(10);

浏览器 8 秒后返回 504 Gateway Time-out

nginx-error.log
upstream timed out (110: Connection timed out) while reading response header from upstream

 

fastcgi_read_timeout 8; // nginx.conf
request_terminate_timeout=5 // php-fpm.conf

sleep(10);

浏览器 5 秒后返回 502 Bad Gateway

nginx-error.log
recv() failed (104: Connection reset by peer) while reading response header from upstream
fpm-error.log
[pool www] child 5378, script ‘/usr/share/nginx/html/sleep.php’ (request: “GET /sleep.php”) execution timed out (5.793874 sec), terminating

 

fastcgi_read_timeout 8; // nginx.conf
request_terminate_timeout=5 // php-fpm.conf

set_time_limit(1);
while(true){}

浏览器返回 500 Internal Server Error
php-error.log
[08-Apr-2017 23:39:44 Asia/Shanghai] PHP Fatal error: Maximum execution time of 1 second exceeded in /usr/share/nginx/html/while_true.php on line 3

convert 命令剪切合并图片

剪切和合并应用两个不同的参数分两次进行处理。

剪切图片使用的命令为:

convert -crop MxN+a+b src.jpg dst.jpg

从原始图片中剪切出 M x N 尺寸(宽为M,高为N)的图片,+a+b 表示以左上角为坐标原点,右和下方向分别为X轴Y轴的点 (a,b) 位置开始。你也可以使用 -a-b 以右下角为坐标原点,左和上为XY轴的坐标系。

合并图片的命令为:

convert -append 1.jpg 2.jpg dst.jpg

上面命令将图片1和图片2合并得到图片dst.jpg,左边对齐,垂直方向合并,假设 1.jpg 和 2.jpg 尺寸都为 300 x 400 那么合并得到的图片dst.jpg尺寸为 300 x 800。

使用

convert +append 1.jpg 2.jpg 3.jpg

+append 图片在水片方向上合并,得到的图片3尺寸为 600 x 400

掌握上面用法就可以很方便的完成类似这样的任务:你分别扫描了身份证正面和反面两张照片,需要将身份证正反面合并到一张照片上去。

参考:http://www.imagemagick.org/Usage/crop/

Yii2 ajax 自动跳转至登录页面原理分析

某些路由(页面,下同)需要登录才能访问,我们通常使用访问控制过滤器(Access Control Filter)来进行处理。如果未登录用户访问对应路由,会返回 302 并带上 Lacation 的 HTTP Header,此时浏览器会跳转到对应页面。当使用 ajax 请求需要登录的路由时,页面也会跳转到登录页面。仔细查看 Response Header 会发现存在名为 X-Redirect 的 HTTP Header,yii 框架自带的 yii.js(YiiAsset) 里有如下逻辑:

$(document).ajaxComplete(function (event, xhr, settings) {
	var url = xhr && xhr.getResponseHeader('X-Redirect');
	if (url) {
		window.location = url;
	}
});