关于 七月, 2011 的文章

介绍一下我的WordPress插件与优化历程

之前,在打算脱离CSDN的垃圾博客,建立一个私人的独立Blog时,我是毫不犹豫的选择了WordPress,因为它太出名了,加上周围很多朋友都用它并且没有一个人说它不好用,很多人甚至斩钉截铁的说,它就是最好的Blog,没有之一。

而当我第一次安装并使用它时,说实话我怀疑过,因为当时我还没理解到WordPress的架构,它其实就像是一个小的操作系统,仅仅具备一些最基本的功能,如果不安装一些插件和进行优化,是不如一些博客运营商的。

但是,如果你挑选到了你喜欢的皮肤,并对这个皮肤进行了美化,并安装了自己所需的插件,WordPress,毋庸置疑,就博客软件本身而言,要好过其它一切博客。

下面,我将介绍一下我所使用的WordPress插件与优化历程。
一、寻找一款皮肤
首先,我们得找到一个自己满意的皮肤,直接到WordPress官方网站去慢慢的,有耐心的寻找,这个过程并不容易,尤其是寻找一个支持中文很好的皮肤,大多数皮肤看起来不错,结果一旦用起来才会发现,变成中文字体后是那么的难看。
寻找了很久之后,发现免费的皮肤里,NeoEase是个非常不错的选择,但是,太多人使用它了,太多人了,我不想与他人重复,所以最后我放弃了寻找中文皮肤,找到了这款名为Fusion theme的皮肤,自己到“外观” - “编辑” 中去反复的调整字体类型,样式,大小和进行汉化,最终,完成了一个自己较为满意的皮肤,而这个中文皮肤,肯定是独一无二的。

二、SEO搜索引擎优化
毋庸置疑,博客的绝大多数流量都只有可能来自于搜索引擎,所以SEO是一项非常重要的工作。
我主要对其做了以下优化:
1. 将博客全部静态化为HTML
静态化的页面不仅能降低服务器压力,提升访问速度,同时也能更符合搜索引擎的喜好,而在寻找了一大圈之后,我发现,真正的全HTML静态化插件只有 cos-html-cache,像WP-Super-Cache这些其实都不是真正的HTML页面顶多算是缓存,cos-html-cache却是实实在在的为每篇文章生成了一个个HTML放在网站下面。具体使用方法网上资料有很多,这里就不多讲了,主要就是修改永久链接格式,创建目录并赋权,然后安装插件;
值得一提的是,因为是实实在在的生成了HTML页面,因此除非更新文章或删除这个HTML页面,否则它是永远都不会刷新的,主要表现在侧边栏的一些信息内容上,我是通过每周定时自动全部删除一次所有HTML页面的方式让它们保持更新的;
另外还有一点就是,静态化之后会有一个问题,就是它会保留上一个留言用户登录的cookie,所以在留言框上会一直看到一个类似“Welcome back mcsrainbow”这样的提示,要解决这个问题,只需在comments.php页面中删除对应的代码(通过搜索“Welcome back”找到相应的代码并删除)即可(通过“外观”-“编辑”)。

2. 生成利于搜索引擎引用的站点地图
通过Simple Google Sitemap XML这个插件,可以按照Google的喜好生成出一个站点XML,这个XML里面记录会记录所有文章,标签等的URL。

3. 向搜索引擎主动提交站点地图
我们并非一定要被动的等搜索引擎爬虫主动来收录我们的博客;
通过Google的Webmaster Tools,可以提交我们通过Simple Google Sitemap XML这个插件生成的XML,让Google立刻收录我们的博客,并在今后对我们的博客收录更新;
通过百度站长平台,可以安装“百度WordPress结构化数据插件”,来达到与Google相似的收录效果;
而对于其它的所有引擎,我们可以在robots.txt文件中添加如下所示内容来告之Sitemap的存放位置:
Sitemap: http://heylinux.com/sitemap.xml

