用AWStats统计网站访问情况

AWStats是一款强大的日志分析工具,可以从你保存的服务器日志中分析出类似51.la统计的信息,当然,他的功能可不仅仅是web服务器的日志分析,还可以分析其他服务器比如mail服务器的日志呢。

awstats的官方安装说明繁琐了一些,其实没那么复杂的,也就下面几步。我使用的环境为ubuntu linux,apache2。

首先是awstats的安装,ubuntu直接apt就能装上了,也有用源码包或者源代码安装的,不过其实只是一些文件和perl程序而已,不用编译,放到合适的位置就可以了。/usr/share/awstats是一些语言文件、图标文件、库和插件,/etc/awstats下面是配置文件,核心程序awstats.pl放在/usr/lib/cgi-bin目录下,也就是常用的cgi程序目录,并且设置可执行权限。

然后就要对apache进行一番配置了,首先强烈建议把日志类型从默认的common更改为combined,这样日志文件会记录更详细的信息,便于分析:

CustomLog /var/log/apache2/access.log combined

如果服务器有多个虚拟主机的话,一般建议每个虚拟主机的log文件分别存放,不过awstats也能处理混合在一起的log,前提是需要使用自定义log格式,并且把在log中记录主机名,比较麻烦,不建议使用。iis系列的设定还是参照官方安装说明吧,我不熟悉。下面来设置apache,配置web访问相关的设置,根据我的环境,apache的conf中添加如下内容即可:

Alias /awstatsicons “/usr/share/awstats/icon” ScriptAlias /cgi-bin /usr/lib/cgi-bin RewriteRule ^/awstats[/]? /cgi-bin/awstats.pl [R] <Directory “/usr/lib/cgi-bin”> Options +ExecCGI </Directory>

加上那句RewriteRule我只是为了访问更方便,以前几乎没有用过cgi程序,习惯http://domain.com/awstats这样的网址了。对apache的更改其实就是cgi运行环境的设定而已。

最后,我们还要针对要统计日志的每个网站,创建配置文档。/etc/awstats/awstats.conf是默认的配置文档模板,里面所有的选项都有详细说明和例子,所以只给出我的一个配置实例(awstats.localhost.conf):

# Basic # —– # 要分析的log文件地址 LogFile=”/var/log/apache2/access.log” # W – web log file LogType=W # Log format, 1-combined, 4-common LogFormat=1 # Separator char in log file, default is ” ” LogSeparator=” ” # 主机名和别名 SiteDomain=”localhost” HostAliases=”127.0.0.1″ # DNS Lookup, 0-no, 1-full, 2-only from static dns cache DNSLookup=2 # 结果数据存放地点 DirData=”/big2/awstats_data/localhost” # AWStats web-access url DirCgi=”/cgi-bin” # 图标文件的apache虚拟目录 DirIcons=”/awstatsicons” # Allow update state from web interface, 1 to enable AllowToUpdateStatsFromBrowser=1 # Allow full-year view function AllowFullYearView=3 # Optinal # ——- # Create a lock file when update stats result, not open when no shell priv EnableLockForupdate=1 # Static DNS file DNSStaticCacheFile=”/big2/awstats_data/dnscache.txt” # 只能从以下ip地址访问 AllowAccessFromWebToFollowingIPAddresses=”127.0.0.1″ # Xhtml report file instead of html BuildReportFormat=xhtml # Purge log file after use PurgeLogFile=0 # Pic, file only marked hit and not download NotPageList=”css js class gif jpg jpeg png bmp ico swf” # Include url parameters, but count only some param URLWithQuery=1 URLWithQueryWithOnlyFollowingParameters=”” # Keep param in referrer urls URLReferrerWithQuery=1 # Show problems in setup conf file WarningMessages=1 # Use frame UseFramesWhenCGI=1 # Open report in new window,0-no, 1-except using frame, 2-always DetailedReportsOnNewWindows=1 # Show language change link ShowFlagLinks=”en cn”

