AWStats 是一款免费且强大的网站流量数据统计分析工具。它最主要的特点是:
基于服务器日志文件 (Log File): AWStats 不是通过在网页中嵌入代码(像 Google Analytics 那样)来收集数据,而是直接读取网站服务器产生的原始访问日志文件。这意味着它能提供最接近服务器端、最真实的流量数据。
提供原始数据视角: 它可以分析出包括搜索引擎爬虫(蜘蛛)的访问、恶意机器人或垃圾流量、以及详细的 HTTP 错误代码等,这些数据对于网站安全维护和技术层面的分析非常有价值,是许多传统站长工具或 GA 难以全面获取的。
报告内容丰富: 它可以统计访问量、唯一访问者、页面、点击次数、访问时长、来源国家/地区、关键词、浏览器、操作系统、文件下载等多种信息。
图形化报告: 尽管它是基于日志的,但它也能生成易于理解的图表和报告。
简单来说,如果您是网站管理员或运维人员,需要从技术和服务器层面了解最真实的流量构成(包括各种爬虫和异常访问),AWStats 是一个非常实用的工具。
这篇文章,飘易就简单介绍下 AWStats 部署的流程,飘易的VPS系统是 Centos 7.9,web环境部署的LNMPA架构,具体套件是:
Mysql 5.7
PHP 7.4
Apache 2.4
如果之前没启用日志,这里需要微调。
/usr/local/nginx/conf/nginx.conf,修改:
# 在 http {} 块中定义 main 的日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';Nginx 变量 AWStats 对应信息 作用:
$remote_addr客户端 IP至关重要,用于独立访客、国家/地区统计。 $remote_user认证用户用于统计认证(Auth)用户访问。 [$time_local]访问时间用于时间、日期、高峰时段统计。 "$request"请求 URL/页面用于页面、入口/出口统计。 $statusHTTP 状态码用于错误页(4xx/5xx)和成功访问(2xx)统计。 $body_bytes_sent发送字节数用于带宽/流量统计。 "$http_referer"引用页 (Referer)用于来源网站和搜索引擎统计。 "$http_user_agent"用户代理 (User-Agent)用于浏览器、操作系统、机器人统计。 "$http_x_forwarded_for"真实客户端 IP(可选,但在多层代理时重要) 如果您的 VPS 前面还有 CDN 或其他负载均衡器,此字段会记录最真实的客户端 IP。
/usr/local/nginx/conf/vhost/www.bearing.com.conf 里面启用日志:
access_log /home/wwwlogs/www.bearing.com/access.log main;
注意,这里wwwlogs下的域名目录需要手工创建( /home/wwwlogs/www.bearing.com/),否则nginx报错:
[emerg] 833#0: open() "/home/wwwlogs/www.bearing.com/access.log" failed (2: No such file or directory)
access.log 文件系统会自动创建,但目录不会。
access.log 默认的所有者是 root
如果需要修改为 www 用户和组,执行:
chown -R www:www /home/wwwlogs/
logrotate 实现每个月轮换1个文件 (CentOS 7 安装中,logrotate 几乎总是默认安装的)
检查 logrotate 是否已安装:
rpm -q logrotate
如果已安装,它将返回版本号。
logrotate 简介
logrotate 是一个 Linux/Unix 系统工具,用于自动化管理系统和应用程序的日志文件。
核心作用
它通过一系列预设的规则,自动对日志文件进行:
轮换(Rotate): 将当前正在写入的日志文件重命名,然后创建一个新的空文件供服务继续写入。
压缩(Compress): 将旧的日志文件压缩以节省磁盘空间。
删除(Remove): 根据设定的保留策略,删除最旧的归档日志。
主要好处
节省磁盘空间: 防止日志文件无限增长,耗尽硬盘。
提高系统性能: 保持日志文件大小适中,方便读写和分析。
自动化管理: 无需手动干预,维护工作变得简单高效。
创建文件:/etc/logrotate.d/www.bearing.com,文件内容为:
/home/wwwlogs/www.bearing.com/access.log {
# 轮换频率
monthly
# 关键:使用 年份 (%Y) 和 月份 (%m) 作为日期格式
# 轮换后的文件名将是:access.log-202512
dateformat -%Y%m
dateext
# 设置一个极大的值(例如 99999),实现不自动删除日志
rotate 99999
missingok # 如果文件不存在,不报错
compress # 压缩旧日志文件(强烈建议,旧日志文件压缩成 .gz 格式)
delaycompress # 延迟压缩,直到下一次轮换
notifempty # 如果日志文件是空的,不进行轮换
create 0644 www www # 轮换后创建新文件,并指定所有者和权限
sharedscripts
postrotate
# 通知 Nginx 重新打开新的日志文件
/usr/local/nginx/sbin/nginx -s reopen
endscript
}轮换后的日志大概如下:
当前日志:/home/wwwlogs/www.bearing.com/access.log
最近一次轮换 (未压缩):/home/wwwlogs/www.bearing.com/access.log-YYYYMM
更早的轮换 (已压缩):/home/wwwlogs/www.bearing.com/access.log-YYYYMM.gz
AWStats 的工作方式是,它会读取您指定的日志文件,然后将统计结果保存在一个数据库文件(通常是 .txt 格式)中。为了统计所有历史日志,您需要在执行 AWStats 更新时,让它能够找到并处理所有历史日志文件。
准备工作:Perl 解释器(大多数 Linux/Unix 系统默认安装)、Web 服务器(如 Apache、Nginx、IIS 等)
下载: 从 AWStats 官方网站 https://www.awstats.org/ 下载最新的稳定版本。
解压: 将下载的压缩包解压到你服务器上一个合适的位置,例如 /usr/local/awstats。
配置 AWStats:
AWStats 的配置文件通常位于 wwwroot/cgi-bin/awstats.model.conf。
复制模型文件并重命名为你想要分析的网站域名:/etc/awstats/awstats.yourdomain.conf
修改 awstats.yourdomain.conf:
# 站点域名 - 必须设置,用于识别内部链接和外部链接 SiteDomain="www.bearing.com" # 日志文件路径 - 虽然会被命令行覆盖,但作为备份设置 LogFile="/home/wwwlogs/www.bearing.com/access.log" # 日志格式定义: # 必须自定义以匹配您的 Nginx 'main' 格式,该格式包含额外的 $http_x_forwarded_for 字段。 # %extra1 专门用于匹配这个额外的 XFF 字段。 LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot %extra1" # 主机别名列表 (用于将这些域名和IP视为同一站点) HostAliases="bearing.com www.bearing.com localhost 127.0.0.1 REGEX[bearing\.com$]" # 生成的txt数据库记录存放位置,使用绝对路径,请确保创建了该目录 DirData="/usr/local/awstats/wwwroot/data" # DNS 解析,通常保持 0 (禁用) 以加快更新速度 DNSLookup=0 # 统计报告的语言 (cn 为简体中文) Lang="cn" # 图标目录 DirIcons="/awstatsicons" # 启用GEOIP插件(国家、城市) LoadPlugin="geoip2_country /usr/local/awstats/geoip/GeoLite2-Country.mmdb" LoadPlugin="geoip2_city /usr/local/awstats/geoip/GeoLite2-City.mmdb"
其中GEOIP数据库来自MaxMind ,MaxMind GeoLite2 中的 City、Country 等 mmdb 数据库文件下载链接,项目地址:
https://github.com/P3TERX/GeoLite.mmdb/releases
上传服务器的目录:/usr/local/awstats/geoip/GeoLite2-Country.mmdb | GeoLite2-City.mmdb
Perl依赖的模块是:GeoIP2::Database::Reader (from Maxmind)
centos先安装包管理器:
yum install perl-CPAN # 安装cpan yum install perl-libwww-perl # 安装 LWP 及其依赖 (处理 HTTP 请求)
查看cpan是否安装:cpan
安装插件GeoIP2:
cpan install GeoIP2::Database::Reader (系统会编译一些gcc工具,很慢,耐心等待) cpan install JSON::XS #解析时,需要这个模块
查看您的系统上通过 CPAN 安装了哪些 Perl 模块,先进入(cpan)提示符:
m /./ #提示符下输入 m /./,这将列出所有已安装的模块
返回:
m GeoIP2::Database::Reader #查看指定模块 Reading '/root/.cpan/Metadata' Database was generated on Tue, 02 Dec 2025 07:41:01 GMT Module id = GeoIP2::Database::Reader CPAN_USERID MAXMIND (MaxMind, Inc. <support@maxmind.com>) CPAN_VERSION 2.006002 CPAN_FILE M/MA/MAXMIND/GeoIP2-2.006002.tar.gz UPLOAD_DATE 2019-06-18 MANPAGE GeoIP2::Database::Reader - Perl API for GeoIP2 databases INST_FILE /usr/local/share/perl5/GeoIP2/Database/Reader.pm INST_VERSION 2.006002 <-----------出现安装的版本即为安装成功!!
m JSON::XS Reading '/root/.cpan/Metadata' Database was generated on Tue, 02 Dec 2025 07:41:01 GMT Module id = JSON::XS CPAN_USERID MLEHMANN (Marc A. Lehmann <cpan@schmorp.de>) CPAN_VERSION 4.04 CPAN_FILE M/ML/MLEHMANN/JSON-XS-4.04.tar.gz UPLOAD_DATE 2025-09-08 MANPAGE JSON::XS - JSON serialising/deserialising, done correctly and fast INST_FILE /usr/local/lib64/perl5/JSON/XS.pm INST_VERSION 4.04 <-----------出现安装的版本即为安装成功!!
【临时测试】:
perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=bearing -update -LogFile="/home/wwwlogs/www.bearing.com/access.log"
config参数:
AWStats 在运行 awstats.pl 时,会按照以下规则查找配置文件:
它会查找一个预定义的配置目录(通常是 /etc/awstats/ 或 /usr/local/awstats/wwwroot/cgi-bin/ 的父目录)。
它会在该目录下寻找名为 awstats.【你的config值】.conf 的文件。
【定时任务】:
您可以创建一个脚本(例如 awstats.sh)来执行统计工作:
#!/bin/bash
# AWStats 配置文件名 awstats.[KEY].conf
CONF_FILE="bearing"
# 日志文件目录
LOG_DIR="/home/wwwlogs/www.bearing.com"
# AWStats 执行脚本的实际路径
AWSTATS_PL="/usr/local/awstats/wwwroot/cgi-bin/awstats.pl"
# 临时日志
TEMP_LOG_LIST="/tmp/awstats_log_${CONF_FILE}.txt"
# 1. 找到所有压缩的旧日志文件 (access.log-*.gz)
GZ_LOGS=$(find "$LOG_DIR" -maxdepth 1 -type f -name "access.log-*.gz" | sort -V)
# 2. 找到所有未压缩的当前和旧日志文件 (access.log 和 access.log-YYYYMM)
PLAIN_LOGS=$(find "$LOG_DIR" -maxdepth 1 -type f \( -name "access.log" -o -name "access.log-*" ! -name "*.gz" \) | sort -V)
# 3. 清空目标文件
> "$TEMP_LOG_LIST"
# 4. (可选) 处理压缩文件 (如果存在)
if [ -n "$GZ_LOGS" ]; then
echo "$GZ_LOGS" | tr ' ' '\n' | xargs zcat >> "$TEMP_LOG_LIST" 2>/dev/null
fi
# 5. 处理纯文本文件 (包括当前的 access.log)
if [ -n "$PLAIN_LOGS" ]; then
echo "$PLAIN_LOGS" | tr ' ' '\n' | xargs cat >> "$TEMP_LOG_LIST" 2>/dev/null
fi
# 运行 AWStats
# AWStats 能够识别文件后缀并处理未压缩或 .gz 压缩文件。
# -LogFile="$TEMP_LOG_LIST" 告诉 AWStats 从临时文件中读取要分析的文件列表。
# -config=$CONF_FILE 指定 AWStats 使用哪个站点的配置文件。
# -LogFormat=1 智能对应 Nginx 的标准 combined 格式。这里不定义,放AWStats配置文件里定义!
perl $AWSTATS_PL -config=$CONF_FILE -update -LogFile="$TEMP_LOG_LIST"
# 检查 AWStats 是否运行成功 (可选,用于 Cron Job 监测)
if [ $? -eq 0 ]; then
echo "$(date) - AWStats update successful for $CONF_FILE."
else
echo "$(date) - AWStats update FAILED for $CONF_FILE."
fi
# 清理临时文件
rm -f "$TEMP_LOG_LIST"cron 定期运行 .sh 脚本
通过这个脚本,AWStats 会逐个读取列表中的所有日志文件,将它们合并统计到同一个数据库中(awstats.yourdomain.txt),从而实现统计所有历史日志数据的目标。 请确保这个脚本是通过 cron 定期运行的。
#crontab -l 先查看当前的任务列表 #crontab -e 编辑(实际位置:/var/spool/cron) # 每天 1:0 运行一次,更新统计 # 指定解释器 sh(脚本无需执行权限);若无sh,则需赋予脚本执行权限:chmod +x 名称.sh 0 1 * * * sh /etc/awstats/awstats.bearing.sh >/dev/null 2>&1
Nginx 配置:
只需增加图片配置
# awstats : Nginx 直接处理图片 (DirIcons="/awstatsicons")
# 使用 ^~ 确保优先级高于其他正则匹配,且放在通用图片规则前面
location ^~ /awstatsicons/ {
alias /usr/local/awstats/wwwroot/icon/;
expires 30d;
break;
}Apache 全局配置 httpd.conf
LoadModule cgid_module modules/mod_cgid.so # 取消注释,加载cgi模块 <IfModule cgid_module> # ScriptSock: On threaded servers, designate the path to the UNIX # socket used to communicate with the CGI daemon of mod_cgid. ScriptSock /tmp/httpd-cgisock </IfModule>
Apache 局部配置(vhost)增加:
# AWStats 配置 AddHandler cgi-script .pl ScriptAlias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/" <Directory "/usr/local/awstats/wwwroot/cgi-bin"> Options +ExecCGI AllowOverride None # --- Basic Auth 认证配置开始 --- AuthType Basic AuthName "Auth Login" # 指定密码文件的路径 AuthUserFile /etc/awstats/.htpasswd # 仅指定用户可以访问--修改成实际用户!! Require user bearing # --- Basic Auth 认证配置结束 --- </Directory>
Apache 添加 Basic Auth 认证:
首个用户 -c:
/usr/local/apache/bin/htpasswd -c /etc/awstats/.htpasswd bearing
第2个用户(不能用c参数,会覆盖):
/usr/local/apache/bin/htpasswd /etc/awstats/.htpasswd bearing2
web端访问网址:
https://www.piaoyi.org/awstats/awstats.pl?config=bearing
config传递具体的参数即可。