-
SosoSpider及恶意蜘蛛屏蔽
Posted on 一月 29th, 2009 No comments最近从网络日志看到有很多陕西电信IDC的访问,占我们www总访问数的一半,ip都是124.115.0.X和124.115.4.X,总共约有60多个IP。网上搜索了一下,发现这是sosospider,文章参见:
http://www.wangzhongyuan.com/archives/522.html
http://www.cnzzr.cn/2008/02/sosospider-124-115.html由于这个sosospider不遵守行规,不读取robots.txt,并且User-agents中没有spider信息,而且还带有referer,伪装成普通用户,封闭的办法只有禁止IP:
Order Allow,Deny
Allow from all
Deny from 124.115.4. env=bad_bot
Deny from 124.115.0. env=bad_bot注意这里deny和allow的顺序,对于其他恶意搜索引擎,可以用:
SetEnvIfNoCase User-Agent “Indy Library” bad_bot
…
Order Allow,Deny
Allow from all
Deny from env=bad_botnginx配置如下:
location / {
deny 124.115.4.0/24;
deny 124.115.0.0/24;
allow all;
} -
设置rsync用SSH自动传输
Posted on 一月 26th, 2009 No comments为了使SSH能够自动传输,我们需要
1)客户端配置
在需要授权的用户目录下,此处为root:
ssh-keygen -t rsa -b 2048 -f /root/.ssh/hostkey
若没有.ssh目录,手动创建一个;此时会在该目录下生成2个文件,hostkey hostkey.pub;
将生成的hustkey.pub传输给server,由于此处是要用于身份验证的:
scp -P 1818 /root/.ssh/hostkey.pub jeff@192.168.1.98:/.ssh/2. 服务器端设置
a,在/etc/hosts.allow里,添加:sshd:192.168.1.100,允许客户端可以登陆;
b,在/.ssh目录下手动创建:touch authorized_keys;chomd 600 authorized_keys;再将由客户端scp过来的hostkey.pub导进去:cat hostkey.pub >> authorized_keysc,vi /etc/ssh/sshd_config,修改如下几行:
RhostsAuthentication yes
RhostsRSAAuthentication yes
AuthorizedKeysFile .ssh/authorized_keysssh -p 1818 -i /root/.ssh/hostkey
-
更新awstats的robots
Posted on 一月 26th, 2009 No comments有了google analytics之后,awstats的作用相对降低了,不过在统计search engine的抓取时还是非常有效的。这个方面主要可以参考车东的博客中搜索引擎配置更新,不过今天我也发现了一个问题,网易的搜索是YodaoBot,而实际我们在日志里看到的只有YoudaoBot和YodaoBot-Image,貌似现在youdao主要的更新都在这里了,于是修改robots.pm如下:
856 'yodaobot',
857 'youdaobot',1506 'yodaobot','<a href="http://www.yodao.com/help/webmaster/spider/" title="YodaoBot">OutfoxBot/YodaoBot</a>',
1507 'yuodaobot','<a href="http://www.yodao.com/help/webmaster/spider/" title="YuodaoBot">OutfoxBot/YuodaoBot</a>', -
用php控制你的MSN消息
Posted on 一月 21st, 2009 No comments从Facebook到开心网,很多SNS应用都使用了msn服务,关于MSN的协议的详细信息可以看半官方网站MSNPiki。使用MSN的php类也不少,这里介绍两个,第一个是PHP MSN Class,这个类比较简单,可以用来发送MSN消息,支持MSNP9 (MSN 6.2)和最新的MSNP15 (WLM 8.1)协议(MSNP15协议支持离线消息),可以作为MSN机器人使用,或者给MSN、雅虎通发消息。
<?php
include_once(‘msn.class.php’);
$msn_username = “username@hotmail.com”;//发送者MSN帐号
$msn_password = “12341234″;//发送者MSN密码
$msn_list = array(“user1@hotmail.com”,”user2@live.cn”);//消息接收者MSN帐号
$msn = new MSN(‘MSNP15′);//采用MSNP15协议,支持离线消息
if ($msn->connect($msn_username, $msn_password)) {
$msn->sendMessage(“UTF-8编码的中文和英文”, $msn_list);
}
?>使用MSNP15协议,PHP需要支持mhash;使用msnbot机器人功能,PHP需要支持pcntl。
phpMSN:基于PHP的MSN Messenger客户端连接接口。
MSN Messenger Class:这是一个支持MSNP协议的简单易用的PHP类库,它通过php_curl模块来实现对SSL的支持,目前,支持MSN9协议。Blobsy:一个基于PHP开发的开源MSN Messager机器人。它设计灵活易用,便于安装,而且可定制,功能强大,内建模块包括让MSN上google帮你查资料等,这篇中文博客有不少介绍。
Naneau MSN:另一个用ZF开发的MSN类, 包括消息发送,获取联系人清单等。
Contact Grabber: 可以抓取MSN,GMAIL,Yahoo Messenger等联系人信息。
这里还有些介绍付费的contact抓取类,还支持aol,icq等:http://script.wareseeker.com/free-contact-importer-address-book-grabber-for-hotmail-gmail-yahoo-msn-aol/
-
介绍几款web测试人员的利器
Posted on 一月 19th, 2009 No comments前一阵子我们的网站在ie6下出现了一些问题,主要是在ie6下发生问题,而我们公司测试部门安装的的测试软件为ie6+XP SP2(User-Agent: …IE6.0 … SV1 …), ie7, firefox,在google analytics中查了一下用户的浏览器版本,发现居然还是有90%的用户使用的是ie6,而我维护的另外一个在国外的电子商务网站的ie6的用户占有率已经降到了60%左右,看来做国内网站还真是要特别重视各种ie的版本。下面介绍一些Web测试人员的工具:
ieTester: 对于vista,XP下测试ie5.5, ie6, ie7, ie8:http://www.my-debugbar.com/wiki/IETester/HomePage这里有几个FireFox的插件launchy,在firefox下可以同时打开ie, safari, chrome(google), 和ieTester;)
https://addons.mozilla.org/en-US/firefox/addon/81
HTML Validator:考虑到本文读者可能web开发人员,在顺便介绍两个很有名的前端开发人员用插件:Firebug,查看页面HTML源代码和css:Fidderler, 在线调试JS:安装Fidderler:在windows下可以用PearPC来摸拟MAChttp://pearpc.sourceforge.net
-
提升Awstats统计性能
Posted on 一月 17th, 2009 2 comments1.用Databasebreak=day甚至hour来提升统计速度,设置步骤如下:
A. 由于databasebreak这个awstats的参数不能再awstatsupdateall.pl中支持,更新起来比较麻烦,我们写了一个脚本,自动更新多个子域:
#!/bin/bash
configfiles="www member buy"
domain=sasacity.com
command=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl
static_command="/usr/local/awstats/tools/awstats_buildstaticpages.pl dir=/usr/local/awstats/wwwroot/cgi-bin/data/ -lang=cn -configdir=/usr/local/awstats/wwwroot/cgi-bin/ -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl"
for conf in ${configfiles};
do
${command} -update -config=${conf}.${domain} -Databasebreak=month;
${command} -update -config=${conf}.${domain} -Databasebreak=day;
done或者直接修改awstatsupdateall.pl
153 $command2=$command." -Databasebreak=month";
154 $command.=" -Databasebreak=day";
155 if ($LastLine) {
156 $command.=" -lastline=$LastLine";
157 }
158 # Run command line
159 print "Running '$command' to update config $domain\n";
160 my $output = `$command 2>&1`;
161 print "$output\n";
162 my $output = `$command2 2>&1`;
163 print "$output\n";B.awstats没有按天显示的入口链接但可以手工输入
/awstats.pl?config=www.mysite.com&DatabaseBreak=day&day=21&month=12&year=2008C.perl写的一个日历插件,用来按月,日,年查询:
vi calendar.pl for awstats2. 对于大内存的服务器,可以修改awstats.pl,把LIMITFLUSH=50000(或更高),以提高统计速度
-
IP数据库的自动更新
Posted on 一月 17th, 2009 No comments我们这里介绍几个免费IP数据库的更新,对于国外IP数据,我们使用Maxmind的开源项目GeoIP,而国内IP数据我们使用纯真的QQWry, 由于QQWry是rara格式的,我们首先在系统安装unrar
wget http://www.rarlab.com/rar/unrar-3.7.7-centos.gz
gzip -d unrar-3.7.7-centos.gz
mv unrar-3.7.7-centos /usr/local/bin/
编写以下脚本用于自动同步IP数据到/usr/local/share目录下
vi update_ipdata.sh
#!/bin/bash
if [ ! -d /usr/local/share/GeoIP ] ; then
mkdir /usr/local/share/GeoIP
fi
if [ ! -d /usr/local/share/qqIP ] ; then
mkdir /usr/local/share/qqIP
fi
wget -t 5 -O /tmp/GeoIP.dat.gz http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
wget -t 5 -O /tmp/GeoLiteCity.dat.gz http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
wget -t 5 -O /tmp/GeoIPASNum.dat.gz http://geolite.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz
wget -t 5 -O /tmp/qqwry.rar http://update.cz88.net/soft/qqwry.rargzip -df /tmp/GeoIP.dat.gz
gzip -df /tmp/GeoLiteCity.dat.gz
gzip -df /tmp/GeoIPASNum.dat.gz
/usr/local/bin/unrar e -nQQWry.Dat -o+ /tmp/qqwry.rar /tmp/
mv -f /tmp/Geo*.dat /usr/local/share/GeoIP/
mv -f /tmp/QQWry.Dat /usr/local/share/qqIP/我们在每周三早晨6点20更新一次ip数据库:
20 6 * * 3 /usr/local/awstats/update-ipdata-cron.sh
最后我们需要确认一下目录配置, 查看awstats.common.conf,修改以下三行:
LoadPlugin="geoip GEOIP_STANDARD /usr/local/share/GeoIP/GeoIP.dat"
LoadPlugin="geoip_city_maxmind GEOIP_STANDARD /usr/local/share/GeoIP/GeoLiteCity.dat"
LoadPlugin="geoip_org_maxmind GEOIP_STANDARD /usr/local/share/GeoIP/GeoIPASNum.dat"在awstats/wwwroot/cgi-bin/plugins目录下修改qqwry.pl,将
my $ipfile=”/QQWry.Dat”;
修改为:
my $ipfile=”/usr/local/share/qqIP/QQWry.Dat”;以上GeoIP的安装介绍参考了Antezenta的awstats博客,纯真数据库格式说明参见LumaQQ的QQWry格式解析,PHP解析QQ格式可以考虑使用QQWry的PHP扩展(C代码)
-
使用Rsync同步备份数据
Posted on 一月 16th, 2009 No comments使用rsync的优点:可通过ssh进行网络加密传输,也可以利用ssh客户端密钥建立信任关系。当在两台计算机之间保持大型、复杂目录结构的同步时候,比tar或wget等方式都要快。而且可以做到精确同步。
首先,安装rsync
yum install rsync
以上方法默认安装2.6.8, 建议安装3.0.X,据张宴博客介绍3.0.X的有比较更新(希望是比较智能的)
wget http://rsync.samba.org/ftp/rsync/rsync-3.0.5.tar.gz
tar -xvzf rsync-3.0.5.tar.gz; cd rsync-3.0.5;
./configure; make; make install使用rsh或ssh方式同步数据
在没有建立rsync服务器的情况下,我们可以利用rsync命令直接进行快速的差异备份:
命令格式:
#rsync [option] 源路径 目标路径
其中[option]为:
a:使用archive模式,等于-rlptgoD,即保持原有的文件权限
z:表示传输时压缩数据
v:显示到屏幕中
e:使用远程shell程序(可以使用rsh或ssh)
–delete:精确保存副本,源主机删除的文件,目标主机也会同步删除
–include=PATTERN:不排除符合PATTERN的文件或目录
–exclude=PATTERN:排除所有符合PATTERN的文件或目录
–password-file:指定用于rsync服务器的用户验证密码源路径和目标路径可以使用如下格式:
rsync://[USER@]Host[:Port]/Path <–rsync服务器路径
[USER@]Host::Path <–rsync服务器的另一种表示形式
[USER@]Host:Path <–远程路径
LocalPath <–本地路径注意:来源或目的路径最少要有一个是本地路径,如果忽略本地路径,则只会列出远端的文件列表。
把远端机器ssh上789端口下的/home/www/logs/目录中的内容,通过rsync同步到本地的/home/www/logs/目录下:
#rsync -ave “ssh -p 789″ backup@192.168.1.98:/home/www/logs/ /home/www/logs/
注意:源路径结尾时候的/号,后缀/通知rsync复制该目录的内容,但不复制目录本身。例如,下面命令会把pub目录整个同步到本地/home/ftp/路径中:
#rsync -ave ssh backup:/home/ftp/pub /home/ftp/
使用rsync服务器方式同步数据
当服务器没有开通ssh,或备份方没有ssh权限的时候,我们可以通过建立rsync服务器,进行匿名的数据同步。
要使用rsync服务,需要建立服务端和客户端:
1. 配置rsync服务器:
创建rsyncd的配置文件/etc/rsyncd.conf,内容如下:
uid = nobody
gid = nobody
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[logs]
path = /home/www/logs
ignore errors
read only = true
list = false
hosts allow = 192.168.1.200
hosts deny = 0.0.0.0/32
auth users = backup
secrets file = /etc/backserver.pas
[app1]
path = /app/application1/
ignore errors
read only = true
list = false
hosts allow = 192.168.1.200
hosts deny = 0.0.0.0/32
uid = dev01
gid = dev01
auth users = backup
secrets file = /etc/backserver.pas帐号密码文件:
#vi /etc/backserver.pas#格式:帐号:密码 (每行一组,帐号和密码用:号分开)
backup:jeff
保存后,需要保证用户是root,权限是600
#chown root:root /etc/backserver.pas
#chmod 600 /etc/backserver.pas2.启动rsync服务
/usr/bin/rsync –daemon
服务启动后侦听873/TCP端口
要置开机启动rsync服务, 编辑/etc/rc.d/rc.local,在最后添加上述命令
3.设置rsync客户端设置
如果rsync服务器需要密码验证,可以增加–password-file参数:
#rsync -azv --delete rsync://linuxing@192.168.1.100/test /var/www/html --password-file=/etc/test
crontab -e
00 04 * * * /usr/bin/rsync -arv backup@192.168.1.200::logs /home/www/logs --password-file=/etc/rsync.pass --exclude "*log"
#vi /etc/rsync.pass
#指定访问密码
jeff
#chmod 600 /etc/rsync.passrsync是较为传统的代码同步方式,绝大多数网站已经足够使用,当然对于一些文件量大,访问量在千万以上级别的网站可以参考Amazon Dynamo和一篇豆瓣开发人员推荐的大量小文件的实时同步方案
-
Awstats日志统计和其他统计系统的差异
Posted on 一月 16th, 2009 1 comment如果你同时使用awstats分析web日志,也用Google Analytics跟踪web访问,通常你会看到GA的数据比Awstats统计的数据小,而且两者相差很大,是awstats统计的问题还是google analytics的统计疏漏呢? 这是有两种统计方法不同所造成的。
首先,我们看一下用户数的统计。定义如下:
唯一用户数: 用ip 地址 + ua 信息的组合来识别不同的用户访问
访问人次: 被识别的唯一用户在最后一次页面访问后又间隔一定时间(30分钟?)后再次访问,算是该用户的第二次访问。
我们看到GA默认的间隔是30分钟,而Awstats的间隔设置不同。所以导致数据统计不一样。
接下来我们再看一下PV的统计
理论上来说awstats的数据来自于web日志,应该比GA更为精确,但是awstats把很多中间页面也统计了进去,造成数据的不准确。为了更精确地统计web日志,我们看看有哪些是被awstats多统计的访问量,并由日志中统计出的PV量要排除掉他们:- 1. 搜索引擎爬虫过来的搜索引擎,爬虫这些访问不是用户行为,应该排除
处理方法: 一般有异常IP地址的访问量和UA信息的判断获得,排除这些因素的PV量 - 2. 中间跳转页面中间跳转页面,对用户来说只能看到跳转后的页面信息,之前发起跳转的页面对用户不可见,应该排除
处理方法: 找出设计中存在的跳转页面,排除跳转前的页面或跳转后的页面所汇集的PV量。
最好在业务设计和程序设计时做考虑处理,减少中间页面跳转这类的处理。 - 3. 页面中内嵌的页面这类是使用Frame或Div等形式,嵌在一个页面中的一小块信息,
处理方法:找出这类地址,对其做访问量排除
如果内嵌的是广告信息等,可以考虑单独做分析 - 4. Ajax数据交换使用过的接口页面这类地址一般用户看不到,应该排除,
处理方法:找出这类ajax文件所在目录,然后在统计量中排除对这些地址的访问,最好在程序设计上将其放到一个目录下,这样可以直接排除对某个目录的访问。 - 5. 内部数据接口交互使用的PV这个不是针对用户的,也应该排除
处理方法:如果是从localhost或者本地网的可以单独过滤。对于这个方法排除后剩余的文件,可以找出这类的地址,然后在统计量中排除对这些地址的访问,如果能在架构设计时将其放到一个目录下,这样可以直接排除对这些目录的访问。
在awstats的配置文件中我们可以通过设置SkipFiles, SkipHosts参数防止被统计的页面,比如我们不想统计/ajax/和/globalinclude/目录下的文件,可以设置如下:
SkipFiles=”REGEX[^\/globalinclude\/] REGEX[^\/ajax\/] REGEX[^\/scripts] REGEX[^\/css] REGEX[^\/images] REGEX[^*\.gif]”
SkipHosts=”localhost REGEX[^192\.168\.]”为了让首页的统计更精确,可以做如下设置:
DefaultFile=”index.htm index.html index.php”如果程序设计目录对这些方面考虑得不周全,建议从访问量大的文件先开始过滤,相信一段时间之后,你的日志统计就会越来越精确了。
- 1. 搜索引擎爬虫过来的搜索引擎,爬虫这些访问不是用户行为,应该排除
-
为Awstats添加自己想要的Extra(扩展)
Posted on 一月 16th, 2009 1 commentAwstats允许我们在其标准日志统计报表之外,通过Awstats Extra Sections添加自定义报表,当然每一个Extra section将使Awsats的处理速度降低 8%, 而且错误的设置会导致Awstat耗用过多内存,导致awstat处理失败。
Extra Section可以有多个报表,每个报表有一组参数,以数字为标号。如以下X是一个数字,可以按1,2…编下去,为组号的标号:
ExtraSectionNameX 自定义图表的名称.
ExtraSectionCodeFilterX 必须要匹配的记录中返回代码,比如http日志中的 200 304,空字符不做检测
ExtraSectionConditionX 用来计数的条件,满足的行做计数处理,使用以下条件 (URL,URLWITHQUERY,QUERY_STRING,REFERER,UA,HOST,extraX)
并在逗号后面用regex来测试满足条件的字符串, 可以使用 “||” 当作 “OR” 做多个项之间的并列条件.
ExtraSectionFirstColumnTitleX 图表第一列的标题
ExtraSectionFirstColumnValuesX 给定条件字段中获取行值的一个regex格式字符串(同行条件部分,不同点是前面是测试满足条件的行,这儿是提取满足条件的值,做结果报表中的行值)
(URL,URLWITHQUERY,QUERY_STRING,REFERER,UA,HOST,VHOST,extraX)逗号跟regex提取值表达式
每个找到的不同值将在列表中有一行数据,计数的值将出现在该行的第一列. 确认获取到的不同值列表是可预计的(不会无限扩展,撑破内存)。例:
ExtraSectionFirstColumnValues1="URL,^\/blog\/([\w]+)\.html"
ExtraSectionFirstColumnFormatX 用来输出值的字符串,如:ExtraSectionFirstColumnFormat2="<a href='/blog/archives/%s.html' target='new'>%s</a>"
ExtraSectionStatTypesX 想要计数的类型,可以使用标准代码字符(见本文最后的说明).
ExtraSectionAddAverageRowX 在底部添加一个平均值行
ExtraSectionAddSumRowX 在底部添加一个合计行
MaxNbOfExtraX 在图表中显示的最大行数
MinHitExtraX 要在图表中做显示的最小值统计列说明
在ExtraSectionStatTypes中只有PHBL这几个字段有效
U = Unique visitors
V = Visits
P = Number of pages
H = Number of hits (or mails)
B = Bandwith (or total mail size for mail logs)
L = Last access date
E = Entry pages
X = Exit pages
C = Web compression (mod_gzip,mod_deflate)