常用的配置项应该就这么多,稍微重要一点的我都用中文注释上了,注意要确定log文件和储存结果的文件存在并且能够被apache用户www-data访问,配置到这里就基本上结束了,现在打开浏览器,http://localhost/awatats就可以访问了,当然默认是没有数据的,因为还没有进行分析,如果设置了相应的选项,可以从web页面直接下达更新指令,也可以使用如下命令更新:

perl /usr/lib/cgi-bin/awstats.pl -config=localhost -update

分析完成的结果就可以通过web页面观看了。

在实际应用当中,如果apache日志是不截断的,也就是说所有时间的日志都保存在access.log文件当中,虽然awstats能够自动辨识上次处理的进度,只处理新产生的那一部分日志,但堆一个大文件在这里还是会有些不方便,所以建议把apache日志截断,linux下可以直接把access.log改名,windows下则需要改名并重启apache,不然apache会很聪明的把日志写到改名以后的文件中。这样我们的log文件名中就带有日期了,在conf文件中可以这样指定:

LogFile=”/var/log/apache2/access.%YYYY-24%MM-24%DD-24.log”

在这个例子中,我的log文件名类似access.20070206.log的模式,并且把awstats.pl放到cron中,每天都自动处理前一天的日志,所以用“%YYYY-24%MM-24%DD-24”来指定24小时以前日期的年、月、日,只要7号的某个时间执行更新脚本,得到的日期就肯定是6号了。

LogFile理论上还可以识别多个log文件和gz格式的log文件,不过我也不知道怎么写才合适,只有请教过路大侠了。

参考: Configuring Awstats with Apache 2 on Ubuntu

配置Apache的ssl安全连接

环境:ubuntu 6.06, Apache 2.0.55

第一步:生成ssl certficate文件 首先当然是正常安装apache2了,然后:

sudo apache2-ssl-certificate

生成一个1024位的RSA私钥,并保存为/etc/apache2/ssl/apache.pem,如果你已经有了CA证书,应该也是可以拿过来直接使用,或者用来生成这个私钥的(这应该属于另外一个话题了,我也没有用过)。

apache2-ssl-certificate执行过程中要回答一些问题,如下,注意如果[]里已经给出了默认值,而你又想把这项置空的话,可以输入英文句号“.”:

Country Name (2 letter code) [GB]:US State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []: Organization Name (eg, company; recommended) []:. Organizational Unit Name (eg, section) []:. server name (eg. ssl.domain.tld; required!!!) []:localhost Email Address []:fwolf@mail.com

一般来说,server name和实际的网站域名还是保持一致比较方便。

第二步:启用ssl mod

sudo a2enmod ssl

或者

:/etc/apache2/mods-enabled$ sudo ln -s ../mods-available/ssl.conf ssl.conf :/etc/apache2/mods-enabled$ sudo ln -s ../mods-available/ssl.load ssl.load

第三步:添加监听端口,配置虚拟主机 添加端口:在/etc/apache2/ports.conf中增加一行“Listen 443”,显然,如果你想让默认的80端口就使用ssl的话,就可以省略这一步了,并在后面的配置中略微调整。

在apache虚拟主机的配置文件conf中,段,添加SSL的定义,比如:

<VirtualHost *:443> ServerAdmin Fwolf ServerName www.fwolf.com SSLEngine On SSLCertificateFile /etc/apache2/ssl/apache.pem DirectoryIndex index.php index.html index.html.var

然后重启apache,就能够使用https访问网站了。

如果想配置成80端口默认就使用https,首先不需要在ports.conf中添加443端口的监听了,其次是在配置VirtualHost的时候也不用带上:443了,但即使这样,配置完成后使用http://www.domain.com访问配置好的网站时,还是会提示:

Bad Request Your browser sent a request that this server could not understand. Reason: You’re speaking plain HTTP to an SSL-enabled server port. Instead use the HTTPS scheme to access this URL, please. Hint: https://www.fwolf.com/

这是由于使用http协议去访问一个https的端口造成的,最简单的解决方法是使用https://www.domain.com:80/来替代,不过,通过修改apache配置,把到80端口的http访问重定向到443端口的https访问效果会更好一些,就像下面的配置:

