Nginx日志管理

2025-02-26 14:12:32 597

1. 日志类型

Nginx 主要支持两种类型的日志:

  • 访问日志 (Access Logs):记录每个 HTTP 请求的详细信息。

  • 错误日志 (Error Logs):记录服务器运行过程中遇到的错误信息。

2. 配置日志位置

默认情况下,Nginx 的日志文件通常位于 /var/log/nginx/ 目录下,但你可以在配置文件中自定义日志的位置和格式。

  • 全局配置:在 httpmain 块中设置全局的日志路径:

    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

  • 虚拟主机配置:你也可以在每个 server 块中为不同的虚拟主机指定单独的日志文件:

    server {
       listen 80;
       server_name example.com;

       access_log /var/log/nginx/example.com.access.log;
       error_log /var/log/nginx/example.com.error.log;
    }

3. 日志格式

你可以自定义访问日志的格式,以包含更多或更少的信息。常用的日志格式定义如下:

  • 默认格式

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';

  • 自定义格式:例如,添加客户端 IP 和请求时间戳到日志中:

    log_format custom '$remote_addr - $remote_user [$time_local] '
                     'client:$http_x_real_ip, request_time:$request_time '
                     '"$request" $status $body_bytes_sent '
                     '"$http_referer" "$http_user_agent"';

然后在需要的地方使用这个自定义格式:

access_log /var/log/nginx/access.log custom;

4. 日志轮转(Log Rotation)

为了防止日志文件过大影响性能,通常会配置日志轮转策略。Linux 系统中常见的日志轮转工具是 logrotate

  • 配置 logrotate:创建或编辑 /etc/logrotate.d/nginx 文件来配置日志轮转规则:

    /var/log/nginx/*.log {
       daily
       missingok
       rotate 14
       compress
       delaycompress
       notifempty
       create 0640 www-data adm
       sharedscripts
       postrotate
           if [ -f /var/run/nginx.pid ]; then
               kill -USR1 `cat /var/run/nginx.pid`
           fi
       endscript
    }

/etc/logrotate.d/nginx 文件用于配置 Nginx 日志的轮转策略,确保日志文件不会无限增长,并且可以通过压缩和归档来节省磁盘空间。

路径匹配

  • /var/log/nginx/*.log:指定要轮转的日志文件模式。这里的 *.log 表示所有扩展名为 .log 的文件,即包括访问日志(access.log)和错误日志(error.log)。

轮转频率

  • daily:表示每天进行一次日志轮转。你可以根据需要更改为 weeklymonthly

处理缺失文件

  • missingok:如果指定的日志文件不存在,不报错并继续执行其他操作。这在日志文件可能被删除或重命名的情况下非常有用。

保留周期

  • rotate 14:保留最近 14 次的日志文件副本。旧的日志文件会被删除以释放磁盘空间。你可以根据实际需求调整这个数字。

压缩

  • compress:对轮转后的旧日志文件进行压缩(通常使用 gzip)。这有助于减少磁盘占用。

  • delaycompress:延迟压缩,即在下一次轮转时才压缩上一次轮转的日志文件。这确保了当前的日志文件不会立即被压缩,方便实时查看。

空文件处理

  • notifempty:如果日志文件为空,则不进行轮转。这避免了创建不必要的空日志文件。

权限设置

  • create 0640 www-data adm:创建新的日志文件时,设置其权限为 0640(读写权限仅限于文件所有者和组),文件所有者为 www-data,所属组为 adm。这对于确保日志文件的安全性和可访问性非常重要。

共享脚本

  • sharedscripts:如果多个日志文件匹配相同的配置规则,那么 postrotateendscript 中的脚本只会运行一次。这对于避免重复执行命令很有帮助。

轮转后操作

  • postrotate ... endscript:这部分定义了在每次日志轮转之后要执行的命令。具体来说:

    • if [ -f /var/run/nginx.pid ]; then:检查是否存在 Nginx 主进程的 PID 文件。

    • kill -USR1 \\cat /var/run/nginx.pid\\`:向 Nginx 发送USR1` 信号,指示它重新打开日志文件,从而开始写入新的日志文件。这是确保日志轮转生效的关键步骤。


假设今天是 2024 年 12 月 30 日,Nginx 日志轮转会在午夜触发。以下是具体的流程:

检查和轮转

  • 如果 /var/log/nginx/access.log/var/log/nginx/error.log 存在并且非空,则将它们重命名为带有日期戳的文件,例如 access.log.1error.log.1

压缩旧日志

  • 昨天的日志文件(如 access.log.1error.log.1)会被压缩成 .gz 格式,但今天的日志文件(如 access.logerror.log)暂时不会被压缩。

创建新日志文件

  • 创建新的 access.logerror.log 文件,并设置权限为 0640,所有者为 www-data,所属组为 adm

通知 Nginx

  • 向 Nginx 发送 USR1 信号,让其重新打开新的日志文件。

清理过期日志

  • 删除超过 14 天的日志文件,以释放磁盘空间。


5. 查看和分析日志

  • 实时查看日志:使用 tail 命令可以实时查看最新的日志条目:

    tail -f /var/log/nginx/access.log

  • 搜索特定内容:使用 grepawk 等工具查找特定的请求或错误:

    grep "404" /var/log/nginx/access.log
    awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

  • 使用日志分析工具:对于大规模日志分析,可以考虑使用专业的日志分析工具如 GoAccess、ELK Stack(Elasticsearch, Logstash, Kibana)、Graylog 等。

6. 调试模式下的日志

有时你需要更详细的错误信息来解决问题。可以通过修改错误日志级别来启用更详细的日志输出:

error_log /var/log/nginx/error.log debug;

这将使 Nginx 记录更多的调试信息,但请注意,生产环境中应避免长期使用 debug 级别,因为它会产生大量日志并可能影响性能。

总之,Nginx 日志是运维人员了解服务器运行状态的关键窗口。通过合理配置日志,运用日志轮转策略,熟练使用查看与分析工具,以及在必要时调整日志级别,我们能更高效地保障 Nginx 稳定运行。蓝队云作为技术支持的坚实后盾,拥有丰富资源与工具,期待与大家携手攻克更多技术难题,助力 Web 服务蓬勃发展。

提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: