存档

2009年1月 的存档

SosoSpider及恶意蜘蛛屏蔽

2009年1月29日

最近从网络日志看到有很多陕西电信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_bot

nginx配置如下:

location / {
    deny   124.115.4.0/24;
deny 124.115.0.0/24;
    allow    all;
}

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

搜索引擎, 系统管理

设置rsync用SSH自动传输

2009年1月26日

为了使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_keys

c,vi /etc/ssh/sshd_config,修改如下几行:

RhostsAuthentication yes
RhostsRSAAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

ssh -p 1818 -i /root/.ssh/hostkey

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

系统管理 ,

更新awstats的robots

2009年1月26日

有了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>',

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

系统管理 ,

用php控制你的MSN消息

2009年1月21日

从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/

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

程序开发

介绍几款web测试人员的利器

2009年1月19日

前一阵子我们的网站在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
launchy1

HTML Validator:
 
考虑到本文读者可能web开发人员,在顺便介绍两个很有名的前端开发人员用插件:
Firebug,查看页面HTML源代码和css:
Fidderler, 在线调试JS:
https://addons.mozilla.org/zh-CN/firefox/addon/9373
安装Fidderler:
 
在windows下可以用PearPC来摸拟MAC
http://pearpc.sourceforge.net
VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

软件和工具

提升Awstats统计性能

2009年1月17日

1.用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=2008

C.perl写的一个日历插件,用来按月,日,年查询:
vi calendar.pl for awstats

2. 对于大内存的服务器,可以修改awstats.pl,把LIMITFLUSH=50000(或更高),以提高统计速度
VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

系统管理 ,

IP数据库的自动更新

2009年1月17日

我们这里介绍几个免费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.rar

gzip -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代码)

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

系统管理

使用Rsync同步备份数据

2009年1月16日

使用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.pas

2.启动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.pass

rsync是较为传统的代码同步方式,绝大多数网站已经足够使用,当然对于一些文件量大,访问量在千万以上级别的网站可以参考Amazon Dynamo和一篇豆瓣开发人员推荐的大量小文件的实时同步方案

VN:F [1.9.22_1171]
Rating: 8.0/10 (3 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

系统管理 ,

Awstats日志统计和其他统计系统的差异

2009年1月16日

如果你同时使用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”

如果程序设计目录对这些方面考虑得不周全,建议从访问量大的文件先开始过滤,相信一段时间之后,你的日志统计就会越来越精确了。

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)

系统管理 ,

为Awstats添加自己想要的Extra(扩展)

2009年1月16日

Awstats允许我们在其标准日志统计报表之外,通过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)

VN:F [1.9.22_1171]
Rating: 5.5/10 (2 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

搜索引擎, 系统管理 ,