4. 启用ping更新服务
通过启用ping更新服务可以主动告知搜索引擎我们的博客更新信息,很多人说没有实际效果,但有些人又说有,我觉得我们可以尝试加上。
我所使用的ping服务地址有如下(在“设置”-“撰写”中添加):
http://rpc.pingomatic.com/
http://blogsearch.google.com/ping/RPC2
http://ping.baidu.com/ping/RPC2

5. 优化robots.txt
在博客根目录下放置一个robots.txt的文件,可以让搜索引擎只收录指定的内容。
因为对于WordPress来说,有一些地址是不应该被搜索引擎索引的,比如后台程序、日志文件、FEED地址等,所以我们可以设置如下:
User-agent: *
Disallow: /wp-
Disallow: /feed/
Disallow: /comments/feed
Disallow: /trackback/
不过,在Google的管理员工具后台,可以看到Google似乎并不太喜欢Disallow的选项,因此大家可以考虑保留与否。

6. 防止垃圾留言评论
垃圾留言评论会影响Blog在搜索引擎中的表现,也是我们比较厌烦的东西,因此安装一个自动过滤垃圾留言评论的的插件非常有必要,我使用的是Akismet,它无需在留言时输入验证码等提高使用门槛的设置,而是通过类似于病毒库一样的原理进行智能识别,非常不错。

7. 其它细节
1)尽量直接使用顶级域名与根目录,例如heylinux.com,www.heylinux.com以及blog.heylinux.com等,避免使用heylinux.com/blog/这样的链接;
2)将文章中的<title></title>标签中的内容修改为 “文章标题 - 网站名称”这种文章标题在前,网站名称在后的格式;
3)将文章的<meta name="description" content="<?php echo $description; ?>" />中content的内容修改为截取每篇文章的前几百个字节,因为这些内容就是在搜索引擎中所显示出来的文章摘要,通常是通过在header.php中修改对应的$description = mb_substr(strip_tags($post->post_content),0,300); 来实现,不要直接用substr函数,它会导致在截取中文的时候出现乱码;
4)将网站的<meta name="keywords" content="<?php echo $metakeywords; ?>" />中content的内容修改为诸多与网站相关的关键词,以空格隔开,通常是通过在header.php中修改对应的$metakeywords的值即可,不过Google已经声称它不再注重keywords,其它搜索引擎则不太清楚;
5)尽量减少插件的数量,避免使用众多没有实际用途的插件。

三、增加网站分析
通过网站分析工具,我们可以对自己的网站访问信息有一个精准的了解,目前国内已经有了很多不错的网站分析工具,比如51.la这种,而且现在百度也有了,但个人觉得还是Google Analytics最为专业,也能够为Google的SEO加点分。通过Google Analyticator插件可以很方便的添加Google分析代码。

四、增加可视化的站点地图
通过新增一个页面,生成出一个可视化的站点地图,将所有的文章在一页中展示出来,有利于他人的浏览,我所使用的可视化站点地图插件为Dagon Design Sitemap Generator。

五、增强博客的编辑器
默认的博客编辑器很弱,很多高级功能都不支持,比如保留Word格式等等,我所使用的博客编辑器为TinyMCE Advanced,功能强大,并且可定制性很好。

六、加入代码高亮插件
对于我们这些IT民工来说,在网页上直接贴代码,贴口令,贴配置是我们的一项爱好,而通过一些代码高亮插件,可以让它们的可读性更好,我所使用的代码高亮插件是Syntax Highlighter and Code Prettifier Plugin for WordPress,使用方法为在HTML源码里将代码放在标签当中:<pre class="brush:[bash]">代码内容</pre>。

