网站日志的默认位置

在 CentOS 上,最常见的 Web 服务器是 Apache (httpd)Nginx,它们的日志默认存储在不同的位置。

centos 网站日志
(图片来源网络,侵删)

A. Apache (httpd) 日志

Apache 的日志文件通常位于 /var/log/httpd/ 目录下。

  • 访问日志: 记录了所有对网站的请求。
    • 路径: /var/log/httpd/access_log
    • 有时也可能是 access_log_ssl 或按虚拟主机命名的日志,如 example.com_access_log
  • 错误日志: 记录了服务器运行中遇到的错误和警告信息。
    • 路径: /var/log/httpd/error_log

示例:

# 查看 Apache 访问日志
tail -f /var/log/httpd/access_log
# 查看 Apache 错误日志
tail -f /var/log/httpd/error_log

B. Nginx 日志

Nginx 的日志文件通常位于 /var/log/nginx/ 目录下。

  • 访问日志: 记录了所有对网站的请求。
    • 路径: /var/log/nginx/access.log
    • 同样,也可能有按虚拟主机命名的日志,如 example.com.access.log
  • 错误日志: 记录了服务器运行中遇到的错误和警告信息。
    • 路径: /var/log/nginx/error.log

示例:

centos 网站日志
(图片来源网络,侵删)
# 查看 Nginx 访问日志
tail -f /var/log/nginx/access.log
# 查看 Nginx 错误日志
tail -f /var/log/nginx/error.log

查看和分析日志

查看日志是排查问题、了解网站访问情况的基础。

A. 基本查看命令

  • cat: 显示整个文件内容(对于大日志文件不推荐)。

    cat /var/log/httpd/access_log
  • less: 分页显示文件内容,适合查看大文件,按 q 退出。

    less /var/log/httpd/access_log
  • more: 类似 less,但功能较少。

    centos 网站日志
    (图片来源网络,侵删)
  • head: 显示文件开头几行(默认10行)。

    head -n 50 /var/log/nginx/access.log
  • tail: 显示文件末尾几行(默认10行)。这是最常用的命令!

    # 查看最新的100行日志
    tail -n 100 /var/log/httpd/access_log
    # 实时跟踪日志文件的更新(排查实时问题的利器)
    tail -f /var/log/httpd/access_log
  • grep: 过滤日志,只显示包含特定关键词的行。

    # 查找所有包含 "404" (Not Found) 错误的访问记录
    grep " 404 " /var/log/nginx/access.log
    # 查找来自特定IP地址的访问
    grep "192.168.1.100" /var/log/httpd/access_log
    # 查找所有搜索引擎蜘蛛的访问
    grep -i "googlebot\|bingbot" /var/log/nginx/access.log

B. 高级分析工具

手动 grep 效率不高,推荐使用专业的日志分析工具。

  • GoAccess: 非常流行的实时日志分析器,可以生成美观的 HTML 报告。

    1. 安装:

      # CentOS 7/8
      yum install goaccess -y
      # CentOS Stream/RHEL 9
      dnf install goaccess -y
    2. 运行分析:

      # 分析 Nginx 访问日志并生成 HTML 报告
      goaccess /var/log/nginx/access.log -o /var/www/html/report.html --real-time-html
      # 分析 Apache 访问日志
      goaccess /var/log/httpd/access_log -o /var/www/html/report.html --real-time-html

      运行后,访问你服务器上的 http://your_server_ip/report.html 即可看到实时更新的分析报告。

  • AWStats: 另一个功能强大的日志分析工具,生成静态报告。

    1. 安装:
      yum install awstats -y
    2. 配置: 需要为每个网站配置一个 .conf 文件,通常在 /etc/awstats/ 目录下,配置文件需要修改 LogFile, SiteDomain, HostAlias 等参数。
    3. 生成报告:
      # 为 example.com 网站生成昨天的报告
      awstats -config=example.com -update

      报告通常生成在 /var/www/awstats/ 目录下。


日志切割与轮转

网站日志会不断增长,如果不加以管理,很快就会占满整个磁盘空间,日志切割(也称为日志轮转)就是将旧日志重命名并创建一个新的空日志文件,同时可以删除过期的旧日志。

