Nginx ssi 隐藏404内容

测试服务器开启 SSI 以后,可以动态引入样式和其他内容的页面片,模拟dev环境。

有时候,传到测试服务器的重构稿DEMO忘记上传页面片文件,或者已经有了样式,不需要页面片但是忘记删除引用了。就会在页面片引入的位置显示404内容,样式受影响。

Nginx可以自定义404内容,但是这种情况不适用,设置后会整个页面跳转到404页面。

解决方法如下,设置shtml文件永远不返回404:

location ~ \.shtml$ {
	if (!-e $request_filename) {
		return 200;
	}
}

更进一步,如果连shtml内容报错都想忽略的话,可以这样设置:

location / {
	ssi on;
	ssi_silent_errors off; # 关掉错误提示
	ssi_types text/shtml;
	
	root   /www;
	index  index.php index.html index.htm;
}

修改后记得先

service nginx configtest

然后再重启。

service nginx restart

用 d3.js 生成可以互动的中国地图

这是一个 step by step 的教程,不讲解原理,想深入了解请咨询google和github。

1,首先,我们需要地图坐标

Nature earth 可以下载地图坐标,这里有1:10m,1:50m,1:110m三种精度的数据可选,第一种最详细,文件尺寸也最大,后面两种文件较小,但是不包含省市信息(除了北美)。

这个页面下载 1:10m 的地图
国家: Download countries (5.11 MB) version 3.1.0
省:Download states and provinces (13.97 MB) version 3.0.0
省会: Download populated places (1.46 MB) version 3.0.0

【这里不演示省会信息,但是处理方法相同】下载后解压缩可以看到多种数据格式,我们需要 .shp 文件。
也就是这两个文件:
ne_10m_admin_0_countries.shp【8.8M】
ne_10m_admin_1_states_provinces.shp【21.6M】

2,转换坐标文件

下载的文件包含全球所有国家和地区,我们现在只需要中国的地图数据。

现在需要用到 Geospatial Data Abstraction Library – GDAL 的 ogr2ogr 工具把shp文件转换为GeoJSON。
假设你用 OS X 并且安装了 brew,运行:

> brew install gdal

安装后运行:

> ogr2ogr -f GeoJSON -where "SU_A3 = 'CHN' OR SU_A3='TWN'" countries.json ne_10m_admin_0_countries.shp

同样处理省市文件:

> ogr2ogr -f GeoJSON -where "gu_a3 = 'CHN'" states.json ne_10m_admin_1_states_provinces.shp

转换后的文件就可以用 d3.js 来生成地图啦。

3,压缩坐标文件

但是有个问题,经过上面转换后,文件尺寸有

countries.json【651KB】
states.json 【2.6MB】

不可能直接用到网页中啊。还好已经有人做过这一步工作了, http://www.mapshaper.org/上传上面的文件,会展示出来地图信息,拖动滚动条调整精度,国家地图我选择4.0%,省市地图我选择 25%。

然后选择导出GeoJSON。

countries.json【651KB】 -> china_countries_min.json 【25KB】
states.json 【2.6MB】 -> states_min.json【767KB】

减少了很多,不过还是有点大,我们需要用另外一个工具 topojson 进一步去除不必要的信息,假设你用 OS X 并且安装了 Node.js,运行:

> npm install -g topojson

分别处理以上两个文件:

> topojson --id-property SU_A3 -p name=NAME -p name -o china_countries_topo.json china_countries_min.json
> topojson --id-property adm1_cod_1 -p name -o states_topo.json states_min.json

处理后:

countries.json【651KB】 -> china_countries_min.json 【25KB】-> china_countries_topo.json【6KB】
states.json 【2.6M】 -> states_min.json【767KB】-> states_topo.json【104KB】

文件小到网页加载可以接受了,不过,在 mapshapher.org 这一步,可以试试调成精度更低的省市级别的文件,进一步减小文件尺寸。

3,生成地图

终于来到了最后一步,展示地图,废话不多说直接看代码:
Continue reading

ubuntu 设置 sendmail

给博客装了个登录保护的插件 Login security solution,用来防止猜密码,初次安装会强制所有用户需改密码。
登录的时候提示重置密码,然后报错,不能发送邮件……
ubuntu设置很简单

apt-get install sendmail

一路 y 确认

再测试发邮件

echo “This is a test.” | mail -s Testing [email protected]

提示需要安装 mailutils

apt-get install mailutils

一路 y 确认,什么也不用配置

再测试发邮件

echo “This is a test.” | mail -s Testing [email protected]

发送成功,现在可以修改密码了。

插件要求好高,要20位以上,包含大小写字母特殊字符,不能含有站点信息。

把帽子扔过篱笆

把帽子扔过篱笆

上个月收到苹果的开发者账号续费邮件,我注册已经这么久了么?

那我买design+code,sketch3也超过一年了?

还没有发布过一个,额,还没有做过一个自己的APP

去年买的跑鞋,一次没穿

elance月费,就让他扣吧

我丢过去就走,不爬过去

有意义的一天

linode 和 dnspod 已经连续一星期给我发邮件提示博客有问题了。
cpu 超出200%,博客访问段时间中断。

登录服务器发现 php5-fpm 同时运行多个实例,占用cpu超过100%

查看最占资源的程序:

# top //找出CPU使用率高的进程PID
# strace -p PID //跟踪进程
# ll /proc/PID/fd //查看该进程在处理哪些文件

top 命令可以看到 多个 php5-fpm 实例在运行,每个都占用20%的cpu, 10个就是200%!
strace -p PID 跟踪进程,可以看到是正常的wordpress访问流程。不是文件被修改。

配置 php5-fpm:

https://github.com/rtCamp/easyengine/issues/184

/etc/php5/fpm/pool.d/www.conf
on your config it is set to
‘pm = dynamic’ change it to ‘pm = ondemand’
and uncomment ‘pm.process_idle_timeout = 10s;’.
Then restart php5-fpm

以上配置可以保证php-fpm不会长时间占用资源,但是请求多的话,还是会频繁开启进程。

查看站点 error_log 和 access_log 文件:

tail -n filename > newfile
其中 -n 的 n 为文件最后的几行,
结果重新定向到一个新文件newfile去。

tail -f 可以保持显示新加入到log中的数据

看到有一个ip访问频繁,平均一秒几次,不是人。

nginx block ip:

nginx block 以后,这个ip还在继续访问,log还在快速增加

ufw block ip:

sudo ufw insert 1 deny from 1.1.1.1

从防火墙屏蔽该ip,access_log增长速度骤降。

成效显著:

cpu usage

2015年1月16日更新:
这是wordpress的一个漏洞,据说已经被修复了,可是每天还是有不少ip在扫描。