把空间从美国主机搬到香港主机上了,速度果然快很多

以前没觉得美国主机有多慢,用了一段时间后,觉得美国主机确实还是挺慢的,ping的时间是300ms,平均首页的打开时间在8s左右,有点难受啊,而且我的有些博文有代码高亮,js和css比较多,更是拖慢了页面相应速度,偶然的机会发现香港主机的ping只有30ms,顿时感觉神清气爽,然后咨询发现香港主机也是不用备案的(天朝有个世外桃源还真是好啊)!

当初买主机的时候就是想逃脱天朝的各种束缚,只知道美国主机不用备案,速度还过得去,压根儿没想到香港主机,以为没逃出天朝的国界,就还要备案,没想到香港主机居然不用备案的,速度好得出奇,跟普通内地的主机速度差不多了。当机立断,让戈戈主机帮我搬了家,好在我当初买空间的时候就已经把DNS解析转移到dnspod上了,所以这次把空间搬到香港主机上,只需要再dnspod里面把A记录设置成我的新主机IP即可,没过几分钟就全国生效了,在dnspod的网站监控里面可以但到各地速度明显提升了。页面打开的速度也提升了。

其实当初选择美国主机是没有理由的,因为我的博客是只给中国看的,网站又没有程序爬国外的网站,我也不需要FQ代理,所以没必要用美国主机的,用香港的主机就是很不错的选择,当然还可以选择亚洲的其他自由国度,比如新加坡、日本等,速度应该也还不错。

话说,网站的速度对网站的排名有一定影响的,现在我的网站在百度统计的测速里面,联通的速度很不错,页面打开时间 2.52 秒,比27.6% 的网站打开时间长;电信的速度也还行,页面打开时间 6.39 秒,比58.6% 的网站打开时间长(测试点:北京市 中国电信),比以前的成绩提升了一倍。以下是两张对比的数据:

美国主机的网站测速数据
美国主机的网站测速数据
香港主机的网站测速数据
香港主机的网站测速数据

源码解析之访问osgi felix bundle中的文件和资源

Apache Felix
Apache Felix

根据osgi规范中api的定义目前访问bundle里面的文件和资源的方法有三种。本文以felix框架为例,解析一下osgi中访问bundle里面的文件和资源的方法,以及各方法的区别。

一. Bundle.getEntry(String name)

该方法只能从当前的bundle jar中获得文件和资源(包括jar中的所有文件,比如*.class、META-INF\MANIFEST.MF等)。该方法的返回值为java.net.URL,在使用这个url的时候不能将其转成File类型来读取文件内容,因为这个url不是一个普通的文件操作系统中的url,而是osgi容器中的一个抽象的url,其文件读取操作必须交由创建这个url时设置的URLHandlersBundleStreamHandler来处理。所以如下的代码是不能获取到文件和资源的:

可以看到,从bundle中获取的entry的文件路径不是一个真实意义上的路径,它只是一个osgi容器才认识的url,要对这个url处理就需要用如下的方式,见示例代码:

接下来,从felix的源码中看看为何只能用下面的方式,这要从这个url是如何创建的来看了,在BundleImpl.getEntry(String name)方法中进行追踪,可以看到这个url是由BundleRevisionImpl.createURL(int port, String path)方法产生的,其代码如下:

在追踪下这个BundleStreamHandler,可以发现它是在Felix框架初始化的时候给默认设置的。如此就明了了。这个url对应的资源其实不能算是一个具体的文件,至少在Felix框架中不是,Equinox可能可以通过其他的方式来用文件方式来读取bundle中的资源,详见stackoverflow的一个question《No access to Bundle Resource/File (OSGi)》

二. Bundle.getResource(String name)

该方法的返回值也是URL类型的,其使用方法和Bundle.getEntry(String name)方法相同,也不能把url.getFile()当做文件名来创建File对象,只能用openConnection().getInputStream()来读取文件和资源的内容。

这个方法查找资源的方式和之前一篇博客《osgi类加载顺序源码解析》相似,在bundle没有解析时(即不处于resolved状态时),直接从当前bundle中查找资源;如果已经解析,就按照类加载的优先级,优先从其他bundle的classpath下查找这个文件或资源,如果有就返回;如果没有,才从本地bundle中查找并返回。(当然如果要共享某个bundle中的资源文件,就需要export这个资源文件所在的包,而且要使用这个资源的bundle也需要import这个包才行)。详见源码:

利用这一点,可以和getEntry方法搭配使用,达到游刃有余的控制资源共享的效果。

三. Bundle.getDataFile(String filename)