NameVirtualHost *:80 <VirtualHost *:80> Redirect permanent / https://localhost/ </virtualhost> NameVirtualHost *:443 <VirtualHost *:443> ServerAdmin Fwolf ServerName www.fwolf.com </virtualhost> SSLEngine On SSLCertificateFile /etc/apache2/ssl/apache.pem …

这样所有http访问就自动被重定向到https访问上了,不过如果你只能在外网开一个端口的话就比较麻烦了,同时https也只能包含一个站点(无法通过ServerName辨识多个站点)。

如果能够把http和https协议同时绑定到一个端口上,用户访问的时候似乎就更方便了,不过很多地方都说这是不可能的,加密与明文协议不可能同时存在于一个端口上,这里有个讨论给出了一种方案,虽然经过我的实验并不成功,还是把代码贴出来,供有兴趣的朋友继续研究。

<IfDefine !SSL> RewriteEngine on RewriteCond %{HTTPS} != on RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=permanent] </IfDefine>

一个小问题:我生成的pem文件怎么有效期都只有一个月?难道这是默认的?pem文件到期之后会发生什么事情呢?

update @ 20070126

默认生成的pem文件确实只有一个月的有效期,过期之后倒是还能使用,只是在客户端会有一个提示证书无效的确认,所以在生成证书的时候,记得用-day x参数指定有效期限,比如十年什么的。

sudo apache2-ssl-certificate –force -days 3650

(当pem文件已经存在的时候,需要使用–force参数指定覆盖)

参考: Need Apache2 SSL howto Apache2 SSL You’re speaking plain HTTP to an SSL-enabled server port. – HELP PLEASE !

Update @ 2007-07-31

Ubuntu 7.04 feisty中没有apache2-ssl-cerfiticate这个命令,需要自己下载一个包,然后解压,把里面的ssleay.cnf拷贝到/usr/share/apache2/,然后就可以执行解压的另外一个可执行文件apache2-ssl-certificate来生成证书了。

参见:

Apache文件权限设定的小窍门

通过这篇文章中的这件事,让我对linux下apache的设置和linux的权限机制有了进一步的了解,虽然原理是很简单的,但长期使用windows服务器的同志们未必就会知道。

情况是这样的,我这里为了日常调试程序方便,对程序文件有两个小要求,一是最好保存在home目录下,便于操作,二是文件的owner最好还是用户我,而不是apache,但要求既能够正常编辑,由能够正常的运行(在apache下,web访问)。因此,在home目录下建立了一个目录php,并且在apache中新建了一个别名Alias指向/home/fwolf/php目录。重启apache让设置生效后,却发现访问http://localhost/php返回“403 Forbidden”拒绝访问错误,问题到底出在哪里呢?

首先估计到应该是访问权限的问题,php目录默认的权限是755,owner为fwolf:fwolf,而apache是以用户www-data的身份运行的,所以编辑/etc/group文件,把用户www-data加到了fwolf组中,重新尝试访问,依然是403错误。进一步估计www-data用户的权限设置没有错,问题产生在其他地方。

进一步通过google查询之后,找到了一种调试权限的好方法:先su到root用户,再su www-data切换到www-data的用户环境,直接访问目标文件看是否“Permission denied”(以前怎么就想不到呢)。结果如下:

$ su Password: # su www-data sh-3.1$ ls ls: .: Permission denied sh-3.1$ cd /home/fwolf sh: cd: /home/fwolf: Permission denied sh-3.1$ cd /home/fwolf/php sh: cd: /home/fwolf/php: Not a directory

果然,虽然php目录的权限是755,按理说www-data应该能够访问的,但这时却不行,继续查找原因。。。原来问题出在了php目录的上级目录/home/fwolf上:

drwx—— 36 fwolf fwolf 4096 2006-08-27 15:53 fwolf

原来,上级目录/home/fwolf只允许用户fwolf本人访问,www-data虽然能够访问下级目录php,但无法“通过”上级目录,自然会产生403错误了。所以把/home/fwolf的权限更改为750,同时www-data已经被加到了fwolf组中,apache访问就正常了。

