飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

Docker环境下AWStats网站统计部署的流程

Author:飘易 Source:飘易
Category:网络技术 PostTime:2026/4/24 23:54:00
正 文:

本文只讲Docker部署的环境下如何安装AWStats网站统计,至于传统的LNMP环境下的部署流程,请查看:https://www.piaoyi.org/network/AWStats-website-install.html ,这里就不赘述了。


前提:docker部署了 NPM。

一、nginx配置全局 log_format (http 块)

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

此时,会进行文件轮转,测试后,可删除临时轮转文件。


二、AWStats的下载、配置

这里不说了,看之前的那篇文章。

修改 /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库里转化速度最快。


四、NPM 解析

1、确保图标文件就位

AWStats 的报告依赖图标,建议先将图标文件夹拷贝到 HTML 目录内,方便 Nginx 统一寻找:

cp -r /usr/local/awstats/wwwroot/icon /home/docker-web/wwwroot/awstats-html/awstatsicons

注意,conf配置文件里设置的是:

DirIcons="/awstatsicons"

避免默认的icons潜在的冲突,所以这里放置目录是:awstatsicons


2、NPM创建 Access List(如果还没有)

登录 NPM 后台,点击顶部菜单的 Access Lists。

点击 Add Access List。

Details 选项卡:取个名字,比如 Internal-Stats。

Authorization 选项卡:在这里添加用户名和密码(例如 admin / 你的密码)。

Access 选项卡(可选):如果你想让特定 IP(如你办公室的 IP)免密访问,可以在这里添加 allow。

点击 Save。

获取 Access List 的内部 ID:鼠标放到编辑的位置,会显示当前的ID编号。

3、npm高级配置

增加:

# 统计报告主路径
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;
}

4、访问

通过 【https://域名/__awstats-audi/】 访问你的统计了。


作者:飘易
来源:飘易
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:火山方舟豆包大模型如何对齐豆包网页版的效果?
下一篇:Docker环境Phpmyadmin的部署方式实践
0条评论 “Docker环境下AWStats网站统计部署的流程”
No Comment .
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
目 录
飘易搜索
最新文章
相关文章
随机文章
© 2007-2030 飘易博客 Www.Piaoyi.Org 版权所有 Sitemap