November 15, 2006
清理scuttle 的垃圾书签
无论是blog系统,还是论坛,经常都充斥着要命的spam,各种类型都有。extmail.org上的scuttle很早前就已经开始遭殃。后来发现这些注册的家伙可能是通过程序注册的,所以加了个安全认证码的东西,注册要输入认证码,后来好了一段时间,最近又跑来一大堆spam信息。无奈!
于是花了半小时写了个垃圾脚本(无奈啊,连接到服务器好慢,网通与电信之间的距离永远是那么遥远...)干掉这些spam。
详细的脚本:
run.sh:
#!/bin/sh
MYSQL="mysql -u root -pyourpassword"
die() {
echo "Usage: $0 user_id"
exit 255
}
[ -z "$1" ] && die && return 1
./get_bookID.sh $1|$MYSQL|grep -P "\d+" > "$1"_bID.txt
./list_cateID.sh $1|$MYSQL|grep -P "\d+" > "$1"_id.txt
./del_id.sh $1|$MYSQL
rm -rf $1*.txt
get_bookID.sh:
#!/bin/sh echo "use app_bookmark; SELECT bID from scBookmarks WHERE uID='$1';"
list_cateID.sh:
#!/bin/sh
echo "use app_bookmark;"
for bid in `cat $1_bID.txt`;do
echo "SELECT id FROM scCategories WHERE bId='$bid';"
done
del_id.sh:
#!/bin/sh
echo "use app_bookmark;"
for bid in `cat $1_bID.txt`;do
echo "DELETE FROM scCategories WHERE bId='$bid';"
echo "DELETE FROM scBookmarks WHERE bId='$bid';"
done
其实可以合并写在一起,不过无所谓,反正能用就拉倒了。没空折腾。反正有了这个烂得掉渣的小脚本,以后看见谁不顺眼干掉谁。哦,忘记了,还得禁止这些家伙的id。实在以后要再泛滥,发书签时也得加认证码?!
Posted by hzqbbc at 08:39 AM | Comments (1)
October 08, 2006
解决IBM thinkpad笔记本恢复系统时报“Product Recovery 无法恢复系统”之类的错误
昨天我的IBM 本子无缘无故在改了系统内存偏重于系统缓存后,就报“lsass.exe 终结点格式无效“的错误,无论如何都修复不了。于是只好进入一键恢复(Thinkpad rescue and recovery)里恢复,可是到了最后要format c盘的步骤时,居然提示”Product Recovery 无法恢复系统”之类的错误,晕倒!
上网查了不少论坛的帖子,其他人都是can't not find xxx module,引起的原因大多是因为分区超过3个。而我的机器分区没超过3个(不算隐藏分区),如何是好?
回忆了一下,昨天自己曾经做过的事情,就是用ghost 备份过系统,难道因此就有问题?那IBM这个RnR软件就太糟糕了吧,后来又想起在做ghost前,我将c盘根目录下的IBMtools及IBMshare等目录都删除了,会不会这个RnR系统需要检测这些文件?
为了证实这个猜测,我进入winxp里,将做好backup的这些目录(一共1.5GB+之多!)复制到c盘,然后再重新启动,进入RnR里,重新进行系统恢复,这次居然没有报错!看来真的是这个问题哦!
但是为什么它需要扫描这些文件呢?那如果我的系统都烂了,文件都丢失了,检测不到这些目录就不许恢复系统,那还要这个一键恢复有何意义?难道要先format掉c盘再进入RnR就可以恢复系统了吗?这个方法还没测试过。。找个时间测试吧。郁闷...
Posted by hzqbbc at 08:29 AM | Comments (1)
September 17, 2006
Acrobat + MS word + HyperSnap = 文档利器
昨天下载了Mantis 中文手册(西西辛苦所著pdf版,感谢!),高兴之余发现里面的图分辨率实在很低,很难看清楚,顿生重新做一次这个手册的念头。于是凑齐HyperSnap和Acrobat 5.0 及ms word,测试了一下截图、生成pdf等功能,为重做手册准备。
但是做下来发现了几个问题:
PDF生成后,里面的图片分辨率低,和西西所做一样,看不清,痛苦
不知道如何截取需要滚屏的网页或应用程序,对于大篇幅的图毫无办法
后来经过摸索,并得到了bdwy的帮助后,解决了问题。方法也很简单:
PDF图象清晰度问题
在word里要输出pdf,可以选择打印==> Acrobat Distiller,然后点Distiller的属性==>Adobe PDF设置==>转换设置那,将默认的CJKScreen换成Press,那么页面分辨率就从可怜的600dpi改为2400dpi,输出的pdf图象质量将大为改善。
截滚屏图形的方法
在HyperSnap ==> 捕捉==>捕捉设置==>捕捉==>窗口捕捉时自动滚屏(勾上即可)
然后保存,选一个需要滚屏的网页,然后按ctrl+shift+w,此时点一下鼠标左键,然后HyperSnap就会自动的滚屏,一直滚到底。到底后再点一次左键即可完成捕捉。回到HyperSnap的界面里,图象就全部抓下来了,至于需要取部分内容者,只需要进行裁减即可,非常方便。
以后做ExtMail的使用手册时,都可以用这几个软件搭配了!:-)
Posted by hzqbbc at 03:01 PM | Comments (1)
Acrobat + MS word + HyperSnap = 文档利器
昨天下载了Mantis 中文手册(西西辛苦所著pdf版,感谢!),高兴之余发现里面的图分辨率实在很低,很难看清楚,顿生重新做一次这个手册的念头。于是凑齐HyperSnap和Acrobat 5.0 及ms word,测试了一下截图、生成pdf等功能,为重做手册准备。
但是做下来发现了几个问题:
PDF生成后,里面的图片分辨率低,和西西所做一样,看不清,痛苦
不知道如何截取需要滚屏的网页或应用程序,对于大篇幅的图毫无办法
后来经过摸索,并得到了bdwy的帮助后,解决了问题。方法也很简单:
PDF图象清晰度问题
在word里要输出pdf,可以选择打印==> Acrobat Distiller,然后点Distiller的属性==>Adobe PDF设置==>转换设置那,将默认的CJKScreen换成Press,那么页面分辨率就从可怜的600dpi改为2400dpi,输出的pdf图象质量将大为改善。
截滚屏图形的方法
在HyperSnap ==> 捕捉==>捕捉设置==>捕捉==>窗口捕捉时自动滚屏(勾上即可)
然后保存,选一个需要滚屏的网页,然后按ctrl+shift+w,此时点一下鼠标左键,然后HyperSnap就会自动的滚屏,一直滚到底。到底后再点一次左键即可完成捕捉。回到HyperSnap的界面里,图象就全部抓下来了,至于需要取部分内容者,只需要进行裁减即可,非常方便。
以后做ExtMail的使用手册时,都可以用这几个软件搭配了!:-)
Posted by hzqbbc at 03:01 PM | Comments (0)
August 20, 2006
配置Mediawiki支持短URL
为了美化URL,今天花了巨多时间在这个看似简单又讨厌的问题上面。中午觉也没有睡。首先来个惯例的Step by step 安装步骤吧。
1.下载mediawiki
由于测试机是php4.3.9,为了不麻烦,偷懒用了个1.6.8的版本,支持php4.x
2.解包
tar xfz mediawiki-1.6.8.tar.gz
mv mediawiki-1.6.8 /var/www/extsuite/mediawiki
3.设计站点URL
计划要用http://wiki.extmail.org来访问整个wiki,因此所有的http://wiki.extmail.org/index.php?title=article_title 需要影射成为http://wiki.extmail.org/article_title
4.参考
http://meta.wikimedia.org/wiki/Using_a_very_short_URL
注意这个链接访问不了,必须使用代理才能访问,在这里,感叹一下我们的自由是多么脆弱。一点小小信息都不能看,Damn it :-(
5.实施
Apache的虚拟主机配置:
ServerName wiki.extmail.org
DocumentRoot /var/www/extsuite/mediawiki
Options MultiViews
AllowOverride None
Order allow,deny
Allow from all
Options FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ /index.php?title=$1 [L,QSA]
Options MultiViews
AllowOverride None
Order allow,deny
Allow from all
# avoid execution of PHP scripts in upload directory
AddType text/plain .php
AddType text/plain .phps
chmod a+w config
然后访问http://wiki.extmail.org/config/
配置完毕,生成数据库后:
mv config/LocalSettings.php .
配置LocalSettings.php
正常默认就是下面:
$wgScriptPath = "";
$wgScript = "$wgScriptPath/";
$wgRedirectScript = "$wgScriptPath/redirect";
然后修改下面:
$wgArticlePath = "$wgScriptPath/$1";
include "extensions/GeshiHighlight.php";
6.配置使用/wiki/的方法
希望访问wiki 的url为http://www.extmail.org/wiki/xxx
1-5的步骤略去。给出apache 的配置:
ServerName www2.extmail.org
DocumentRoot /var/www/extsuite/html
Alias /mediawiki /var/www/extsuite/mediawiki
Alias /wiki /var/www/extsuite/mediawiki/index.php
Options MultiViews
AllowOverride None
Order allow,deny
Allow from all
Options FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ /index.php?title=$1 [L,QSA]
LocalSettings.php:
$wgScriptPath = "/mediawiki";
$wgScript = "/wiki";
$wgRedirectScript = "/wiki/redirect";
$wgArticlePath = "$wgScript/$1";
include_once("extensions/GeshiHighlight.php");
唯一的缺点是在登陆或退出时,URL是http://www2.extmail.org/wiki?title=xxx&xxxx=xxx
因为apache配置里将/wiki => index.php了,所以wiki?参数就和index.php?参数一致了。嘿嘿。
Posted by hzqbbc at 05:02 PM | Comments (0)
August 06, 2006
IPtables 规则错误导致DNS查询失败之解决办法
受朋友之托,检查其主机上的iptables规则引起的dns问题。主要现象是打开了如下的规则后,squid就不能正常的查找主机的ip地址,dns解析试销。
# Generated by iptables-save v1.3.4 on Sun Aug 6 11:28:42 2006 *nat :PREROUTING ACCEPT [293:39183] :POSTROUTING ACCEPT [5:299] :OUTPUT ACCEPT [5:299] COMMIT # Completed on Sun Aug 6 11:28:42 2006 # Generated by iptables-save v1.3.4 on Sun Aug 6 11:28:42 2006 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [949:834012] -A INPUT -p tcp -m multiport --dports 21,25,80,81,110,143,3128 -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT -A INPUT -p udp -m udp --dport 53 -j ACCEPT #-A INPUT -p udp -m udp -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec --limit-burst 10 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m state --state INVALID,NEW -j DROP -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j DROP -A INPUT -p udp -m udp -j DROP COMMIT # Completed on Sun Aug 6 11:28:42 2006
当屏蔽了上述规则中#-A INPUT -p udp -m udp -j ACCEPT 的规则后,squid就无法正常工作了。在机器上用nslookup 查询主机名 + 外部dns ip,发现timeout,应该是udp包无法发送到对方的dns服务器53端口。
后来man了一下iptables,发现可以用LOG来记录ip包的情况,于是打开log,增加了如下的规则集:
-A INPUT -j LOG -p udp -m udp --log-prefix "DNS monitor: "
重新启动iptables,在/var/log/message里看到如下信息:
注意这里的SPT=53 DPT=33036,检查一下规则发现放行的是目的地53口,没有发行源端口(即sport),估计问题在这里,于是增加一条记录:
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
重新启动后,正常了。看来,没有log的帮助还一时搞不明白为什么。也怪平时没仔细研究iptables,嘿嘿,通过这次也受到教训了:-)
Posted by hzqbbc at 12:01 PM | Comments (3)
February 25, 2006
Server Push blocked by Compress - 压缩模式不能实现Server Push
Server Push并不是什么新技术,而是一种老技术。早年Netscape就提出了Server Push的技术,通过HTTP 内容类型 multipart/x-mixed-replace 来标识。
但由于Netscape被迫退出市场后,IE一直没有支持这样的特性,所以想基于真正的Server Push 技术开发web 即时通信软件的梦想一直不能获得完美实现。
目前一般的Server Push实现大多是由一个长效执行的cgi程序,将变更的信息发送到客户端浏览器,此时需要此cgi程序及web server支持unbuffer,即能在任意时刻在与客户端建立的连接这个流中传递信息,并不进行缓冲。这样客户端可以即时收到信息。
过去在DMS(Damail System)中实现的无刷新进度条就是使用类似的技术。
最近重新收拾了一下过去的实现,发现居然不能用了!什么原因?
经过检查和对比,才忽然发现,原来自己的web server 打开了内容压缩(gzip,deflate)的功能,难怪怎么都无法即时获得server端的输出。
由于deflate/gzip输出必须事先获得全部的输出信息,因此web server强制性的等待cgi程序执行完毕之后,才将cgi的输出结果进行压缩,并发送到客户端。
因此客户端将一直处于“阻塞”状态,得不到任何数据。
以后得小心这个问题,或者利用apache的deflate模块里提供的功能,对于特定的后缀才进行压缩,对于cgi程序不压缩。否则Server Push就被Blocked 了 :-)
相关的一些Link:
http://home.netscape.com/assist/net_sites/pushpull.html
Posted by hzqbbc at 06:37 PM | Comments (3)
December 14, 2005
openSSH + SecureCRT HOWTO - 如何整合openSSH和SCRT
openSSH/openSSL 是现在最流行的开源软件,保护着数百万的Linux, BSD, Unix主机。而历来商业的SSH server/Client 对openSSH/openSSL的支持都不是太好,在windows下的客户端SecureCRT要支持openSSH总是有这样或那样的不足。
要么,用SecureCRT(简称SCRT)生成的公钥/密钥,然后将公钥放到openSSH Server上去,可以支持SCRT利用证书登陆到openSSH server上,但如果从另一台使用openSSH client的机器要登陆到这个openSSH server,却死活都通不过。
要么,用openSSH 生成的公钥/密钥,则安装openSSH client的机器要连接过来毫无问题,但SCRT却通不过。
为了这个问题琢磨了很久,后来在SecureCRT的官方论坛里,有人提到SecureCRT自4.0以来,已经可以支持openSSH的key了。于是怀着试试看的心情,将SCRT升级到4.1,重新做了一下配置,成功了!
实现了openSSH server + SCRT/openSSH Client 的组合,以后无论是win平台还是*nix平台,都可以方便的使用证书登陆了,实在解决了一个大问题。
How to implement?
以下简单描述一下如何配置与实现的。
配置openSSH server
以下是/etc/ssh/sshd_config的内容:
Port 22 Protocol 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key KeyRegenerationInterval 1h SyslogFacility AUTHPRIV LoginGraceTime 5m PermitRootLogin yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys IgnoreRhosts yes HostbasedAuthentication no PasswordAuthentication yes PermitEmptyPasswords no ChallengeResponseAuthentication no Subsystem sftp /usr/libexec/openssh/sftp-server
该配置允许使用证书或密码登陆,对于出差到外地但没带证书的情况就很有用了,如果想只使用证书,则将:
PasswordAuthentication yes
改为:
PasswordAuthentication no
利用ssh-keygen生成公钥/密钥
例如要生成用户hzqbbc的公钥/密钥,则先su 到hzqbbc用户,然后输入:
ssh-keygen -t dsa
ssh-keygen会提示文件的存放位置及密钥的加密字,按要求输入即可。以下是样例:
[hzqbbc@p4 .ssh]$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/hzqbbc/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/hzqbbc/.ssh/id_dsa. Your public key has been saved in /home/hzqbbc/.ssh/id_dsa.pub. The key fingerprint is: aa:0a:3c:be:7f:35:9b:4f:82:bf:1d:ca:0b:dc:bc:cc hzqbbc@p4
将id_dsa和id_dsa.pub复制到windows系统
在windows客户机上,建立C:\SSH目录,然后将id_dsa和id_dsa.pub原封不动的复制到C:\SSH里,确保文件名为id_dsa和id_dsa.pub
配置SCRT
请确认SecureCRT安装或升级到4.0以上,我目前使用的是4.1,然后开始配置。