七、解决单双横杠等问题
WordPress会自动将双横杠“--” 替换为 单横杠 “-” ,这会对我们所贴入的代码造成很大的影响,而要解决这个问题其实非常简单,只需编辑wp-includes/default-filters.php文件将有wptexturize的行注解掉即可;
另外,将WordPress的表情功能关闭也十分有必要,否则在某些情况下我们会看到自己的代码里面奇怪的出现了一些笑脸等表情,它们实际上是把我们的一些代码给替换了(关闭方式为“设置” - “撰写”);
另外,在WordPress中,尖括号的配对会带来不少的麻烦,可能是因为尖括号是HTML源码中定义标签的原因,要解决其带来的问题,我们只有将所有左尖括号修改为实体编码“&lt;”来使用。

八、加入微博插件
在这个微博流行的时代,我们在博客上加上一个微博插件,可以提升网站的活力,和及时反馈我们发表在微博的内容,我所使用的微博插件为WP Microblogs,它可以同时支持很多网站的微博,并且展现出来的样式也比较好。

九、优化评论
优化评论的插件有很多,Get Recent Comments能够按照文章归类其下面所有的评论并展示出来,比一条条单调的评论要好一些;
其次,Wizzart - Recent Comments也不错,能够提供很漂亮的样式和隐藏作者回复的评论。
其它更多的评论嵌套和Ajax效果插件,大家可以根据自身喜好进行选择。

十、优化标签云
其实默认的标签云已经足够使用了,但是仍然有一些彩色标签云,3D标签云的插件吸引着我们,而我就选择了经过汉化改良的WP-Cumulus这款3D Flash标签云插件,尽管它会延缓我博客的打开速度,我还是舍不得去掉它,因为看起来实在是太酷了。

十一、加入相册
WordPress默认是没有相册功能的,NextGEN Gallery是一款非常棒的相册软件,不过像我这种IT民工还是更喜欢把照片放在QQ相册里面,因此安装了这个插件却一直没有使用过。

十二、禁用后台更新
WordPress常常有新版本发布,不过比较郁闷的是,如果贸然进行了升级,会造成很多个性化配置和插件等丢失和无法正常工作,因此,除非十分有必要,我觉得没有必要更新WordPress的版本号,尤其是小版本,而更新插件则是推荐的。所以我使用了Disable WordPress Core Update插件来禁用后台的WordPress版本更新提醒。

最后,如果大家有更好的插件需要推荐,和对某些插件的使用等等有一些心得或不明白的地方,欢迎一起留言讨论。

,

6 Comments

一次诡异的服务器网络问题处理

今天,出现一个很奇怪的问题,就是有一台服务器与其他服务器在传输文件的时候,速度只有50KB每秒,而之前则一直是10MB每秒,因为它们所处的网络环境相当于在同一个局域网里面。
鉴于只有这一台服务器有这个问题,因此对网络等一番检测之后,还是决定登录到该服务器上找一找系统方面的原因,最后,我们发现了是服务器网卡的自动协商功能被关闭了,在重新开启了之后,速度就恢复到以前了。

下面是相关的操作日志,供大家参考:
1. 查看 eth0 网络接口的参数信息
# ethtool eth0
----------------------------------------------------------------
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: Not reported
Advertised auto-negotiation: No
Speed: 100Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: off
Supports Wake-on: umbg
Wake-on: g
Current message level: 0x00000003 (3)
Link detected: yes
----------------------------------------------------------------
可以看到网卡的自动协商是关闭的: Auto-negotiation: off

2. 检查 eth0 网络接口的配置文件
vim /etc/sysconfig/network-scripts/ifcfg-eth0
结果发现该配置文件中存在以下一行配置信息:
ETHTOOL_OPTS="speed 100 duplex full autoneg off"
将其注释掉。

3. 开启网卡的自动协商功能
# ethtool -s eth0 autoneg on

4. 检查自动协商功能是否成功开启
# ethtool eth0
--------------------------------------------------------------
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: umbg
Wake-on: g
Current message level: 0x00000003 (3)
Link detected: yes
--------------------------------------------------------------
可以看到网卡的自动协商是开启的: Auto-negotiation: on