补充说明:linux系统中,目录的权限要有x才能进入。

Apache的Order Allow Deny心得

今天又被这两个参数小小的耍了一把,痛下决心整理一下,免得再被耽误时间。

Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用来控制目录和文件的访问授权。

所以,最常用的是:

	Order Deny,Allow
	Allow from All

注意“Deny,Allow”中间只有一个逗号,也只能有一个逗号,有空格都会出错;单词的大小写不限。上面设定的含义是先设定“先检查禁止设定,没有禁止的全部允许”,而第二句没有Deny,也就是没有禁止访问的设定,直接就是允许所有访问了。这个主要是用来确保或者覆盖上级目录的设置,开放所有内容的访问权。

按照上面的解释,下面的设定是无条件禁止访问:

	Order Allow,Deny
	Deny from All

如果要禁止部分内容的访问,其他的全部开放:

	Order Deny,Allow
	Deny from ip1 ip2

或者

	Order Allow,Deny
	Allow from all
	Deny from ip1 ip2

apache会按照order决定最后使用哪一条规则,比如上面的第二种方式,虽然第二句allow允许了访问,但由于在order中allow不是最后规则,因此还需要看有没有deny规则,于是到了第三句,符合ip1和ip2的访问就被禁止了。注意,order决定的“最后”规则非常重要,下面是两个错误的例子和改正方式:

	Order Deny,Allow
	Allow from all
	Deny from domain.org

错误:想禁止来自domain.org的访问,但是deny不是最后规则,apache在处理到第二句allow的时候就已经匹配成功,根本就不会去看第三句。 解决方法:Order Allow,Deny,后面两句不动,即可。

	Order Allow,Deny
	Allow from ip1
	Deny from all

错误:想只允许来自ip1的访问,但是,虽然第二句中设定了allow规则,由于order中deny在后,所以会以第三句deny为准,而第三句的范围中又明显包含了ip1(all include ip1),所以所有的访问都被禁止了。 解决方法一:直接去掉第三句。 解决方法二:

	Order Deny,Allow
	Deny from all
	Allow from ip1

我的apache日志和php errorlog哪里去了?

由于ubuntu改变了apache的conf文件布局,所以有些配置容易被漏掉。

默认情况下:apache.conf中只定义了apache的error文件: ErrorLog /var/log/apache2/error.log 注意,没有access.log的指定,而是将其转移到了sites-enabled/000-default文件中: LogLevel warn CustomLog /var/log/apache2/access.log combined

可是在我们禁用000-default文件,自己编写配置文件的时候,就很容易忘记access.log文件的定义,因为在其他系统中这一项是默认就有的。

php的errorlog则更奇怪,由于我习惯把php的errorlog放在/var/log目录下,所以很快就发现了这一问题:当我把php的errorlog删除(让系统自动重新生成新的文件)之后,却怎么也都不会自动生成这个文件了,左查右找,却发现原本应该在php的errorlog中的错误信息却跑到了apache的error.log中。原来如果指定的php的errorlog文件不可写(/var/log目录权限要求较高),apache就会把php的errorlog信息写入apache的error.log文件中。新建一个空的php errorlog文件,更改属性为777之后,问题解决。属性更改为755都不行,不知道为什么这么多的操作都要求x权限作什么。

Ubuntu下的apache2怪怪的

以前一直都是在win下使用apache,感觉比较熟悉了,现在突然转到linux或者说是ubuntu下,觉得有了很大的变化,不知道是apache2升级成这样了,还是ubuntu使然。

安装很简单,apt-get install apache2, apt-get install php5就ok啦,默认的localhost主页指向/var/www,下面再有一个目录apache2-default里面存放的才是原先的各种语言的index欢迎页面。

配置文件win下面就是一个httpd.conf搞定,现在复杂了一些: ubuntu中配置文件在/etc/apache2下,apache2.conf是全局配置或者说是主配置文件,httpd.conf是用户配置文件,感觉和用php编写程序时经常用config.php覆盖config.default.php文件中的设置是一样的,用户设置独立出来,方便管理和备份,毕竟主配置文件很少修改,偶尔修改一两句也可以写到httpd.conf里面,备份方便。