第一步:打开要配置证书的主机名记录,选中主机名后,点图中红色方框的图标,进入该主机的详细配置界面。

第二步,Connection页中,Username填写要登陆的用户,该用户就是刚才创建证书的用户,这个必须注意。然后在Connection --> Authentication 中,Primary认证方法选PublicKey,并点开“Properties”。

第三步,选Use session public key ,意思是每个不同会话使用不同的证书,这对于管理大量主机的系统管理员较为有用。如果只是维护少量机器,可以考虑使用同一套证书。

Use identity file那里,打开“...”按钮,浏览我的电脑,找到C:\SSH目录,然后看到id_dsa和id_dsa.pub文件,选中id_dsa文件,然后确定,就可以看到路径为C:\SSH\id_dsa 了。

保存好配置,关闭SecureCRT,然后打开配置了证书的主机,正常情况下将提示要输入密钥的加密字,输入后就应该可以登陆进系统了。
同时再打开另一个SCRT窗口。登陆同样的主机,由于SCRT已缓存了证书及加密字,因此不再需要输入用户名密码,使用就很方便了!
Posted by hzqbbc at 01:13 PM | Comments (3)
October 21, 2005
SetEnv fail in Suexec - Suexec下setenv失效
有时候,最不起眼的问题却最耗时间。
早上10点多想起还没完成ExtMail的0.19 release中计划要增加的功能:per domain template , 于是开始动手。
本来是一个非常简单的功能,几行code就搞定,利用的是Apache等webserver的SetEnv,将特定信息导入环境变量中,谁知道怪事发生了。
在httpd.conf中,有如下的配置:
SetEnv EXTMAIL_TEMPLDIR "/var/www/extmail/newhtml"
可是在perl代码里,却死活没办法通过访问$ENV{'EXTMAIL_TEMPLDIR'}来获得这个值。
开始有点怀疑是不是自己写错了,查了一下Apache的docs,看看配置指令有没问题,可又没发现问题。又在google上到处搜索,甚至搜索到了perl的beginner 的邮件列表,可是所有有关的问题都几乎是一样的答案,通过SetEnv传递环境变量。
后来,忽然想起自己的extmail是工作在SuExec+SELinux双重保护的环境里,会不会因为这个原因导致了自定义的环境变量被屏蔽掉?
于是做了一个试验,关闭了Suexec,结果就成功了。于是还是老老实实的仔细看Apache手册的env模块,才发现了根源:
Some Caveats
It is not possible to override or change the standard CGI variables using the environment manipulation directives.
When suexec is used to launch CGI scripts, the environment will be cleaned down to a set of safe variables before CGI scripts are launched. The list of safe variables is defined at compile-time in suexec.c.
For portability reasons, the names of environment variables may contain only letters, numbers, and the underscore character. In addition, the first character may not be a number. Characters which do not match this restriction will be replaced by an underscore when passed to CGI scripts and SSI pages.
第二段就写得很清晰,“the environment will be cleaned down to a set of safe variables before CGI scripts are launched.”。
只怪当时心切没耐着性子看,当时也没联想到Suexec的问题。
知道这个问题的根源以后,设计又可以继续下去
Posted by hzqbbc at 02:32 PM | Comments (0)
October 20, 2005
Email threads algorithm - 邮件线索排序算法
很早以前,一些邮件客户端,例如Netscape 等就支持邮件的线索模式,在线索模式下,可以很有条理的阅读邮件.
邮件客户端becky我曾经使用了相当长的一段时间,原因之一就是因为它支持线索模式,这样可以很方便的查看与某些朋友的邮件来往,尤其是订阅了邮件列表后,每个话题及回复都看得很清晰。
不少线索排序都是使用jwz算法. 地址: message threading
根据jwz的介绍,jwz算法相当可靠,也许在不久的将来,邮件线索排序技术将用于Extmail :-)
相关的链接
- Mail::Thread
- Email::Thread
Posted by hzqbbc at 06:31 PM | Comments (0)
September 13, 2005
Protect files in Apache - 使用AUTH保护特定文件
最近一个web虚拟主机用户提出一个要求,需要保护其几个特定的文件,凡是访问那个文件必须提供用户名和密码,而且不能对其程序或文件进行修改。
例如http://www.vhostuser.com/secret/noallowfiles.txt
这个文件如果要保护的话,可以利用Apache的mod_auth及core模块中提供的
假设要保护某个secret目录的.doc文件,则可以在虚拟主机配置中增加:
<Directory "/path/to/vhost/home/secret/"> AllowOverride All </Directory>
然后在secret目录里,编辑.htaccess文件:
<Files ~ ".txt">
AuthType Basic
AuthGroupFile /dev/null
AuthName "Restricted Files"
AuthUserFile /path/to/secret/.htpasswd
<limit GET POST>
require valid-user
</limit>
</Files>
这样凡是请求xxx.txt的文件都会要求认证。密码就保存在.htpasswd里了。
这样做就不需要修改程序里,而且可以保护一些非程序文件。这是用一般的php/perl cgi程序等实现不了的。非常好用。
Posted by hzqbbc at 09:04 AM | Comments (0)
July 26, 2005
maildrop - Webmail dev problem - 解决了几个隐晦问题
这两天解决了几个开发中遇到的疑难杂症,特此篆文记录。
无论在软件项目的实施,还是系统的开发甚至只是编写一小段代码,经常会遇到一些让人白思不得其解的问题,耗费了大量的时间,用尽了办法却位能解决。感觉就有点得了疑难杂症,便访天下名医却不得根治一样。
但最后发现这些问题的症结,往往都是很小小的问题,却不为人所注意,或者隐藏得非常深入,常人难以发现。
Maildrop 的0x0B故障分析及解决
使用maildrop作为VDA/MDA的用户为数不少,绝大多数用户使用maildrop都是因为其过滤能力强,过滤语言灵活,支持Quota,并可与MySQL/LDAP及小型dbm对接,可外挂各种程序,如SpamAssassin,杀毒软件,甚至SMS等,实现复杂的功能。
但是maildrop常见的一个问题就是经常会遇到0x0B的意外退出问题。除了编译器(使用的Gcc c++版本问题)和编译优化指令太高(如高于O2等)的问题外,还有少数问题是不为人们所注意的。
在自己开发一个全新的webmail系统中,maildrop的投递uid/gid都是250,这样的配置跑了几年都没任何问题,工作得非常可靠。但是由于webmail需要直读Maildir,按常规的方法必须设置成setuid/gid程序,或将apache的User/Group设置成250,这样非常麻烦,尤其在新的SELinux下会造成诸多不便,为此使用了Suexec的配置,但是Suexec的RPM包默认UID_MIN >= 500,于是将user/group从250/250改成了1000/1000,结果问题就来了。
投递邮件时,maildrop死活都返回0x0B错误,无论我将user/group改成多少也好,包括mysql里的uidnumber/gidnumber、maildropmysql.config里的default等都改了,完全没有任何效果。
后来再试验su成uid=1000的用户呼叫maildrop发现也是0x0B错误,只有在root权限下没问题,于是又查了maildrop的INSTALL甚至看了source!都是无任何迹象显示与这个错误有关,于是只有google了。但也没什么有效的解决办法。
后来偶然看到一个法文的邮件列表上,看到有人在讨论maildrop的mysql配置,忽然想到,自己的maildrop rpm包自动设置了/etc/maildropmysql.config文件属性是uid=250, gid=250的,于是ls -l /etc/maildropmysql.config一看,原来症结就在这里!
我改了所有该改的地方,就是没有对配置文件的owner/group进行修改,而配置文件原本的属性是600,这样导致了maildrop换成其他uid/gid运行时无法读取配置文件,导致了0x0B错误。执行:
chown -R 1000.1000 /etc/maildropmysql.config
之后一切问题就迎刃而解了。
Webmail解决setuid/gid问题
昨天正在着手解决全新设计的webmail系统setuid/gid的问题,以适应在SELinux下的应用。自己怕麻烦,暂时不想去做相应的policy,所以只有动脑筋了。
幸好RHEL/CentOS/FC3等自带的policy都支持suexec,因此就决定利用suexec来实现与apache不同的运行uid/gid,以达到直接访问Maildir的目的。
在虚拟主机中的配置:
..... SuexecUserGroup vuser vgroup Alias /extmail/ /var/www/cgi-bin/extmail/ <Location "/extmail/cgi"> SetHandler cgi-script Options +ExecCGI </Location> .......
注意: 之所以将cgi程序放到/var/www下是因为Suexec的docroot限制在了这里,详细的suexec编译参数可以通过Suexec -V查看,以下是CentOS 4.1的结果:
-D AP_DOC_ROOT="/var/www" -D AP_GID_MIN=100 -D AP_HTTPD_USER="apache" -D AP_LOG_EXEC="/var/log/httpd/suexec.log" -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin" -D AP_UID_MIN=500 -D AP_USERDIR_SUFFIX="public_html"
最后,将程序及模板等属性全部改为要运行的uid/gid即可:
chown -R vuser.vgroup /var/www/cgi-bin/extmail
重新启动httpd,通过/var/log/httpd/suexec.log可以看到如下的信息:
[2005-07-26 20:55:51]: uid: (1000/vuser) gid: (1000/1000) cmd: folders.cgi
证明配置成功,这样webmail就不必再设置为setuid了,而且apahce也不必以1000/1000的id来运行了。
chdir()引起的模板问题之解决
开发Webmail时,引入了模板机制,这将大大提高了用户修改的便捷程度,也缩短了开发人员的工作周期。但是这几天遇到了一个问题,在调用了Storage::Maildir模块之后,模板的解析就无论如何都不正常了,总说file not found,但明明文件没有任何错误。
而如果先于呼叫Storage::Maildir之前解析模板则完全没问题,开始怀疑是SELinux的问题,但kernel日志里又无任何不妥。
后来通过一点一点分析,包括对template解析库的修改等都印证了各种代码都没有问题。最后将目光放到了Storage::Maildir,该模块在use的时候会利用chdir()初始化当前工作路径,这样做之后,将使cgi程序的工作路径和之前不同了,对于没使用绝对路径进行模板解析的应用,自然会遇到问题。
代码分析:
my $tpl = Ext::Template->new("../html/");
my $mm = Ext::Storage::Maildir;
$tpl->assign(TEST => 1);
restore_path(); # XXX recover working directory
$tpl->process("index.html");
$tpl->print;
....
sub restore_path {
my $src=$ENV{SCRIPT_FILENAME};
$src=~s#(.*)/[^\/]+$#$1#;
chdir($src);
}
上述代码中,在进行模板解析之前,呼叫restore_path(),将工作路径恢复到调用Storage::Maildir之前的原始状态。这样解析就不再有问题了。
Posted by hzqbbc at 09:18 PM | Comments (0)
July 22, 2005
Apache under SELinux - 让Apache跑得顺起来!
对于刚使用Redhat Enterprise Linux4 或Fedora Core 2以上/CentOS 4的用户,一定会为Apache经常无法正常运转,报以"Permission denied"等错误而大为不解,甚至大为恼火。
其实这是因为这些系统里激活了SELinux,而用户的apache配置与SELinux的配置策略有抵触产生的,只有通过适当调整,使apache的配置和访问符合策略才能正常使用。
现在下面来分析一下SELinux中有关httpd(apache)的context定义(略有删节)
/home/[^/]+/((www)|(web)|(public_html))(/.+)? system_u:object_r:httpd_user_content_t /var/www(/.*)? system_u:object_r:httpd_sys_content_t /var/www/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t /usr/lib/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t /var/www/perl(/.*)? system_u:object_r:httpd_sys_script_exec_t /var/www/icons(/.*)? system_u:object_r:httpd_sys_content_t /var/cache/httpd(/.*)? system_u:object_r:httpd_cache_t /etc/vhosts -- system_u:object_r:httpd_config_t /usr/sbin/httpd -- system_u:object_r:httpd_exec_t /usr/sbin/apache(2)? -- system_u:object_r:httpd_exec_t /usr/sbin/suexec -- system_u:object_r:httpd_suexec_exec_t /var/log/httpd(/.*)? system_u:object_r:httpd_log_t /var/log/apache(2)?(/.*)? system_u:object_r:httpd_log_t /var/log/cgiwrap\.log.* -- system_u:object_r:httpd_log_t /var/cache/ssl.*\.sem -- system_u:object_r:httpd_cache_t /var/cache/mod_ssl(/.*)? system_u:object_r:httpd_cache_t /var/run/apache(2)?\.pid.* -- system_u:object_r:httpd_var_run_t /var/lib/httpd(/.*)? system_u:object_r:httpd_var_lib_t /var/lib/php/session(/.*)? system_u:object_r:httpd_var_run_t /etc/apache-ssl(2)?(/.*)? system_u:object_r:httpd_config_t /usr/lib/apache-ssl(/.*)? -- system_u:object_r:httpd_exec_t /usr/sbin/apache-ssl(2)? -- system_u:object_r:httpd_exec_t /var/log/apache-ssl(2)?(/.*)? system_u:object_r:httpd_log_t /var/run/apache-ssl(2)?\.pid.* -- system_u:object_r:httpd_var_run_t /var/run/gcache_port -s system_u:object_r:httpd_var_run_t /var/lib/squirrelmail/prefs(/.*)? system_u:object_r:httpd_squirrelmail_t /usr/bin/htsslpass -- system_u:object_r:httpd_helper_exec_t /usr/share/htdig(/.*)? system_u:object_r:httpd_sys_content_t /var/lib/htdig(/.*)? system_u:object_r:httpd_sys_content_t
针对上述的内容,可以对如下的几个常见问题进行简单处理:
1.phpmyadmin在非默认/var/www/html目录下无法运转
通常类似的情况都是在配置了虚拟主机时,访问/phpmyadmin等提示403访问拒绝,日志里也提示Permission denied,这是因为phpmyadmin防止的目录及文件本身属性不符合context要求。
假设phpmyadmin放在/web目录下,那么执行:
chcon -R -t httpd_user_content_t /web
则会令/web及其下所有子目录/文件,包括phpmyadmin文件都获得了httpd_user_content_t的属性,如果其传统的Unix属性对httpd来说是可读的话,再重新访问一下就应该可以了。
2./home目录下的虚拟主机无法运转
与问题1也是类似的,不过根据上文中context的定义,/home目录下必须是用户的$HOME/www或public_html或web目录才是httpd_user_content_t类型,因此建议将要作为web页面的内容放置在用户的$HOME/www或web或public_html里,并确保其属性是httpd_user_content_t,使用如下命令查看:
ls -Z /home/abc/ drwxr-xr-x abc abc user_u:object_r:user_home_dir_t tmp drwxrwxr-x abc abc user_u:object_r:httpd_user_content www
如不是,则可通过chcon来逐级目录及文件更改,直至最后能访问:
chcon -R -t httpd_user_content_t /home/abc/web chcon -t user_home_dir_t /home/abc
3.CGI程序无法运行
如果cgi程序放在/var/www/cgi-bin/里也无法执行,遇到403或500错误的话,可以检查cgi程序的属性,按SELinux contexts文件里定义的,/var/www/cgi-bin/里必须是httpd_sys_script_exec_t 属性。通过ls -Z查看,如果不是则通过如下命令更改:
chcon -t httpd_sys_script_exec_t /var/www/cgi-bin/*.cgi
如果是虚拟主机里的cgi,则参考问题2使之能正常使用普通的功能后,再通过chcon设置cgi文件的context为httpd_sys_script_exec_t即可。
4.Setuid/gid 程序无法运行
例如早期的SqWebMail及qmailadmin等,需要setuid/gid的支持,但在SELinux下这将受到严格限制。第一种方法是比较彻底的办法,能保留系统的安全性,通过:
audit2allow -l -i /var/log/messages
将SELinux拒绝的信息转换为相应的policy allow指令,将这些指令添加到SELinux policy 的src里相应的配置文件,重新生成policy并加载。但这样做相对比较麻烦。
另一个方法最简单,但将使apache得不到保护。首先确定SELinux 类型是targeted的:
cat /etc/selinux/config|grep SELINUXTYPE
然后,使apache脱离SELinux保护:
setsebool -P httpd_disable_trans 1
然后重启动apache:
/etc/init.d/httpd restart
这样所有apache强制的检查都失效,需要setuid/gid的程序可以正常使用。但这样带来了增加漏洞的危险,对于迫切需要运行而又很急的情况,本方法是一个最大限度减少系统安全缺失的最后办法。对于取消SELinux 未必是一个好方法。
Posted by hzqbbc at 10:02 PM | Comments (0)
July 18, 2005
SYN attack - 遭遇SYN攻击
曾几何时,Linux系统还被追捧为安全性较好的系统,很多系统管理员为自己管理的Linux服务器很少被攻击成功而感到自豪。但步入新的Internet年代,各种各样的攻击逐步盯上了Linux,而TCP/IP网络固有的缺陷也被Cracker大肆利用。
很不走运,手下管理的多台Linux服务器也遭到了不同类型、不同程度的攻击,包括SYN攻击,CLOSE_WAIT攻击,抢占资源(如web的连接等)等等。如果是那些少量ip组成的大规模攻击,一般情况下封ip就能比较好的解决问题了。
如果是DDOS就更难办了。这两天,有2台服务器遇到了大规模的SYN_RECV DDOS攻击。主要是针对web的,导致了web访问缓慢并停止服务,甚至机器失去了响应。要对付SYN攻击,得从多个方面入手,如果是分布很广的攻击,还得从交换机、路由器等更高一级的层次进行杜绝。
下面是应付这几天攻击的基本方法:
1)SYN cookie
在linux下以root权限执行:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
这个方法打开了syncookie功能,但实际效果几乎感觉不到。
2)增大backlog
通过增加backlog的数值,可以一定程度减缓大量SYN请求导致TCP连接阻塞的状况,一般这个数值系统默认是1024,实验增加到1280~2048:
echo "2048" > /proc/sys/net/ipv4/tcp_max_syn_backlog
这样在强度不是很高的攻击下,系统响应能力提高了一点。
3)缩短retries次数
Linux系统默认的tcp_synack_retries是5次,将这个数值减少可以提高系统响应能力,实验改为2次:
echo "2" > /proc/sys/net/ipv4/tcp_synack_retries
修改后,SYN_RECV的数量有了少量减少,系统响应也快了一些。
4)限制SYN频率
上述的几个方法实际效果并不理想,尤其是DDOS攻击基本无效,目前比较有效的是对SYN的频率和次数进行限制,这样最大限度的控制了单个IP地址发动攻击的能力。
例如将SYN请求的次数限制在30次每分钟,系统默认是5次/秒,显然太高,同时将burst从默认的5个降低到2个。
/sbin/iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -m \ limit --limit 30/m --limit-burst 2 -j ACCEPT
注意: 该命令在shell下输入,'\'符号表示续行。
进行此操作后,对正常的用户而言无任何感觉上的差异,而并发的SYN请求量下降了不少,服务响应基本正常了。
5)封锁IP/IP段
对于某些单独IP的DOS攻击,封ip简单有效,方法也非常容易:
/sbin/iptables -A INPUT -s a.b.c.d -j REJECT
为了大规模快速的封IP地址/段,我写个小脚本:
#!/bin/sh
IPSRC=`cat ip.txt`
for i in $IPSRC;do
/sbin/iptables -A INPUT -s $i -j REJECT
done
在ip.txt里保存如下格式的ip地址段:
211.95.208.0/24 219.78.190.0/24 4.7.220.0/24 68.163.195.0/24 211.162.165.0/24 ......
结束语
虽然采取了种种手段,但是攻击依然没停止过,上述的方法只是减弱了攻击的影响,但却不能彻底解决问题。除了利用IPTables外,还可在应用软件层做一定的连接频率,连接数等限制,例如Apache有一个mod_limitipconn模块就可以实现类似功能。Posted by hzqbbc at 12:46 AM | Comments (1)
July 14, 2005
Webdav - ideal share protocol - Webdav简介
WebDAV(Web-based Distributed Authoring and Versioning)是一种基于 HTTP 1.1协议的通信协议.它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可直接对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。
Microsoft windows2000/XP及IE, Office还有Adobe/MicroMedia的DW等都支持Webdav,这又大大增强了Web应用的价值,以及效能。对于需要大量发布内容的用户而言,应用WebDav可以降低对CMS系统的依赖,而且能够更自由的进行创作。上传、下载变得轻松自如。
有关Webdav的信息主要集中在Webdav 资源站:http://www.webdav.org
用该站一句话来概括Webdav,可以表述为:
配置Apache,体验WebDav
介绍再多不如亲自体验一下,到Apache官方网站,找到mod_dav的文档,简单的配置了一下即可实现最基本的Webdav 服务端了。首先要确保激活mod_dav及mod_dav_fs模块,即在httpd.conf保证有:
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
<IfModule mod_dav_fs.c>
# Location of the WebDAV lock database.
DAVLockDB /var/lib/dav/lockdb
</IfModule>
如果用的系统自带apache的rpm包的话,默认就已经安装并配置好mod_dav了。只需要针对具体的目录进行一下配置即可使用。
在httpd.conf增加如下一段配置内容:
Alias /webdav /usr/local/webdav
<Location /webdav>
Dav On
AuthType Basic
AuthName DAV
AuthUserFile /usr/local/webdav/.htpasswd
<LimitExcept GET OPTIONS>
Require valid-user
</LimitExcept>
</Location>
然后创建/usr/local/webdav目录,注意一点,这个目录必须对apache是可写/可读的,所以需要更改owner:
mkdir -p /usr/local/webdav chown -R apache.apache /usr/local/webdav
最后增加授权用户,用htpasswd程序生成即可。
htpasswd -c /usr/local/webdav/.htpasswd test
连续输入2次test即可生成一个test用户,密码是test的。
然后重启apache。
客户端配置
这里以最常用的Windows 2000/XP为例。Windows 2000/XP等已内置了Webdav的支持,能实现方便的web文件夹功能。打开“网上邻居”,左边菜单里点击“添加一个网上邻居”,在“键入这个快捷方式要打开的网站、FTP站点或网络位置的地址”中输入Webdav 服务器的URL。在本例里,使用的URL是:
http://www.hzqbbc.com/webdav

将url填进去后,并完成提示就可以了。访问该Web文件夹时必须输入刚才生成的用户名和密码,这时在网上邻居里就出现一个网络文件夹图标,可以象常规的文件夹一样进行拖、拉操作。感觉方便极了。再也不用烦琐的使用ftp或cms来操作。
如果希望IE也能使用Webdav的文件夹,则在菜单->打开->勾选“以Web 文件夹方式打开”并输入URL即可。
上载时和web ftp差不多:

Useful links
http://www.webdav.org/http://www.webdav.org/other/faq.html
IETF WebDAV Quota
http://jakarta.apache.org/slide/
http://www.carrel.org/2005/03/31/mod_dav-quota-patch-redux/
http://webdav.todo.gr.jp/download/
http://pretender.blogdriver.com/pretender/389261.html
http://httpd.apache.org/docs-2.0/mod/mod_dav_fs.html
http://httpd.apache.org/docs-2.0/mod/mod_dav.html
http://www.needful.de/docs/projekte/webdav-quota/
http://www.geocities.co.jp/Hollywood/4471/webdav/webdav.html
http://mailman.lyra.org/pipermail/dav-dev/2001-March/002132.html
http://lists.samba.org/archive/samba/2004-February/081614.html
Posted by hzqbbc at 10:40 AM | Comments (1)
June 25, 2005
Netcraft Web server 6月报告:Apache遥遥领先IIS
在lighttpd邮件列表上看到有一个讨论讲到lighttpd的普及问题,刚好里面引用了netcraft 最新的6月份web server统计报告。于是阅读了一下该报告,发现Apache服务的站点超过4500万个,而IIS仅有1300万,真是令人振奋!
而其他的web server,如Netscape Enterprise和Zeus则比Apache和IIS少了一个数量级,只有180万和58万左右。
在统计列表里,不可忽视的是Thttpd排到了前10名!
Resin 也比Lotus Notes要前,还有各种各样的web server占据着分额非常小的市场。我比较看好的lighttpd还显得很稚嫩,只有不足2000个站使用。
看样子lighttpd还要好好努力啊。
Netcraft网站上有近10年来的web server的市场分额统计和分析,回首10年前(1995年),那个时候还是NCSA 和CERN的天下。技术的发展十分迅速,真的有点“江山倍有人才出”的感觉。
关于Netcraft的全部报告请看:
http://survey.netcraft.com/Survey/Reports/0506/
http://survey.netcraft.com/survey/Reports/9508/ALL/
Posted by hzqbbc at 11:57 PM | Comments (1)
May 29, 2005
基于PowerPC的嵌入式Linux - 好书介绍
在读大学的时候,我曾非常热衷于嵌入式,还在自己的机器及实验室的机器摆弄了一个仿真环境,跑起了Uclinux和另一个针对Motorola M68K的仿真环境。由于时间久远,现在都忘记是叫什么了,只记得当时艰苦奋斗了几个星期,终于让仿真器跑起来,垮平台编译成功,并将ROM“烧”(其实应该说是download到仿真环境里吧)到仿“硬件”里,看着嵌入Linux启动的信息,到最后显示的提示符,真的是激动不已!
那个小Linux系统还只能实现十多个基本的系统命令,啥也不能干,但也足够玩好久了。但最可惜的是当时一来缺钱,没钱买硬件开发板,没钱买任何实验的东西,二来没什么好的参考资料,虽然英文的一堆,但是都不系统,要自己吃力的摸索,加之嵌入这一块只是业余小小爱好,忙着做毕业的东西,后来就荒废了,甚为可惜。

前两天在书店除了看到介绍过的《Web性能优化》一书外,还无意看到一本我能让我有所注意的嵌入Linux的书--《基于PowerPC的嵌入式Linux》,由北航出版社出版的。这本书引起我注意的地方,并不是高深的技术,而是详尽而平实的内容,按步就班的讲述了一些基本原理,实验环境的建立,移植,以及方方面面的东西。并不是一般嵌入式书籍将内容一堆砌,啥也没说清楚就结束的感觉。一个比较深刻的印象就是实用,从初学者的角度来评价,就是经过模仿书本里的东西,成功率稍高。
基于PowerPC的嵌入式Linux一书简介
本书详细地介绍了如何打造一个完整的嵌入式Linux,主要内容包括: Bootloader定制、Linux内核定制、Linux Rootfs定制、Linux守护进程定制、Linux设备驱动编程、Linux编程、实时Linux扩展等。同时本书结合PowerPC芯片,介绍了PowerPC芯片的基本结构、配置引导以及开发方法。本书的特点是注重实用,每篇内容都有具体的实例供参考。读者阅读了本书后,能够快速地在嵌入式PowerPC平台上运行起嵌入式Linux操作系统,开始系统的设计和研发。本书可供PowerPC和嵌入式Linux研究、开发及应用技术人员参考,也可作为高等院校计算机专业及Linux领域的师生的教学参考书。
前言(经删节)
自1991年Linux操作系统发表以来的10年间,Linux操作系统以令人惊异的速度迅速在服务器和桌面系统中获得了成功。它已经被业界认为是未来最有前途的操作系统之一。并且,在嵌入式领域,由于Linux操作系统具有开放源代码、良好的可移植性、丰富的代码资源以及异常的健壮,使得它获得越来越多的关注。据近日Gartner Dataquest和Electronic Engineering TimesAsia联合进行的调查报告,大约有32 %的工程师选择了VxWorks,21.4 %的工程师使用Linux操作系统。在未来,大约有34 %的工程师打算使用VxWorks,而29 %的工程师打算使用Linux。PowerPC是Motorola、 IBM和Apple公司联合开发的CPU芯片,如今由于PowerPC良好的架构、优秀的性能以及稳定的兼容性,使得PowerPC在各个领域都获得了广泛的运用。Motorola公司的PowerPC处理器早已广为人知,其在全世界通信处理器市场上处于无可争议的领袖地位。迄今为止,它已经向全球350多家客户销出了1亿多只通信处理器,并赢得了5000多项设计合同,其中大部分归功于它的PowerQUICC处理器系列。Gartner Dataquest在2002年5月公布的一份报告中说,Motorola公司在通信处理器集成电路市场上的占有率排名第一,占据74.7 %的市场份额。不仅仅是在通信领域,PowerPC在服务器和桌面领域也取得了巨大的成功,IBM使用PowerPC604s组建巨型计算机(例如深蓝),Apple公司使用G3、G4组建个人多媒体电脑。
PowerPC是Linux较早支持的芯片之一,Linux对PowerPC有成熟、优秀的支持。Linux不仅已经在IBM的S390服务器及Apple公司的Macintosh个人电脑上运行多年,而且在嵌入式PowerPC芯片(Motorola和IBM公司都有嵌入式PowerPC产品)也已经有了成功的案例。虽然目前关于如何在嵌入式PowerPC平台上运行Linux的资料不少,但是都不成系统,并且非常简单。本书是一本介绍如何在嵌入式PowerPC平台上运行Linux的所有必需知识的集合,并且结合实例讲解如何使用Linux开发一个完整的产品。通过阅读本书,读者将有能力运用嵌入式PowerPC平台开发一个完整的系统。
本书的特色如果用一句话来概括本书的特色,那么这句话应该比较贴切:在PowerPC开发板上把Linux运行起来,《基于PowerPC的嵌入式Linux》是一本完全实例化的书籍,它Step by Step地指导读者在PowerPC开发板上运行Linux,并且实现一个二层交换机的开发实例。
《基于PowerPC的嵌入式Linux》的目的是让读者能够:了解PowerPC的基本结构和MPC8xx的常用知识;在PowerPC开发板上运行Linux系统;了解Linux引导的知识;了解inetd守护进程的知识,将ftpd服务器、telnetd服务器、www服务器移植到PowerPC开发板中来;了解编写Linux模块的知识;了解编写Linux 设备驱动的知识;了解如何定制一个实时Linux的知识;了解建立一个完整的嵌入式产品的知识。
作者曾经阅读过许多嵌入式系统开发的书籍,它们有许多是非常优秀的,而且很有实际参考价值。然而,由于嵌入式系统的多样性,这些作者的硬件环境和开发工具读者可能没有,大多数作者在书籍的代码和实例也不一定适合读者的需要,或者说在读者的硬件开发板上无法运行和调试。特别是当读者寻找Linux在嵌入式系统中的运用时,目前大部分相关书籍还是概念型且没有具体实例,在看完这些书籍以后,读者依然无法在其硬件开发板上运行Linux。
本书将不一样,它是一本Step by Step的实例化编程的书籍,几乎涉及了Linux所有的重要知识,并且有许多代码和实例能让读者充分了解如何从零开始,将PowerPC版本的Linux移植到自己的PowerPC开发板中去。
.......
在编写本书之前,作者以前一直很好奇: Linux是如何引导和启动的?那些神秘的/etc、/sbin和/var目录是起什么作用的?Linux的配置文件是如何组织的?网络守护进程是怎么回事?在阅读了这本书后,读者将一清二楚。
本书所有的内容都将结合实例,而且光盘中带有源代码,所以本书几乎涵盖了所有嵌入式Linux所需要了解的内容。
......
读者可以学到什么
如果读者是一位嵌入式系统的软件开发人员,或者是一位硬件开发人员,或者是一位产品管理者,正在准备关注嵌入式Linux在自己的系统中的应用,那么《基于PowerPC的嵌入式Linux》将是一本很好的开发实例的书籍。
如果读者是一位产品管理者,将可以了解:
Linux的简介,它的优缺点(当然,部分也许是作者的偏见)。
Linux在嵌入式系统中应用的优缺点。例如,在产品上市时间、产品开发的难度及系统的稳定性等方面与商业RTOS开发套件的比较。
如果读者是一位产品开发人员,将可以了解:
Motorola公司的PowerQUICC处理器;
如何创建一个PowerPC交叉编译和调试开发环境;
如何为PowerPC产品定制Linux引导程序PPCBoot;
如何定制PowerPC版本的Linux内核以适合自己的开发板;
如何创建一个小型的Root文件系统;
如何在PowerPC系统上引导Linux内核和系统;
如何定制实时嵌入式Linux内核;
如何在嵌入式Linux上编制网络设备驱动程序。
......
致谢
我的同事们张月亭、金叶、蔺杰和沙明也参加了本书的编写,在此对他们表示衷心的感谢。
作者
2003年10月
目录
第1章 目标产品和开发简介 1.1 二层交换机简介1 1.2 硬件系统简介2 1.3 软件系统简介2 1.4 嵌入式Linux系统开发简介3 1.4.1 主开发机/开发目标和交叉编译3 1.4.2 用户交互4 1.4.3 Linux Image结构布局5 1.5 开发流程6 第2章 Linux系统简介 2.1 Linux系统的特点8 2.2 什么是嵌入式系统10 2.3 Linux嵌入式系统简介和可行性分析11 2.3.1 引导内核的Bootloader12 2.3.2 Linux内核12 2.4 实时Linux系统14 2.4.1 MontaVista Linux和TimeSys Linux16 2.4.2 RTLinux16 2.4.3 RTAI17 第3章 PowerPC处理器 3.1 Motorola公司的PowerQUICC通信处理器18 3.1.1 MPC8xx19 3.1.2 MPC826021 3.2 MPC850芯片简介24 3.2.1 概述24 3.2.2 MPC850 功能列表24 3.2.3 主要模块简介27 3.3 MPC850配置和复位34 3.3.1 系统接口模块SIU34 3.3.2 系统配置和保护34 3.3.3 SIU编程35 3.3.4 复位39 3.4 存储控制器44 3.4.1 基本结构44 3.4.2 GPCM和UPM片选编程机制相同之处46 3.4.3 基地址寄存器BRx48 3.4.4 配置寄存器ORx50 3.4.5 存储器状态寄存器MSTAT52 3.4.6 控制器A/B模式寄存器MxMR53 3.4.7 存储器命令寄存器MCR54 3.4.8 存储器数据寄存器MDR55 3.4.9 存储器地址寄存器MAR56 3.4.10 存储器周期时钟预分频寄存器MPTPR56 3.5 外部中断异常57 3.5.1 中断机制58 3.5.2 中断优先级58 3.5.3 中断处理流程59 3.5.4 SIU中断登记寄存器SIPEND60 3.5.5 SIU中断掩膜寄存器SIMASK60 3.5.6 SIU中断触发形式寄存器SIEL61 3.5.7 SIU中断向量寄存器SIVEC62 3.6 MPC850通信处理器CPM62 3.6.1 功能63 3.6.2 通信处理器CP64 3.7 GE850EH开发板79 3.7.1 GE850EH开发板功能简介79 3.7.2 硬复位配置字80 3.7.3 内部寄存器起始地址81 3.7.4 GE850EH的时钟81 3.7.5 Flash ROM82 3.7.6 SDRAM83 3.7.7 BM8024 二层交换芯片84 3.7.8 以太网口84 3.7.9 UART串行口85 第4章 嵌入式Linux开发工具ELDK 4.1 ELDK简介86 4.2 安装ELDK88 4.3 删除ELDK89 4.4 配置使用ELDK89 4.5 从零开始编译ELDK90 4.6 其他交叉编译环境90 4.7 GNU 系列编译工具简介91 4.7.1 GCC91 4.7.2 ld93 4.7.3 ldd93 4.7.4 nm93 4.7.5 ar93 第5章 移植PPCBoot到GE850EH板 5.1 PPCBoot简介94 5.2 获得源代码95 5.3 解开源代码95 5.4 PPCBoot源代码简介95 5.5 配置编译PPCBoot98 5.6 移植PPCBoot到GE850EH开发板中去98 5.6.1 了解GE850EH开发板99 5.6.2 建立自己的移植目录和文件100 5.6.3 修改Makefile文件101 5.6.4 修改ppcboot/include/configs/ge850eh.h 文件101 5.6.5 修改ppcboot/board/GE850EH/config.mk 文件110 5.6.6 修改ppcboot/board/GE850EH/ge850eh.c 文件111 5.6.7 修改ppcboot/board/GE850EH/flash.c 文件115 5.6.8 修改ppcboot/include/commproc.h 文件116 5.7 编译PPCBoot117 5.8 安装、运行PPCBoot到GE850EH开发板上去117 5.8.1 使用BMD/JTAG调试工具安装PPCBoot117 5.8.2 使用已有的安装Bootloader的程序安装PPCBoot119 5.8.3 使用已在GE850EH板上运行的PPCBoot安装PPCBoot120 第6章 在GE850EH开发板上运行Linux 6.1 获得Linux内核源代码121 6.2 Linux内核简介121 6.2.1 Linux 引导121 6.2.2 RAMDISK和Initrd122 6.2.3 MTD122 6.2.4 JFFS2文件系统123 6.3 配置编译Linux内核123 6.4 将Linux内核移植到GE850EH开发板中去124 6.4.1 确认linux/Makefile文件124 6.4.2 修改/linux/arch/ppc/configs/ge850eh_defconfig文件125 6.4.3 修改/linux/arch/ppc/config.in文件133 6.4.4 增加/linux/include/asmppc/ge850eh.h 文件133 6.4.5 修改/linux/include/asmppc/processor.h文件134 6.4.6 修改/linux/include/asmppc/mpc8xx.h文件134 6.4.7 修改/linux/arch/ppc/8xx_io/commproc.h文件134 6.4.8 增加/linux/drivers/mtd/maps/ge850eh.c文件135 6.4.9 修改/linux/drivers/mtd/maps/Makefile文件136 6.4.10 修改/linux/drivers/mtd/maps/Config.in文件136 6.4.11 修改/linux/drivers/char/flash_config.c文件136 6.5 编译Linux kernel for GE850EH137 6.6 从GE850EH开发板上引导Linux内核137 6.6.1 基本的环境变量137 6.6.2 从Flash 引导Linux内核137 6.6.3 环境变量和Linux内核引导参数141 6.6.4 网络bootp引导Linux内核142 6.6.5 bootp命令143 6.6.6 bootargs引导变量144 6.6.7 bootm命令144 6.6.8 引导一个完整的Linux系统145 6.6.9 Flash中的Rootfs146 6.6.10 网络NFS的Rootfs146 第7章 Rootfs和RAMDISK 7.1 千变万化的RAMDISK150 7.1.1 一个C库150 7.1.2 一个用户交互的Shell151 7.1.3 一个工具集151 7.1.4 一个Telnet服务器151 7.1.5 一个FTP服务器151 7.2 创建不使用Busybox的RAMDISK152 7.2.1 建立RAMDISK Image文件152 7.2.2 给RAMDISK建立文件系统152 7.2.3 建立必需的Linux目录153 7.2.4 /dev目录153 7.2.5 /lib目录156 7.2.6 NSS157 7.2.7 /etc目录158 7.2.8 /bin和/sbin目录160 7.2.9 生成最后的RAMDISK Image文件161 7.2.10 减小体积161 7.3 基于glibc的Busybox161 7.3.1 获得Busybox的源代码162 7.3.2 配置Busybox162 7.3.3 编译Busybox165 7.4 创建使用Busybox和glibc的RAMDISK166 7.5 测试制作的RAMDISK167 第8章 inetd 和 telnetd、ftpd、httpd网络进程 8.1 inetd网络守护进程171 8.1.1 获得inetd的源代码172 8.1.2 给inetd源代码打patch173 8.1.3 编译inetd173 8.2 login守护进程173 8.3 telnetd守护进程174 8.4 ftpd守护进程175 8.5 boa webserver175 8.6 insmod rmmod176 8.7 安装inetd、login、insmodtelnetd、ftpd、boa webserver进程177 第9章 Linux字符设备驱动——LED驱动实例 9.1 Linux设备驱动概述180 9.2 Linux Module183 9.2.1 一个Linux Module例子(Intel 版本)183 9.2.2 PowerPC版本的Module例子185 9.2.3 Linux Module的机制185 9.2.4 Module和Application的区别186 9.3 主设备号和次设备号190 9.4 file_operations数据结构191 9.5 GE850EH开发板LED字符设备驱动(PowerPC版本)193 9.5.1 GE850EH LED硬件配置193 9.5.2 源代码分析194 9.5.3 编译LED设备驱动195 9.5.4 测试LED设备驱动196 9.5.5 GE850EH开发板LED设备驱动程序源代码197 9.5.6 LED模块Makefile文件205 9.6 I/O端口205 9.6.1 申请/释放I/O区域206 9.6.2 避免编译器优化I/O访问206 9.6.3 I/O端口大小207 9.7 优化问题207 第10章 二层交换芯片BM8024设备驱动 10.1 BM8024简介208 10.2 功能列表208 10.3 BM8024交换机制和设备驱动209 10.4 Linux网络设备驱动编程210 10.4.1 Linux网络设备驱动的结构211 10.4.2 初始化212 10.4.3 发送和接收213 10.4.4 网络接口数据结构struct net_device213 10.5 BM8024接收/发送以太网包和MPC850218 10.5.1 接收以太网包219 10.5.2 发送以太网包219 10.6 BM8024 I/O存储器220 10.6.1 ioremap()220 10.6.2 配置BRx/ORx222 10.7 BM8024中断223 10.7.1 interrupt操作223 10.7.2 BM8024中断操作224 10.7.3 BM8024中断处理函数和tasklet224 10.8 延时225 10.9 BM8024内存操作226 10.10 BM8024网络设备驱动源代码分析226 10.10.1 Module_init()函数226 10.10.2 bm8024_init()函数227 10.10.3 bm8024_open()函数228 10.10.4 bm8024_interrupt()中断处理函数229 10.10.5 bm8024_do_tasklet()函数229 10.10.6 bm8024_rx()函数230 10.10.7 bm8024_tx()函数231 10.10.8 bm8024_hw_tx()函数231 10.10.9 BM8024网络设备驱动源代码231 第11章 嵌入式Linux 编程 11.1 task queues和kernel timer版本的LED驱动程序232 11.1.1 task queue232 11.1.2 使用tq_scheduler的LED Module234 11.1.3 kernel timer239 11.1.4 使用kernel timer的 LED Module239 11.2 semaphore243 11.3 Application直接访问BM8024寄存器244 11.3.1 HAL BM8024存储器模块246 11.3.2 HAL BM8024存储器模块源代码247 11.3.3 HAL BM8024寄存器API源代码255 第12章 实时Linux扩展——RTAI 12.1 RTAI模块259 12.1.1 rtai模块259 12.1.2 rtai_sched模块259 12.1.3 rtai_shm模块260 12.1.4 rtai_fifos模块260 12.1.5 LXRT模块260 12.2 在GE850EH开发板上安装RTAI260 12.2.1 获取Linux内核源代码260 12.2.2 获取24.1.8版本的RTAI源代码261 12.2.3 给Linux内核源代码加上RTAI的patch261 12.2.4 定制此Linux内核261 12.2.5 定制及编译RTAI模块261 12.2.6 安装及测试RTAI262 12.3 RTAI版本的LED例子264 12.4 常用RTAI API函数266 附录ARTAI常用API函数 A.1 task函数(rtai_sched.o模块) 267 A.2 timer函数(rtai_sched.o模块)274 A.3 semaphore函数(rtai_sched.o模块)276 A.4 task间通信函数(rtai_sched.o模块)280 A.5 远程函数调用(RPC)函数(rtai_sched.o模块)282 A.6 mailbox函数(rtai_sched.o模块)283 A.7 rtai.o模块提供的API函数285 A.8 rtai_shm.o提供的API函数289 A.9 rtai_fifo.o提供的API函数290 附录BCVS使用简介 B.1 简介294 B.2 安装CVS服务器294 B.3 使用CVS客户端298 B.4 一些小技巧304 附录CGNU通用公共许可证(GPL) 附录D附带光盘的使用方法 D.1 内容简介311 D.2 使用方法312 参考文献
推荐几个有关嵌入式系统的网站:
Linuxdevices.com
Embedded Linux
UcLinux
Uclinux developer forum
Posted by hzqbbc at 11:49 PM | Comments (1)
Web性能优化 - 好书介绍
这两天在书店看到了两本不错的书,给了自己耳目一新的感觉,在这里做一个简单的介绍和推介。首先是介绍涉及世界上应用最为广泛的Web服务优化的书-- 《Web性能优化》。
《Web性能优化》由Patrick Killelea编写,谢文亮翻译,清华大学出版社出版。该书讲述了如何对Web应用性能进行调整,提供高品质的Web Service。

看了本书,我惊叹作者拥有非常扎实的根基,各种专业术语和技术解释得很简明易懂,作风严谨,而且全书配有大量的真实例子和丰富的图例,着实是Web开发/维护人员的宝典,极具参考价值。
以下是该书的自述介绍:
《Web性能优化》前言:
自从Web诞生以来,人们就一直在尽力让它跑得更快。今天,Web获得成功也意味着它拥有了更多用户、更多数据、更多功能……和更长时间的等待。因此,优化其性能就成为 Web网站、特别是个人网站的"生杀之奉始"。
本书讲述如何将Web性能调至最佳状态。书中不仅谈到了Web服务器软件的优化,而且还涉及到如何流水化处理Web内容,如何从浏览器端着手优化性能,如何调校客户端和服务器端的硬件,以及如何最大限度地使用网络本身的特性。
书中的内容涉及到影响性能好坏的本质,并为得到立竿见影的效果提供了具体建议。本书向您娓娓道出评价计算性能高低的准则,并在后半部分讲述从客户端、网络直到服务器这一链条中每个环节的薄弱之处,同时给出了加强巩固这些薄弱环节的金玉良方。
本书在第一版的基础上对内容进行了扩展,具体包括:
. 增加了有关Web站点结构、安全性、可靠性的新章节,讲述了这些方面对性能的影响
. 详细讨论了在有多个处理器的服务器上Java的可扩展性
. 增加了一些与Web性能相关的用于处理注册、cookie、SSL的Peri脚本
. 给出了如何使用PeriDBI和开源程序gnuplot来生成性能图表的详细指令
. 增加了rstat的有关内容,rstat是一种基于Unix的源代码开放的实用程序,其作用是远程地收集性能统计数据
除此之外,书中还有很多实际中可能遇到的性能问题的示例和图表,当然也提供了相应的解决方法。
与第一版相比,书中的内容都"升级"到了Java 2。
如果您需要长时间地等待一个Web页面的显示,或者您所管理的服务器的速度慢得令人难以忍受,那么读一读《Web性能优化》这本书吧,它一定会对您有所帮助,使您的Web体验更上一层楼。
该书目录
前言 第一部分 基础篇 第一章 首要问题 浏览器端的问题 服务器端的问题 关键性建议 第二章 Web站点体系结构 进行权衡 组成元素 Web站点体系结构示例 趋势 示例配置 关键性建议 第三章 容量规划 算算账 相信数字,但更相信自己的眼睛 常见问题 你需要多大的带宽 你需要多快的服务器 你需要多大的内存 关键性建议 第四章 性能监控 性能参数 延迟和吞吐量 利用率 有效性 使用Perl监控Web性能 使用spocket自动生成监控脚本 使用关系型数据库存储和获取监控数据 使用rstat监控机器的使用情况 监控每一个进程的统计数据 根据ps数据生成图表 监控其他内容 制作一个系统面板Web页面 关键性建议 第五章 负载测试 负载测试的准备工作 权衡负载测试工具 编写你自己的负载测试工具 基准规范和基准测试 其他资源 关键性建议 第六章 性能分析 使用analysis.cgi找到瓶颈所在 使用sprocket探听HTTP 查看连接 日志文件分析 点击率 更多提示 关键性建议 第七章 可靠性 常见问题 相关性 处理故障 关键性建议 第八章 安全性 HTTPS和SSL 防火墙 堡垒主机 chroot 关键性建议 第九章 案例分析 数据库表无限制地增长 反向DNS查找降低了日志记载的速度 扭结的电缆 数据库连接池的增长限制了性能 关键性建议 第十章 原则与模式 优化性能的原则 改进性能的模式 关键性建议 第二部分 高级篇 第十一章 浏览器 浏览器的工作原理 浏览器的类型 最佳的浏览器 浏览器的速度 浏览器优化技巧 非浏览器的Web客户端 关键性建议 第十二章 客户端操作系统 Windows Macintosh UNIX 关键性建议 第十三章 客户端硬件 CPU 内存 高速缓存 总线 磁盘 显卡 BIOS 关键性建议 第十四章 线路和终端器 超前和延迟 调制解调器 —— 信息的通道 ISDN 电缆调制解调器 xDSL 高容量线路 内联网 网络建模工具 因特网 PTT 关键性建议 第十五章 网络协议 权力和协议 影响网络协议性能的因素 Web协议 关键性建议 第十六章 服务器端硬件 把服务器看成线路上的设备 性能良好的I/O 多个总线 快速磁盘 大量内存 可扩展性 网卡 总线 内存 内存的特点 CPU 对称多处理 磁盘活动和PID 关键性建议 第十七章 服务器端操作系统 Unix和Web的起源 Unix特色 系统调用和库调用 进程和内核 文件系统 窗口系统 版本和补丁 可配置的操作系统参数 Unix操作系统监控工具 系统调用跟踪程序 网络探听工具 服务器可以处理多少个连接 服务器可以处理多少个进程 服务器派生新进程的速度能有多快 UNIX与Windows NT的对比 外核 关键性建议 第十八章 服务器端软件 Web服务器软件的发展过程 Web服务器的系统调用 服务器连接是怎么失败的 配置Apache和Netscape的Web服务器 其他服务器 不具备的一些功能 代理服务器 分级缓存 关键性建议 第十九章 内容设计 内容的规模 努力做到最好 缓存技术和区别 HTML及其压缩 HTML制作者需注意的性能技巧 文档对象模型 图形 音频内容 视频内容 关键性建议 第二十章 自定义应用程序 程序员 CGI编程 CGI内幕及性能问题 常用的CGI技巧 CGI语言特有的优化技巧 后台运行CGI CGI访问数据库的性能 日志 NSAPI和ISAPI DOM JSP、ASP和PHP 关键性建议 第二十一章 Java 对于GUI应用程序来说,Java永远存在不足之处 对服务器端来说,Java提供了很多便利 Java固有的性能问题 编码技巧 编译器 分析代码 反编译器 操作系统级分析工具 JIT 静态编译器 虚拟机 运行时选项 Java芯片 Java基准 有Java性能信息的Web站点 关键性建议 第二十二章 数据库 你真的需要一个关系型数据库吗 性能优化技巧 数据库可以处理多少个连接 数据库何时会超载 分析 关键性建议 附录 有关Web性能的产品列表与回顾
在Oreilly 网站上该书的介绍:http://www.oreilly.com.cn/book.php?bn=7-302-07120-9
Posted by hzqbbc at 08:46 PM | Comments (0)
May 24, 2005
Apache rewrite技术实现Apache到lighttpd迁移
毫无疑问Apache是一个优秀的web server,但它也不万能的,在一些特定的环境下,也有Apache力不从心的时候。手上一台server由于瞬间高密度的访问非常多,因此Apache 1.3.x应付起来有点吃力,表现为响应速度慢,而且非常耗资源,Swap经常都是占满的。有一两次还导致机器负载过高(高达30-40,有个别时刻居然达到150之巨),感觉要死机的样子。
为此,必须寻求一个解决之道。分析之下,这台server目前的情况主要是由于运行了大量的fastcgi应用,而且这些应用的并发非常密集,平时白天就有200-300个连接,厉害的时候有近1000个在用进程。apache的运行情况top如下:
28152 nobody 15 0 6576 5856 1680 S 0.0 0.5 0:01 1 httpd
28686 nobody 15 0 7224 5808 1652 S 0.0 0.5 0:01 1 httpd
可见每个process的Share 内存就有1.6MB之多,如果是1000个进程就是1.6G了。加上其他开销,实际需要2G的存储空间,机器的内存是1G,交换区是1G,那实际上Swap将全部耗尽。
如何降低这些开销呢?fastcgi应用程序已经较好的优化了,耗费的资源很少,而且只有少于10个进程在运行,因此问题不在fastcgi。问题在Apache的并发响应能力,以及资源占用上。
使用lighttpd可以较好的解决这个问题,lighttpd基于单进程多路复用技术,因此消耗的资源非常少。而且支持fastcgi,但由于对php的支持仅限于fastcgi,与机器现有的一些网站并不能很好的兼容,因此考虑前端(80端口)用Apache,后端(2088)用lighttpd,通过rewrite技术,将fastcgi请求转交(Redirect)给后端的lighttpd处理。
这样原理上就能使apache的进程大幅度减少,并只是负责请求的转发而已,可以充分的利用原来的进程资源。而lighttpd消耗的cpu/memory资源也较低,因此完成同样的任务,Apache+lighttpd的方案就比原来的纯Apache要好得多。
实际运行证明,效率要好得多,响应速度提高了一个数量级以上。客户反映良好。
Apache rewrite + lighttpd 实现方法
原来负载较高的网站主机名highload.xxx.com ,运行的fastcgi prefix是/fcgi-bin。因此需要对这个虚拟主机进行Rewrite配置。
第一步,编译apache,激活mod_rewrite:
./configure \ --with-layout=Apache --prefix=/usr/local/httpd \ --enable-shared=max --enable-module=rewrite \ --enable-shared=rewrite
安装并加载好之后,配置highload.xxx.com的虚拟主机,在VirtualHost里增加:
RewriteEngine on RewriteRule ^\/fcgi-bin\/(.+) http://highload.xxx.com:2088/$1
第二步,编译lighttpd,配置fastcgi并使lighttpd监听于2088端口:
./configure --prefix=/usr/local/lighttpd
配置:
server.modules = (
"mod_access",
"mod_fastcgi",
"mod_accesslog" )
server.document-root = "/var/www/vhost/highload/fcgi-bin/"
server.errorlog = "/var/log/lighttpd/lighttpd.error.log"
server.indexfiles = ( "index.php", "index.html",
"index.htm", "default.htm" )
mimetype.assign = (
".pdf" => "application/pdf",
".sig" => "application/pgp-signature",
".spl" => "application/futuresplash",
".class" => "application/octet-stream",
".ps" => "application/postscript",
".torrent" => "application/x-bittorrent",
".dvi" => "application/x-dvi",
".gz" => "application/x-gzip",
".pac" => "application/x-ns-proxy-autoconfig",
".swf" => "application/x-shockwave-flash",
".tar.gz" => "application/x-tgz",
".tgz" => "application/x-tgz",
".tar" => "application/x-tar",
".zip" => "application/zip",
".mp3" => "audio/mpeg",
".m3u" => "audio/x-mpegurl",
".wma" => "audio/x-ms-wma",
".wax" => "audio/x-ms-wax",
".ogg" => "audio/x-wav",
".wav" => "audio/x-wav",
".gif" => "image/gif",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".xbm" => "image/x-xbitmap",
".xpm" => "image/x-xpixmap",
".xwd" => "image/x-xwindowdump",
".css" => "text/css",
".html" => "text/html",
".htm" => "text/html",
".js" => "text/javascript",
".asc" => "text/plain",
".c" => "text/plain",
".conf" => "text/plain",
".text" => "text/plain",
".txt" => "text/plain",
".dtd" => "text/xml",
".xml" => "text/xml",
".mpeg" => "video/mpeg",
".mpg" => "video/mpeg",
".mov" => "video/quicktime",
".qt" => "video/quicktime",
".avi" => "video/x-msvideo",
".asf" => "video/x-ms-asf",
".asx" => "video/x-ms-asf",
".wmv" => "video/x-ms-wmv",
".bz2" => "application/x-bzip",
".tbz" => "application/x-bzip-compressed-tar",
".tar.bz2" => "application/x-bzip-compressed-tar"
)
url.access-deny = ( "~", ".inc" )
server.port = 2080
fastcgi.server = ( "prog1" =>
("prog1" =>("socket" => "/tmp/prog1.socket")),
"prog2" =>
("prog2" =>("socket" => "/tmp/prog2.socket"))
)
这样lighttpd将监听于2088端口,访问http://highload.xxx.com:2088/prog1或prog2就可以执行fastcgi应用了。
注意,由于prog1/prog2等程序是非PHP 的fastcgi程序,由perl/c写成,因此必须用lighttpd的spawn-fcgi程序实现将这些fcgi应用运行,才能启动lighttpd,否则lighttpd会出错。
进入/usr/local/lighttpd/bin,执行: ./spawn-fcgi -s /tmp/prog1.socket -f /var/www/vhost/highload/prog1 ./spawn-fcgi -s /tmp/prog2.socket -f /var/www/vhost/highload/prog2
执行成功的话,将显示:
spawn-fcgi.c.160: child spawned successfully: PID: 602
重新启动apache,这样凡是访问http://highload.xxx.com/fcgi-bin/prog1或prog2,将自动定向到http://highload.xxx.com:2080/prog*。
经过这样改进后,平均的Apache进程数从650-700降低到250,其余的400-500个并发就由lighttpd来处理。整机的负载也降低了很多。主要是内存使用大幅度降低了。只有原来的40%用量,swap余量非常足够:-)
而且最重要的是,响应速度快了很多。以下是并发请求的监视图:

注意:图上显示的是按每秒的并发请求次数,而不是并发连接数,并发连接数大概是这个数的10倍,也即如果有25请求/秒,那么实际在一段时间内的持续并发连接数就有250-300个。
Posted by hzqbbc at 10:18 AM | Comments (8)
May 18, 2005
个性化GMail, hotmail, Yahoo!邮箱图标
不知道在什么时候,Blog这个圈子里有人就开始使用邮箱图标来代替签名。这样做除了能彻底解决邮箱爬虫(一些专门在网页里搜刮邮件地址的软件,多数由Spamer操纵着)的问题外,还非常醒目。
很快,这样的个性化邮箱图标就开始流传了。我最早还以为是个人自己用Photoshop之类的软件做的,但后来发现有不少人在用,才到google搜索了一下,结果发现原来都是利用Email Icon Generator之类的工具生成的。
自己原来离“先进分子”那么遥远,于是赶紧也搞了几个回来。
Gmail
![]()
Hotmail
![]()
MSN
![]()
在google上搜索到了一些提供这种图标生成的网站:
NHacks.com
这个网站支持的比较全面,主流的GMail, Hotmail, MSN, lycos, yahoo, bigfoot, netscape, AOL, ATT等都支持。
地址:http://www.nhacks.com/email/index.php
Gmail Signature Generator
另一个专门针对Gmail的邮箱图标的网站,图标比较有趣。不过比较大。
地址:http://gizmo967.mgs3.org/Gmail/
Playtime
这个网站提供了GMail, Hotmail, MSN, Yahoo, AOL的图标个性化生成,而且还有相关的小程序下载,非常不错。
地址:http://email.playtime.uni.cc/
什么时候,我也设计一个@hzqbbc.com的呢?
Posted by hzqbbc at 09:35 PM | Comments (0)
May 15, 2005
发布lilina 预缓存补丁(lilina cache patch)
前几天对lilina的提速修改,经过整理后,做了一个补丁。经过约一周时间的测试,感觉稳定性和可靠性方面已没什么问题。由于浏览器访问的是html文件,所以速度相当满意。为了使cache文件能自动更新,我使用了一个小技巧:用<frame> 嵌套了index.php,这样每次访问cache文件时,都会调用index.php,index.php会判断cache文件是否过期,过期了则后台重建;如无过期则显示cache文件的创建时间,这样非常方便。
下图是更新cache时显示的信息,注意看红圈内的信息:

这是使用cache时显示的信息:

对于没有Unix环境的朋友,可以下载打了补丁后的lilina-0.7
补丁后的lilina-0.7下载
下载地址: lilina-0.7-patched.tar.gz安装与标准的lilina没有什么区别,可以参考:小试RSS聚合器lilina,附安装方法,唯一要配置的就是$index_file及其对应的文件属性。详细见下文。
补丁的全部内容入如下:
--- index.php.old 2005-05-15 22:43:16.000000000 +0800
+++ index.php 2005-05-16 13:37:59.000000000 +0800
@@ -1,4 +1,10 @@
<?
+/* output buffer control start */
+ob_start("callback");
+$index_file = "cache.html";
+$mt = mtime();
+$rebuild = 0;
+
header("Content-Type: text/html; charset=utf-8");
require_once './lib.php' ;
@@ -7,6 +13,39 @@
define('MAGPIE_CACHE_AGE',1) ;
}
+/* rebuild cache or not? */
+if(time()-$mt>MAGPIE_CACHE_AGE) {
+ $rebuild = 1;
+}else {
+ return 0;
+}
+
+/* Function used to do cache */
+function mtime() {
+ global $index_file;
+ $fd = fopen($index_file, "r");
+ $fstat = fstat($fd);
+ fclose($fd);
+ return $fstat['mtime'];
+}
+
+function callback($str) {
+ global $rebuild, $index_file, $mt;
+ $color = '#000000';
+ $res = "<style><!-- body { font-size: 10px; font-family: Verdana; } --></style>";
+ if($rebuild) {
+ $color = '#ff0000';
+ $fd = fopen($index_file, "w");
+ fputs($fd, $str, strlen($str));
+ fclose($fd);
+ $time = strftime("%a %b %d %H:%M:%S, %Y", time());
+ return $res."<b><font color=$color>Built index: $time</font></b>";
+ }else {
+ $time = strftime("%a %b %d %H:%M:%S, %Y", $mt);
+ return $res."<b><font color=$color>Cache index: $time</font></b>";
+ }
+}
+
/* Function used to sort rss items in chronological order */
function date_cmp($a, $b) {
if ($a['date_timestamp'] == $b['date_timestamp'] ) {
@@ -166,5 +205,15 @@
<div id="footer">powered by <a href="http://lilina.sourceforge.net/"><img src="i/logo.gif" alt="lilina news aggregator" title="lilina news aggregator" /></a> v
<?= $LILINAVERSION ?>
</div>
+
+ <div id="updater" style="display: block; position: absolute; top: 10px; right: 100px;">
+ <iframe marginheight=0 frameborder=0 scrolling=no height=20 src="index.php"></iframe>
+ </div>
+
</body>
</html>
+
+<?php
+/* flush output buffer */
+ob_end_flush();
+?>
将上述这段代码复制,保存到本地文件,例如lilina-cache.patch。并将patch文件上载到lilina的目录里,执行如下命令:
patch -p0 < lilina-cache.patch这样就完成了补丁的操作。不过需要注意几点:
例如目前HZQBBC首页的lilina页面就是由/lilina/index.php生成的。其中$index_file = "../index.html"。除此参数及文件属性要注意外,不需要修改任何配置。
补丁程序也可在这里下载
Posted by hzqbbc at 03:41 PM | Comments (20)
May 11, 2005
为lilina增加文本预缓存支持(html cache)
Lilina是一个不需要使用数据库的RSS新闻聚合器,由PHP编写而成,而且不需要数据库支持,纯文本操作,非常方便。
但lilina的缺点也是很明显的,最严重的问题是性能/速度(performance!),虽然lilina已内置了cache功能,但如果订阅的新闻源一多,由于遍历的文件也随之增加,因此速度会越来越慢。
我用lilina做首页,很多朋友都反映速度很慢。于是琢磨着给其提速,好几年没写过php了,估计快忘光了。于是到www.php.net去找找资料。
提速原理:Cache
大部分的web提速都是基于缓冲(cache)的原理,将输出的内容保存到一个静态文件里,在一定周期(Life time)内将结果从静态文件(cache file)里直接提取甚至直接输出这个静态文件。因此避免了大量的数据库或速度缓慢的操作,可大幅度提高性能。lilina的缺陷很明显,输出是由index.php完成。不可避免的需要大量耗时的操作。能否将输出的结果Cache起来呢?默认lilina 的cache data life time 是60*60秒(1小时),那么在1小时内,每次访问都只是访问cache而已,如果将输出结果保存成html文件,无疑能极大的提高速度。
基本构思
如何捕获lilina的输出呢?这个是关键问题。chedong的做法是使用wget来“获取”输出,保存到index.html里,这样最大的好处是实现简便,不需要任何额外的技术。只要系统安装了wget,在crontab里加一个定期更新index.html的指令即可。有关chedong的wget实现请参阅Lilina的简单预缓存加速但wget一法有一些小缺陷,对于虚拟主机用户没有crontab的权限,因此这个方法不太可行。而通过修改lilina的输出头,由浏览器代为Cache也是一个可行的方法。
但我有个癖好,喜欢pure solution,希望不借助任何其他工具,在lilina里实现快照(Cache)提速。基本原理很简单:,利用php的Output Control技术,捕获php的输出,将输出写入Cache文件index.html里。如果在一定周期内Cache不过期,则不需要重建。
具体实现
真正需要涉及的Output Control函数是ob_start()和ob_end_flush(),前者标记了output buffering 开始,而后者则刷新buffer,将结果输出。以下是基本代码结构:
<?PHP
ob_start("callback"); // begin output buffer
/* some varible defination goes here */
$index_file = "/path/to/index.html";
$mt = mtime();
$rebuild = 0;
if(time() - $mt > 3600) { // cache file expire?
$rebuild = 1; // rebuild it
}else {
return 0; // ignore RSS process
}
/* cache index hack functions */
// get cache file modify time
function mtime() {
global $index_file;
$fd = fopen($index_file, "r");
$fstat = fstat($fd);
fclose($fd);
return $fstat['mtime'];
}
// callback func for ob_start()
function callback($str) {
global $rebuild, $index_file, $mt;
if($rebuild) {
$fd = fopen($index_file, "w");
fputs($fd, $str, strlen($str));
fclose($fd);
return "Index rebuild done";
}else {
return "Using cache index";
}
}
/* begin the main RSS processing..*/
......
?>
some html..
<?PHP
ob_end_flush();
?>
代码的实质功能无非是:检查cache文件是否过期,如过期则设置rebuild标记,如没有则终止程序。通过ob_start()设置了一个叫callback的回调函数,从而捕获了整个程序的输出,并保存到本地的index.html里。
...to be continue..
Posted by hzqbbc at 11:41 AM | Comments (6)
April 13, 2005
小试RSS聚合器lilina,附安装方法
lilina是一个开源的RSS新闻聚合器实现,功能强大,方便易用,而且最大的好处是不需要数据库支持,这点我比较喜欢。机器上的lilina已经运行了1个星期,感觉比较稳定。
lilina支持RSS/ATOM的解析,使用MagpieRSS库,拥有一个简单但容易理解的管理后台,管理feed。
整个安装和自定义过程都非常简单。Just some steps!
安装步骤
1)解包lilina,最新的lilina版本是0.7,执行tar xfz lilina-0.7.tar.gz
2)安装配置
解包后生成lilina-0.7目录,将该目录mv到网站根目录下,改名为lilina,然后进入该目录,配置conf.php文件。
mv lilina-0.7 lilina cd lilina
注意配置BASEURL及USERNAME和PASSWORD,其中BASEURL是lilina的地址,而USERNAME和PASSWORD是管理员的用户名/密码。
其他的配置可以不动。但要保证myfeeds.data和.time.data可写。执行操作:
chmod 777 .myfeeds.data .time.data
管理feeds
登陆lilina的配置界面:http://your-website-url.com/lilina/edit.php
输入用户名和密码即可。默认的feeds有很多,但大多数是国外的一些RSS/ATOM源,可以删除掉,然后在rss/atom URL to add: 栏目里增加rss/atom源的地址,例如本站的Blog rss文件地址就是http://www.hzqbbc.com/blog/index.rdf,将该链接复制到输入框,点Add即可。
同样道理,顺次将需要聚合的网站RSS/ATOM地址输入好后,点导航条的myfeeds即可预览效果了。
Demo演示
点这里Posted by hzqbbc at 09:24 AM | Comments (14)
April 10, 2005
解决GBOX收发邮件不畅问题
受一个朋友的重托,要解决一台敢能公司GBOX 2500系列的邮件通服务器的故障。这个GBOX 2500出现了大概这些问题:
O.外部邮件发不进来
O.内网往外发邮件正常
O.内网收不了邮件
这个GBOX是一体化的设备,具体地址见:敢能科技 GBOX 2500介绍
登上了这个GBOX,发现是一个简化了的Linux系统,很多东西都被裁减掉了。
系统基本结构为Postfix + /etc/passwd + horde + 一个自开发的管理后台,包括相应的imap/pop3服务器等。
由于使用的是系统用户,因此安全性和扩充性相对于虚拟用户而言,要较为差一些。而对于中小企业而言,扩充性倒不是大问题,又有几个小企业能有几千上万个邮箱用户呢?如果真的到了那个地步,系统准要换了。
检查了一下main.cf文件和master.cf后,并没有明显异常的地方。再检查mx记录,发现mx记录指向了mail.xxx.cn,并无特别不对头。
于是在自己的email server给test@xxx.cn发邮件,看到邮件日志发现连接超时,而连接的ip地址居然是192.168.1.xxx。于是连忙查询了一下mail.xxx.cn的A记录,果然是指向了192.168.1.xxx,询问客户得知,192.168.1.xxx是GBOX机器的内网ip。
难怪只有内网用户能往外发邮件,而外部发来的邮件到达不了,原因都是mx记录的hostname A记录不正确所导致。搞清楚后让客户更正了指向,一切恢复正常。
小结
Email 的故障很多都出在DNS/网络类问题上,例如MX解析不了,或主机名解析不了,网络连接不可到达,ip地址被RBL组织封锁等。要发现这些问题,应尽早检查mx记录,邮件日志及退信内容。
Posted by hzqbbc at 06:31 AM | Comments (0)