A. 手动切割日志(不推荐,仅作演示)

以 Nginx 为例:

# 1. 重命名当前日志文件
mv /var/log/nginx/access.log /var/log/nginx/access.log.20251027
# 2. 向 Nginx 主进程发送 USR1 信号,让它重新打开日志文件,生成一个新的 access.log
kill -USR1 $(cat /var/run/nginx.pid)
# 3. (可选) 压缩旧的日志文件以节省空间
gzip /var/log/nginx/access.log.20251027

这个过程繁琐且容易出错,强烈建议使用自动化工具。

B. 使用 logrotate 自动化(推荐)

CentOS 系统自带了 logrotate 工具,它是一个强大的日志管理工具,可以自动完成日志的轮转、压缩和删除。

工作原理: logrotate 通常由 cron 每天执行一次,它会检查 /etc/logrotate.d/ 目录下的配置文件,并根据配置来管理日志。

Nginx 日志轮转配置示例:

创建一个配置文件 /etc/logrotate.d/nginx

vim /etc/logrotate.d/nginx
```如下:
```bash
/var/log/nginx/*.log {
    daily               # 每天轮转一次
    missingok           # 如果日志文件不存在,不报错
    rotate 7            # 保留7份旧日志
    compress            # 轮转后进行压缩,以 .gz 
    delaycompress       # 延迟一天再压缩,这样可以方便排查刚刚轮转的日志
    notifempty          # 如果日志为空,则不进行轮转
    create 640 nginx nginx # 新建的日志文件权限为 640,所有者为 nginx,组为 nginx
    postrotate
        # 轮转后,向 Nginx 发送信号,让它重新打开日志文件
        # 这里的命令路径需要根据你的系统调整
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

Apache (httpd) 日志轮转配置示例:

httpd 软件包通常会自带一个配置文件 /etc/logrotate.d/httpd通常如下:

/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /bin/systemctl reload httpd.service >/dev/null 2>&1 || true
    endscript
}

这个配置会每天轮转日志,保留最近几份,并在轮转后使用 systemctl reload httpd 命令让 Apache 重新加载日志。

你可以通过 man logrotate 查看更详细的配置选项。


日志清理与归档

对于非常旧的日志,通常不需要保留在本地,可以采取以下策略:

  1. 本地压缩归档: logrotatecompress 选项已经做了这一步。
  2. 移动到备份盘: 可以编写一个 cron 任务,将超过一定时间的日志(如 .gz 文件)移动到另一个大容量的存储设备中。
  3. 上传到远程服务器/云存储 (推荐): 这是最安全、最可靠的方式,可以编写脚本,使用 rsync, scp 或云厂商提供的 CLI 工具(如 aws s3 cp)将日志定期上传到远程服务器或对象存储(如 Amazon S3, 阿里云 OSS)。

示例 cron 任务 (每天凌晨2点执行): 编辑 crontab: crontab -e

# 每天凌晨2点,将30天前的Nginx压缩日志上传到S3
0 2 * * * /usr/bin/find /var/log/nginx/ -name "*.log.*.gz" -mtime +30 -exec aws s3 cp {} s3://my-backup-bucket/nginx-logs/ \;

这个命令会找到 /var/log/nginx 目录下所有超过30天的压缩日志,并上传到 S3 的 my-backup-bucket/nginx-logs/ 目录中。


任务 工具/方法 命令/配置
查找日志位置 文件系统知识 /var/log/httpd/ (Apache)
/var/log/nginx/ (Nginx)
实时查看日志 tail tail -f /var/log/nginx/access.log
过滤日志内容 grep grep " 404 " /var/log/httpd/access_log
生成分析报告 GoAccess, AWStats goaccess access.log -o report.html
自动轮转日志 logrotate 配置文件在 /etc/logrotate.d/
清理旧日志 find, cron, 云存储 find /var/log/ -name "*.log.*" -mtime +30 -delete

掌握这些技能,你就能有效地管理和分析 CentOS 上的网站日志,无论是排查故障还是优化网站性能都将得心应手。