/etc/apache2下面除了两个配置文件以外,还有4个目录以前没见过,并且应该经常用到: sites-available – 已定义的虚拟主机设置 sites-enabled – 已激活的虚拟主机 mods-available – 已经安装了的模块module mods-enabled – 已经激活了的模块 一般来说,只要在enabled目录下ln建一个available目录下相应主机设置或者模块的连接,就相当于激活或者说启用了该虚拟主机或模块。乍一看有点麻烦,仔细想想确实对于管理来说方便了很多。

至于ln以后应当如何配置,也有例子可参考,默认安装就会生成一个虚拟主机NameVirtualHost *的设置文件,对应文件是sites-enabled/000-default,其实链接到文件sites-available/default,文件内容的语法和原来的httpd.conf是一样的。至于模块,也类似,比如我安装了php5之后,mods-enabled下就有了一个 php5.load(链接到mods-available/php5.load),文件内容就是一句:LoadModule php5_module /usr/lib/apache2/modules/libphp5.so,同时还有一个链接文件php5.conf,应该就是php5的相关设置了,内容也非常简单:

<IfModule mod_php5.c> AddType application/x-httpd-php .php .phtml .php3 AddType application/x-httpd-php-source .phps </IfModule>

有了这些文件作参考,配置虚拟主机或者加载模块的时候就可以照葫芦画瓢了。并且这个时候如果还按照以前的语法在httpd.conf中加载模块的话(LoadModule dir_module /usr/lib/apache2/modules/mod_dir.so),启动apache时会提示错误并失败:

* Starting apache 2.0 web server… Syntax error on line 20 of /etc/apache2/httpd.conf: module dir_module is built-in and can’t be loaded [fail]

建立链接时好像使用软链接即可。

root@wf:/etc/apache2# ll mods-enabled/ total 0 lrwxrwxrwx 1 root root 36 2006-05-11 14:07 cgi.load -> /etc/apache2/mods-available/cgi.load lrwxrwxrwx 1 root root 37 2006-05-11 14:07 php5.conf -> /etc/apache2/mods-available/php5.conf lrwxrwxrwx 1 root root 37 2006-05-11 14:07 php5.load -> /etc/apache2/mods-available/php5.load lrwxrwxrwx 1 root root 28 2006-05-11 18:27 proxy.load -> ../mods-available/proxy.load lrwxrwxrwx 1 root root 30 2006-05-11 18:27 rewrite.load -> ../mods-available/rewrite.load

另外发现一个小问题,我把000-default改名为000-default.disabled以后,却依然生效,但是改成000-default#disabled就无效了,这和apache2.conf中的“Include /etc/apache2/sites-enabled/[^.#]*”有些不一致,但是问题不知出在哪里。不过我的做法更简单一些,也更保留了以前的操作习惯:

vi apache2.conf … # Include the virtual host configurations: #Include /etc/apache2/sites-enabled/[^.#]* Include /etc/apache2/fwolf.conf

这样所有的配置都在一个文档中了,备份的时候方便,适合于简单配置的网站。

还有,配置虚拟目录的时候如果涉及到了第二块硬盘或者其他挂载设备(非linux格式分区,不含有linux格式权限信息的分区格式),apache2默认使用的用户www-data是无法访问的,虽然配置脚本不会报错,但是无论怎么访问都会产成403 Forbidden错误,解决的方法是把用户www-data添加到相应的用户组里面去:

usermod -a -G plugdev www-data

其他形式的无权限情况也可以根据其owner,按照上述方法进行相应设置。

当然还要注意ubuntu基本上是全unicode的,文件和编辑器都是utf-8编码,所以如果以前的网页文件是gb2312编码的,需要转换成utf8格式才能正确显示:

$ mkdir /tmp/iconv_t $ for I in * > do > iconv $I -fgb2312 -tutf-8 -o/tmp/iconv_t/$I > done $cp /tmp/iconv_t/* .

以上只是使用iconv批量转换文件的一个小例子。