该方法是从felix cache的当前bundle的data文件夹下获取得文件和资源。这个data文件夹与felix cache的目录结构有关。默认情况下felix cache文件夹下会为每个bundle创建一个文件夹,文件夹的名称为bundle0、bundle1、bundle2。。。。bundleN,其中bundle0是系统bundle。每个bundle文件夹下又会为每个bundle的revision创建一个文件夹,文件夹名称的前缀为version(比如:version0.0),另外bundle文件夹下还有一个bundle.info的文件,描述了bunlde的信息(如果bundleId、被安装的bundle的jar文件路径、时间戳等)。如下图所示:

felix-cache目录结构
felix-cache目录结构

 

默认情况下,每个bundle目录下都没有data文件夹,getDataFile方法一旦被调用,就会在felix cache的当前bundle文件夹下,创建名为data的文件夹(如果没创建则创建之,如果已创建过,则跳过),该方法的参数是文件的相对路径,这个相对路径都是相对于当前bundle的data文件夹的;该方法的返回值是File类型,与上两个api不同,这个file是一个真实存在的文件,是可以通过file.toString()得到的url直接定位的。可以这样使用这个api:

这个方法相当于是提供了一个便捷的方式来存储和获取每个bundle下的数据。其源码其实最终的调用的BundleArchive类的getDataFile方法,源码如下:

 

综合使用上述的三个api就可以比较方便的读取bundle的资源了。另外还有getEntryPaths(String path)、findEntries(String path, String filePattern, boolean recurse)、getResources(String name)等一次性获取多个资源的api,还有便于读取menifest.mf文件的api:getHeaders()、getHeaders(String locale)等。

Goproxy代理-灵活的反向代理和静态资源代理

 

goproxy代理
goproxy代理

goproxy代理可以实时的让hosts文件的修改生效,而且对hosts文件的配置功能进行了增强,用起来会很有意思,(因为是用go语言写的,所以取名为goproxy)。先说说这个软件的来由:

做web开发的同学难免会碰到线上、线下、预发布、其他环境相互切换的场景,目前有两个方案:

  1. 方案一:直接在浏览器中把url中的域名改成指定环境的ip:port,回车直接访问。不过这个办法是有缺陷的,比如:你的web应用和样式都需要使用线下的环境时,你就不能通过修改浏览器的url来实现了,因为浏览器的url只能指定web应用的环境,html中的js和css还是使用的域名,当然,如果你不嫌麻烦,也可以修改web应用的源码来使js、css资源的域名改成ip:port。这个方式对于频繁切换环境的人来说无疑很痛苦。而且为了测试而修改了源码,在提交代码时,有会把测试代码提交到线上的风险。
  2. 方案二:在hosts文件中配置几套环境,用switchhosts软件来做几个环境的切换,配合firefox的dns flusher插件(点一下这个插件,可以让firefox立刻重新加载hosts文件),可以比较快速的切换环境。而且dns flusher可以实时查看当前的域名访问的ip是哪个。这个方案明显比第一个方案好很多。但是我使用这种方案很长时间,发现firefox打开页面的速度确实不如chrome,对于每天要刷新页面千百次的我,我甚至快忍受不了firefox的那么一点点慢。但是chrome有个致命的弱点,就是没有一个类似dns flusher的软件,让修改后的hosts文件立刻对浏览器生效。这导致喜欢chrome的同学,每次用hosts切换软件切换了域名绑定后,都只能把chrome关掉,然后重新打开,这样才能让修改后的hosts文件立即生效,好在chrome关闭和打开的速度很算过得去(firefox,估计想屎的心都有了)。