5. 检查确认服务器网络传输速度是否恢复
# wget speedtestsa.com/100_MB.BIN (具体需要下载的文件地址请根据实际情况进行设置)
--------------------------------------------------------------
--2011-07-22 01:52:18-- http://speedtestsa.com/100_MB.BIN
Resolving speedtestsa.com... 69.174.244.235
Connecting to speedtestsa.com|69.174.244.235|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 104857600 (100M) [application/octet-stream]
Saving to: `100_MB.BIN.8'
35% [=============================> ] 37,164,108 8.22M/s eta 13s
--------------------------------------------------------------
速度为8.22M每秒,已经成功恢复到了之前的状态。

最后,通过更进一步的了解,发现之所以之前关闭了网卡的自动协商并以强行以百兆模式运行,是想做一些网络方面的优化,但是在托管商更换或更新了交换机设置以后,交换机端的自动协商功能可能会与网卡的百兆模式无法成功匹配,因此造成数据传输问题。
其实这一类优化在目前来说,没有太大的意义,因为大部分的网络环境至少都是百兆,很多都已经是全千兆了。

1 Comment

分享一份在Linux上查看底层硬件信息的Perl脚本

首先,非常感谢一阵风大哥的无私奉献,通过他提供的脚本,可以非常清晰明白的看到系统的硬件参数信息。
如下图所示:

整个 Perl 脚本有 10870 行,因此就不直接贴在网页中了,大家有需要的可以直接点击此处下载:
http://heylinux.com/download/hwconfig.tar

下载之后,将脚本赋予执行权限直接运行即可:
# chmod +x hwconfig
# ./hwconfig

9 Comments

时隔4年,再次想起了Linux From Scratch (LFS)

LFS Project Homepage:
http://www.linuxfromscratch.org/lfs/
Linux From Scratch (LFS) is a project that provides you with step-by-step instructions for building your own customized Linux system entirely from source.

LFS中文用户组:
http://lfs.linuxsir.org/main/

时隔4年,再次想起了Linux From Scratch (LFS)。
当初因为在论坛听到一句话,“快速成为Linux高手,从零开始一步一步制作属于自己的Linux”。就冲动的花了几天几夜去做,最后Linux是做出来了,但自己却并没有特别大的收获。
原因是当初基础尚差,每一步基本上都是照着文档来做的,并没有花时间去理解那些步骤的原理和用途,没有去理解整个LFS项目的架构和设计思路,当然也就无法像预期那样真正理解Linux的操作系统的整体架构和诸多细节。
在最后,仅仅算是完成了文档中所规划出的那个Linux,如何将自己的个性思维融入进去,如何加入自己的名字、LOGO等,都没有学会,没有理解到。
因此,在经过了几年的磨练之后,自己又有了这样的想法,那就是再做一次Linux From Scratch,而这一次,自己会花更多的时间,去理解每一个过程,最后真正正正的制作出一个属于自己的Linux,加入自己的个性思维和设计,印上自己的名字和LOGO。
在完成之后,我会整理出一份学习心得,供大家参考。

3 Comments

通过 thread dump 分析找到高CPU耗用与内存溢出的Java代码

首先,要感谢我的好朋友 钊花 的经验分享。

相信大家在实际的工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况。
通常这种情况发生时,我们会认为这些问题理所当然的该由开发人员自己去解决,因为操作系统环境是没有任何问题的。

但实际上,我们是可以帮助他们的,效果好的话还可以定位到具体出问题的代码行数,思路如下:
1.通过对CPU与内存的耗用情况判断是否存在问题;
2.通过top命令找到可疑的线程的ID;
3.确认应用服务器的console信息的输出位置;
4.通过kill -3 ID 的方式获取thread dump信息;
5.备份console日志,并通过线程ID检查与代码相关的信息。

下面,我们开始具体的操作过程:

1.通过对CPU与内存的耗用情况判断是否存在问题;
判断CPU可以直接在top中查看CPU的 %us 数值就可以了,通常在50%以下都算正常,一旦超过60%甚至高到80-90且稳居不下,那么就肯定存在问题了;
判断内存时需要注意的是,直接看第一行Mem:的used数值是不准确的,因为通常在运行一段时间后,这个值都会非常大,这是因为Linux对内存的使用理念“内存就是拿来用的”,它会将空闲的内存尽可能的用于缓存,来提升性能,所以我们应该更多的参考 -/+ buffers/cache: 这一行的used数值,如果该值与第一行的used数值很接近且与内存总量相差很少的话,那么内存才算处于紧张的状态;
虚拟内存的耗用也值得参考,Linux只有在内存确实不够用的情况下才会大量使用虚拟内存,如果虚拟内存使用值为0或者100兆左右,那么可以确定物理内存尚且充足;
系统负载的数值也很值得参考,即top中的 load average,通常小于 1 代表非常良好,1-5之间代表正常,大于5 则表明系统处于负载的状态,超出的数值越大负载越大。

2.通过top命令找到可疑的线程的ID;
执行top命令,在这个Linux的“任务管理器”中输入大写的“H”来打开线程模式,然后所有线程会默认以CPU耗用高低排序;
如果想以内存进行排序,再敲入大写的“M”即可,其中“RES”看到的就是物理内存的耗用大小,但由于线程的共享内存原理,我们看到的每个线程的内存大小都和他们所属进程是一样的。

3.确认应用服务器的console信息的输出位置;
通常来说,应用服务器的console信息都会输出到log当中,比如Tomcat会输出到catalina.out文件中。
但jboss与weblogic就需要进行一些修改设置才行,其中:
jboss如果使用了官方的启动脚本,则需要修改启动脚本中的如下两行中的 /dev/null,将其改为指定的log文件位置,如 /opt/jboss_console.log,再重启jboss即可。
---------------------------------------------------------------------
JBOSS_CONSOLE="/dev/null"

JBOSS_CONSOLE=${JBOSS_CONSOLE:-"/dev/null"}
---------------------------------------------------------------------

weblogic则需要在console管理界面中的“域结构”-“环境”-“区域”-“服务器”-“AdminServer”-“日志记录”-“高级”- 勾选“已启动重定向标准输出日志记录”,再点击“激活更改”并重启weblogic即可。然后所有的console信息都会输出到logs目录下的AdminServer.log文件中。

4.通过kill -3 ID 的方式获取thread dump信息;
确认了应用服务器的console信息输出,并找到可疑的线程ID之后,执行 kill -3 ID 即可将该线程这一刻的所有thread dump信息输出到log当中。
建议多执行几次该命令,以便获取充足的信息。

5.备份console日志,并通过线程ID检查与代码相关的信息。
执行了thread dump信息输出之后,立刻使用cp命令备份log文件;
将log文件下载到本地,将进程ID换算成为十六进制,比如 29433 换算为十六进制就是 72f9;
打开log文件(建议使用UE或Notepad++等编辑器),搜索包含 72f9 的相关信息,然后仔细检查相关代码。

以我的实际情况为例:
下面这一段信息就包含了“nid=0x72f9”,表明与进程29433相关,所提到的 JIoEndpoint.java 则是实际的代码文件,后面的 442 则代表具体的行数。
---------------------------------------------------------------------
"http-0.0.0.0-80-78" daemon prio=10 tid=0x00000000686db800 nid=0x72f9 in Object.wait() [0x000000004cea6000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00002aab0bccd5b8> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416)
- locked <0x00002aab0bccd5b8> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:442)
at java.lang.Thread.run(Thread.java:619)
---------------------------------------------------------------------

到此,实际的工作才刚刚开始,需要开发人员仔细检查所有类似的信息,然后找出有问题的代码。

有资料说,thread dump 的作用其实还有很多,可以从中发现很多应用程序的运行问题,比如死锁等;且有一个Eclipse插件的可视化分析工具“lockness” 可以对该类日志进行更专业的分析。

No Comments