本文只讲Docker部署的环境下如何安装AWStats网站统计,至于传统的LNMP环境下的部署流程,请查看:https://www.piaoyi.org/network/AWStats-website-install.html ,这里就不赘述了。
前提:docker部署了 NPM。
NPM 预留了一个专门的加载点,会自动包含 /data/nginx/custom/http_top.conf 中的内容到 http {} 块内。
在宿主机进入你挂载的 ./npm/data 目录并创建文件夹 ./npm/data/nginx/custom/http_top.conf 。
http_top.conf 文件:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
注意:NPM 默认可能已经定义了某些格式,如果报错变量冲突,请尝试换个名字如 main_custom。
宿主机创建 wwwlogs 目录,日志挂载(./wwwlogs:/wwwlogs):
# 3. 反向代理与 SSL 管理器 (NPM) 已经包含了 Nginx nginx-proxy: image: 'jc21/nginx-proxy-manager:latest' container_name: nginx_proxy restart: always ports: - '80:80' # HTTP 端口 - '443:443' # HTTPS 端口 - '60081:81' # 管理后台端口 volumes: - ./npm/data:/data - ./npm/letsencrypt:/etc/letsencrypt - ./wwwroot:/www - ./wwwlogs:/wwwlogs # 日志挂载 depends_on: - php74 - db
修改用户组和权限
chown -R 82:82 /home/docker-web/wwwlogs/
NPM里目标域名下,自定义配置增加:
access_log /wwwlogs/audi.com/access.log main;
logrotate 轮换日志
文件:/etc/logrotate.d/audi.com,文件内容为
/home/docker-web/wwwlogs/audi.com/access.log {
su root root
monthly
dateformat -%Y%m
dateext
rotate 99999
missingok
compress
delaycompress
notifempty
create 0644
sharedscripts
postrotate
docker exec nginx_proxy nginx -s reopen
endscript
}docker时,注意有区别。
logrotate测试:
-d (debug) 模式,实际上文件不会真的被切分
logrotate -df /etc/logrotate.d/audi.com
返回类似下面的就是成功了:
running postrotate script running script with args /home/docker-web/wwwlogs/audi.com/access.log : " docker exec nginx_proxy nginx -s reopen "
logrotate 现在请执行最后一次“真刀真枪”的操作: -vf
logrotate -vf /etc/logrotate.d/audi.com
返回类似字眼即可:
running postrotate script
此时,会进行文件轮转,测试后,可删除临时轮转文件。
这里不说了,看之前的那篇文章。
修改 /etc/awstats/awstats.yourdomain.conf 配置文件。
这是正常的测试生成 txt 格式的数据库:
perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=audi -update -LogFile="/home/docker-web/wwwlogs/audi.com/access.log"
但是我们docker下没有部署apache,也不想部署fcgi模块,可以直接把统计生成html形式的报告,让nginx解析即可。
创建目录: /home/docker-web/wwwroot/awstats-html/audi
生成静态报告 测试指令:
perl /usr/local/awstats/tools/awstats_buildstaticpages.pl -config=audi -update -dir=/home/docker-web/wwwroot/awstats-html/audi -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl
返回:
24 files built. Main HTML page is 'awstats.audi.html'.
您可以创建一个脚本(例如 awstats.sh)来执行统计工作:
#!/bin/bash
# AWStats 配置文件名 awstats.[KEY].conf
CONF_FILE="audi"
# 日志文件目录
LOG_DIR="/home/docker-web/wwwlogs/audi.com"
# AWStats 执行脚本的实际路径
AWSTATS_PL="/usr/local/awstats/wwwroot/cgi-bin/awstats.pl"
AWSTATS_HTML_PL="/usr/local/awstats/tools/awstats_buildstaticpages.pl"
# 临时日志
TEMP_LOG_LIST="/tmp/awstats_log_${CONF_FILE}.txt"
HTML_DIR="/home/docker-web/wwwroot/awstats-html/audi"
# 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
# 静态化命令:直接把数据库转成 HTML!!!
# 注意:-dir 参数指向你 NPM 映射的那个 HTML 目录
perl $AWSTATS_HTML_PL -config=$CONF_FILE -dir=$HTML_DIR -awstatsprog=$AWSTATS_PL
echo "$(date) - AWStats update successful for $CONF_FILE."
else
echo "$(date) - AWStats update FAILED for $CONF_FILE."
fi
# 清理临时文件
rm -f "$TEMP_LOG_LIST"注意,步骤是先生成 txt 数据库,然后再转成 html,此时就不要加 -update 参数了,直接从第一步txt库里转化速度最快。
AWStats 的报告依赖图标,建议先将图标文件夹拷贝到 HTML 目录内,方便 Nginx 统一寻找:
cp -r /usr/local/awstats/wwwroot/icon /home/docker-web/wwwroot/awstats-html/awstatsicons
注意,conf配置文件里设置的是:
DirIcons="/awstatsicons"
避免默认的icons潜在的冲突,所以这里放置目录是:awstatsicons
登录 NPM 后台,点击顶部菜单的 Access Lists。
点击 Add Access List。
Details 选项卡:取个名字,比如 Internal-Stats。
Authorization 选项卡:在这里添加用户名和密码(例如 admin / 你的密码)。
Access 选项卡(可选):如果你想让特定 IP(如你办公室的 IP)免密访问,可以在这里添加 allow。
点击 Save。
获取 Access List 的内部 ID:鼠标放到编辑的位置,会显示当前的ID编号。

增加:
# 统计报告主路径
location /__awstats-audi/ {
alias /www/awstats-html/audi/; # 注意:这里要用 alias,并且末尾带斜杠
index awstats.audi.html;
auth_basic "Restricted Area";
# 这里的路径是 NPM 容器内部存放 Access List 密码的路径,2 就是上面的Access List 的内部 ID
auth_basic_user_file /data/access/2;
}
# 统计报告图标 - 使用 ^~ 强制匹配,阻止正则干扰
location ^~ /awstatsicons/ {
alias /www/awstats-html/awstatsicons/;
access_log off;
expires 30d;
}统计报告的图片要放在默认的静态文件规则之前,防止被优先级覆盖:
# 强制让 Nginx 处理静态资源,不走 PHP
location ~* \.(jpg|jpeg|gif|png|css|js|ico|webp|tiff|gz|svg|svgz|zip|rar|7z|exe|mp3|mp4|ogg|ogv|woff|woff2|ttf)$ {
access_log off;
expires 30d;
try_files $uri =404;
}通过 【https://域名/__awstats-audi/】 访问你的统计了。