好吧,话归正题,我其实是想用chrome和switchhosts软件做到快速的切换环境,于是用golang开发了goproxy。(项目是开源的代码很简单,大家觉得比较麻烦的代码用golang两行就能搞定,详细使用文档请见项目主页:https://bitbucket.org/weager/goproxy)。

为什么要用代理?代理相当于是浏览器和最终的服务器之间的中转站,浏览器如果使用了代理,你就可以控制浏览器打开的所有页面的,既然chrome不能实时的读取hosts文件,那我可以让goproxy实时的读取hosts文件(其实是每次url访问经过goproxy时去检查一下hosts文件是否修改,修改了就reload一下)。这样每次需要切换环境只需要用switchhosts选择一套环境的hosts绑定,然后F5刷新chrome就可以了。其操作步骤比firefox+dns flusher+switchhosts还要少(dns flusher需要点击触发reload hosts文件)。

这只是一个基本的goproxy代理功能,其实goproxy还有更有意思的功能。下面来一一解读:

hosts文件中配置的映射一般都是把多个域名映射到一个ip上,如果把url前面的“http://”去掉的话,hosts里面的映射,其实就是前缀的替换,比如这个hosts配置:

127.0.0.1  www.1688.com

如果一个url去掉http://后为www.1688.com/index.html,那么映射后的url就为127.0.0.1/index.html。试想,如果我本地的环境端口号不是80,而是8080,怎么办?你能在hosts文件中配置成127.0.0.1:8080 www.1688.com吗?如果你用goproxy就可以这么配了。因为goproxy的原理就是一个前缀的替换,他的配置格式和hosts文件本身的格式非常类似,只是做了一点扩展。所以你可以这样配置:

127.0.0.1:8080  www.1688.com   search.china.alibaba.com   list.china.alibaba.com

127.0.0.1:8080/aaa/ddd   www.1688.com   search.china.alibaba.com/ccc   list.china.alibaba.com/bbb

(注意:路径的斜杠是向左的斜杠,不是windows里面的向右的斜杠。)

继续在url上做文章,上面的两行配置都是反向代理,那是不是也可以把静态资源给代理起来呢?goproxy也做到了,你甚至可以这样配置:

D:/workspace/work/style   style.china.alibaba.com/app/search

看到这个简单的配置,你会意识到你装的apache、varnish可以卸掉了吧

既然代理的功能可以自己定制,那功能应该可以再多一点,比如:对某个前缀的url添加或者删除参数。比如下面的配置:

127.0.0.1:8080    www.1688.com     +debug=true   +begin=2    -n=y  -version

110.20.30.41:8080    www.1688.com     +debug=true   +begin=2    -n=y  -version=2

第一行配置的意思是:如果一个url的前缀是“www.1688.com”,那么就给这个url的参数中添加debug=true和begin=2(如果已经有了begin=1,则会被覆盖成begin=2,debug参数也同理),并移除n=y和version参数(无论version的值是什么,被移除的参数在url中时才移除,不在url中则不作修改)

第二行配置与第一行配置的不同是,移除version参数的条件必须是version的值等于2。

这种些看起来很奇特的配置在hosts中显得很另类,好在现在的浏览器对这种他们看不懂的映射配置直接忽略,只读取他们认识的配置,所以你可以在hosts文件中配置正常的和不正常的配置,正常的配置对没有使用代理的浏览器依然有效,不正常的配置则不会影响浏览器的工作。

目前goproxy我自己一直在使用,用得很爽,也有其他人在用,评价是很轻量级,如果你偏爱goproxy的简单强大的配置功能,那么做web开发切换环境时,可以考虑试试goproxy。当然goproxy不仅仅用于chrome,任何浏览器都可以可以配置代理指向goproxy所在机器的ip和端口号(默认是8000端口),欢迎交流。

wordpress必备插件

wordpress
wordpress

wordpress真不愧是世界上最好用的免费博客程序,它有很好的扩展性,这些扩展性使任何人在它上面修改代码、开发插件。当然一般不需要我们自己开发插件了,很多非常优秀的开源爱好者已经开发了众多好用的wordpress插件,有了这些插件可以帮助我们更好的管理博客和写博文,下面介绍下我觉得靠谱的wordpress必备插件供大家参考:

  1. Akismet:可以避免万恶的评论机器人来骚扰你的博客。如果你每天进入后台仪表盘看到一堆垃圾评论需要处理是多么头痛的事情,而且很多垃圾评论填写的链接是违法或者不文明网站的,这会导致你的网站不能通过google adsense的审核。使用Akisment可以挡住绝大部分的垃圾评论。
  2. Captcha:让自己的博客拥有验证码的功能,避免别人恶意的添加评论和试探管理员密码。这个验证码功能很有意思,都是简单的算术题,而且是中文和阿拉伯数字混搭的。
  3. Limit Login Attempts:对于管理员登录来说,captcha插件只能简单的避免一些简单的攻击,如果稍微靠谱的攻击者都能比较容易的识别出验证码的,所以为了避免暴力破解管理员密码,需要让登录错误次数超过一定次数后,几分钟内屏蔽该用户。这个插件就能解决这个问题。
  4. Crayon Syntax Highlighter:搞IT的同学,这个插件是必不可少的,它有非常好用的代码高亮、折叠、展开、复制等功能。在我的这篇博文《[破除迷信]java.util.ArrayList在foreach循环遍历时可以删除元素》中可以看到效果,要想秀出你的代码就果断装上这个插件吧。
  5. Google Analytics for WordPress:站长都会很关注自己的博客流量情况,当然百度是不能指望了,这方面还是得用google analytics,装上这个插件,就只需要配置一下google analytics上的账号,然后设置下js代码的在网页的位置即可,不用自己手动的添加代码。装好了以后就可以上google analytics上看网站的流量情况了,而且可以在google网站站长工具里看搜索、索引和收录数据。
  6. Google XML Sitemaps:每次写了博文总是希望搜索引擎能尽快收录自己的最新文章,那就需要及时的提交sitemap给各大搜索引擎,这个插件可以在你发布新博文的时候自动生成sitemap并提交给google、bing等搜索引擎,同时可以配置哪些页面的url需要生成到sitemap中,很好用。
  7. JiaThis分享工具:有时我看到好的文章就有分享到微博或者收藏的冲动,那对博主来说,博客的社会化分享的功能是不能少的,有很多定制化的方案,在JiaThis网站注册账号后,还可以看到自己的博客分享的数据统计信息。JiaThis分享工具插件就是一个适合中国人的社会化分享插件,推荐使用。
  8. Quick Adsense:相信很多人博主都有用google广告赚钱的想法,如果你的博客积累了一定的文章和流量,那上google广告是指日可待的,配置google广告是需要插入一段js代码的,用Quick Adsense可以方便的管理所有的广告以及广告在博客中出现的位置和个数。如果你打算用google的广告,或者其他广告(什么阿里妈妈、百度推广等,只要是添加一段script的都行),相信这是不二的选择。
  9. WordPress Importer:天下哪有不散的宴席,博主与虚拟主机或者vps的关系也常有破裂的一天,或许是流量太大了需要升级,或许是价格太贵了有了更便宜的主,也或许是主机太烂了老是超负荷导致响应速度慢,所有这些导致了搬家在所难免,这时候你会想念搬家公司的,WordPress Importer就相当于是个博客的搬家公司,你可以方便的导出和导入博客数据。
  10. WordPress SEO:为了能有更多多的人能在搜索引擎中搜索到你的博文,就需要在博客的seo上做做功课,这个插件可以在写博客的时候帮助博主更好的让自己的文章更符合seo的要求,里面功能比较多,根据seo的原则进行配置,如果每篇博客都认真在seo上下功夫,相信我等苦心人会有好果子吃的。
  11. WP-UTF8-Excerpt:一般wordpress安装后首页的文章都是整篇整篇的,一连25篇,太长了,导致首页的加载速度很慢,内容与每个单独的博文页面有重复seo效果也不会太好,所以在list页面尽可能使用摘要展示的效果是很有必要的。WP-UTF8-Excerpt可以较好提取文章开头的部分文字作为摘要,使用起来很方面,几乎不需要配置。
  12. WP Image Protect Lite:现在知识产权对于搞技术的还是挺在意的,尽管有开源,但那也有个license啊,技术博文被转载也需要有个转载链接链回来,作为流量回报(毕竟大家都喜欢原创和原创的人)。文章可以有转载链接,但是图片被转载后恐怕一般不会有转载链接了,所以这时候就需要有图片水印了,在你的图片上打上自己的防伪标识(一般打上自己的博客地址),让盗用你图片的人自动的帮你宣传你的博客。这个插件可以在不修改你原有图片的情况下为每章图片打上水印,而且可以随时修改水印的字体样式,很不错。
  13. WP Lightbox 2:写博文的时候,往往上传的图片会偏大,如果原样在博文中展示图片就太夸张的挡住了左右的导航和widget,如果缩小就看不清楚了。如果弄一个缩小版的图片,点击后打开原图,又显得体验不好。WP Lightbox 2可以很好的解决这些困惑,它可以让你的博文中缩小版的图片在不刷新页面的情况下用幻灯片的形式浮出展示,嗯,谁用谁知道。
  14. WordPress Related Posts(目前发现此插件引入的一个js会拖慢页面加载的速度,不推荐使用,建议用百度推荐、友荐或者无觅推荐+Quick Adsense搭配使用)在文章的底部增加相关文章,而且相关文章还可以配置样式主题,功能全,这也是在站点内部增加内链的很好的方式。
  15. Add Post URL在文章的末尾增加本文的copyright声明,有利于保护自己的版权,让转载的朋友可以直接把你的博文链接也一并转载过去,一方面方便了转载博文的朋友,另一方面也有利于增加博客和博文的外链。(可以参考我的每篇博文的末尾)
  16. WP Super Cache:这是一个把博文缓存成html的工具,它可以大大加快wordpress的响应速度,因为服务器不用执行整页的php程序、查询很多次的数据库了,它把整个页面缓存成一个静态html页面,直接由apache代理,速度飞快,而且不占用cpu,同时你也可以设置更新时间,让页面也动起来。
  17. Baidu Sitemap Generator:在我朝的某些时候亲爱的谷歌会抽疯似的被强,此时我们还是不得不使用百度来搜索,当然某些场景还是用百度来得直接,所以从百度来的流量还是不容忽视的,为了让百度爬虫能更好更及时的爬到自己的页面,就需要一个专门给百度的sitemap,这个插件正好可以帮我们解决百度sitemap生成的问题。我用着还不错。
  18. WordPress ping Optimizer:ping是基于XML_RPC标准协议的更新通告服务,用于博客把内容更新快速通知给搜索引擎,以便搜索引擎的爬虫及时进行抓取和更新。WordPress ping Optimizer可以很好的提供这方面的功能,并进行了一定的优化,让你的博客的ping不会在每次保存的时候都触发。
  19. WPJAM 七牛镜像存储:我的博客是用的虚拟主机,性能不高,博客中很多静态文件,图片、js、css等,这些文件往往还比较大,如果都放在虚拟主机上,那页面相应速度就会偏慢,WPJAM七牛镜像存储插件可以一键实现 WordPress博客静态文件CDN加速,解除后顾之忧(注意:保存远程图片 这一项不要勾,很可能会导致外站图片无法显示)。
  20. 多说追求最佳用户体验的社会化评论框,为中小网站提供“新浪微博、QQ、人人、豆瓣等多帐号登录并评论”功能。“多说”帮你搭建更活跃,互动性更强的评论平台,功能强大且永久免费。安装非常方便,直接在“安装插件”里面搜索“duoshuo”即可。
  21. 无觅相关文章插件利用数据挖掘的技术,智能匹配相关文章,并以图片形式展示。和友言、百度推荐等类似,但是他可以推荐其他网站的文章,增加相关性。安装也比较方便,直接在“安装插件”里面搜索“wumii”即可找出这个插件。
  22. PHP Speedy WP通过对多个js、css文件进行合并和Gzip来加速网站页面的加载速度,同时在http header中添加了一个过期时间,保证js、css更新能被立刻感知。

以上的插件,直接用插件名称,在wordpress的“插件”–>“安装插件”中搜索即可找到对应的插件,然后直接安装即可,安装后最好检查下页面的是否有问题,如果有问题则可能是插件与你已经安装的插件或者wordpress有版本兼容性问题了,好在我的博客中,以上的这些插件都工作得很好,别以为装了这么多插件,会拖垮博客,其实速度一点都不受影响,因为wp super cache已经缓存了页面,php speedy wp对页面的js、css加载有起到了加速作用,所以网站速度适中保持非常的高效。如果大家有比我使用的插件更好用的插件,欢迎丢砖。自打我用了这些插件后,腰不酸了腿不疼了,连走路都有劲了~~(有钱的同学可以donate一下这些插件的开发者,毕竟他们一直维护和增强着这些插件)

Reference 

开启WordPress的Gzip压缩为博客提速

网站的响应速度会从多个角度影响网站的UV和PV。对于一个十秒钟都打不开的网页超过七成的网民都会选择放弃打开;响应速度慢也会降低了网站在搜索引擎中的权重,谷歌搜索就会考虑网站的响应速度,响应速度快的排名会靠前一点,因此网站应该尽可能的使用各种办法来提升网站的响应速度。在不改变网页内容的前提下,最简单的提升响应速度的方式就是开启apache的gzip压缩功能,减少网络传输的字节,缩短下载时间。

对主机在国外的站长来说,博客站点的响应速度往往不尽如人意,使用gzip的效果则特别明显。我的博客主机就在美国,就我使用gzip压缩的经验,《osgi类加载顺序源码解析》这个页面的大小从原来的148193字节降低到20608字节,下载时间从原来的1s~2s缩短为180ms~250ms,速度几乎提升了5到10倍。

在开启apache gzip压缩功能前,最好先检查一下自己的博客是否已经开启了gzip压缩功能,可以用站长工具来检验自己的博客。如果没开启(默认的cpanel没有设置gzip压缩的功能),请先用chrome的“开发者工具”中的“网络”功能记录下一个页面html的大小和下载时间(注意不是延迟时间),然后登录cpanel,在cpanel的“网络优化”中选择“压缩被指定的多用因特网邮件扩展(标准)类型”,并在输入框中输入指定的类型,我填的是“text/html text/plain text/xml”,如果你的js、css也没有被压缩,就填成“text/html text/plain text/xml text/css text/javascript”,然后保存设置,再使用站长工具来检验是否真正开启了gzip功能,当然在html请求的http响应头里面应该也可以看到“Content-Encoding:gzip”,到此你的博客应该变快了吧。