介绍

Nginx的日志管理是一个重要的功能,它允许用户跟踪和监控Nginx服务器的运行状态和性能。以下是Nginx日志管理的关键点:

日志类型:

  • 访问日志(Access Log):记录每个请求的信息,包括客户端IP、请求时间、请求方法、URI、状态码、发送字节数等。通过访问日志,得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息。
  • 错误日志(Error Log):记录Nginx服务运行期间发生的错误信息和警告信息。通过错误日志,得到系统某个服务或server的性能瓶颈等信息。

日志配置:

  • 通过修改Nginx的配置文件(通常是nginx.conf)来定义日志的位置和格式。例如,使用access_log和error_log指令来分别指定访问日志和错误日志的文件路径。
  • Nginx还允许通过log_format指令定义自定义的日志格式。根据需要记录特定的信息。
  • Nginx允许我们根据需要定义自定义的日志变量和字段。记录与特定请求或响应相关的特定信息,以便后续分析和调试。

日志轮转、压缩与删除:

  • 为了管理旧的日志文件并节省磁盘空间,结合使用logrotate工具来定期压缩和删除旧的日志文件。
  • logrotate可以根据需求配置为每天、每周或每月执行一次压缩和删除操作。
  • Nginx支持日志轮转功能,这意味着它可以在达到一定的文件大小或时间限制时自动创建新的日志文件。这有助于防止日志文件变得过大并耗尽磁盘空间。

日志分析:

  • 可以使用各种日志分析工具(如ELK Stack、Graylog等)来分析和可视化Nginx的日志数据。
  • 这些工具可以让我们更好地理解Nginx的运行状态、性能瓶颈以及用户行为等。

安全性:

  • 确保Nginx的日志文件仅对需要访问它们的用户开放。不要将日志文件暴露给未经授权的用户或攻击者。
  • 使用适当的权限设置来保护日志文件,以防止未经授权的访问和修改。

总之,Nginx的日志管理功能非常强大和灵活,可以帮助我们更好地了解Nginx的运行状态、性能以及用户行为。通过合理配置和分析日志数据,可以及时发现和解决问题,优化Nginx的性能和安全性。

日志类型

当前nginx的logs目录

[root@RockyLinux9 ~]# ls /usr/local/nginx/logs/
access.log  error.log  nginx.pid
# 访问日志    错误日志

日志配置

1. 查看配置文件nginx.conf

[root@RockyLinux9 nginx]# cat conf/nginx.conf
...
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
...
http {
    ...
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';


    #access_log  logs/access.log  main;
    ...
    server {
        ...
        #access_log  logs/host.access.log  main;
    }
}

2. 访问日志:Access Log

2.1. 配置文件中未启用,则使用默认配置。

Syntax:

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;

Default:

access_log logs/access.log combined;

Context:

http, server, location, if in location, limit_except

如配置文件中配置
#access_log  logs/host.access.log  main;
  声明log      log位置及命名        log格式

官方说明:

http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log

2.2. format:定义访问日志的格式,配置文件中未启用,则使用默认配置。

Syntax:

log_format name [escape=default|json|none] string ...;

Default:

log_format combined "...";

Context:

http

该配置只能在http字段中声明。

未启用的默认配置如下:
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                   '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
      定义格式  格式名称   记录项


记录项字段说明:
  $remote_addr:             客户端的IP地址。
  $remote_user:             用于HTTP基本认证的用户名。
  [$time_local]:            本地时间,格式为day mon dd hh:mm:ss yyyy\n。
  "$request":完整的原始请求行(例如,GET / HTTP/1.1)。
  $status:                  HTTP响应状态码。
  $body_bytes_sent:         发送给客户端的字节数(不包括响应头的大小)。
  "$http_referer":发出请求的页面的URL(如果存在)。
  "$http_user_agent":       客户端浏览器标识。
  "$http_x_forwarded_for":当请求通过HTTP代理时,此变量可能包含客户端的真实IP地址(取决于代理的配置)。

官方说明:

http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format

3. 错误日志:Error Log

3.1. 配置文件中未启用,则使用默认配置。

Syntax:

error_log file [level];

Default:

error_log logs/error.log error;

Context:

main, http, mail, stream, server, location

其中level对应的级别有:debug, info, notice, warn, error, crit, alert和emerg。依次为调试到紧急级别。设置为info级别,则会在错误日志显示包括它及后面的所有级别的日志。

可以声明配置的字段有:main,http,mail,stream,server,location.

如配置文件中设置的
#error_log  logs/error.log  notice;
  声明log    log位置及命名    log级别

官方说明:

http://nginx.org/en/docs/debugging_log.html

http://nginx.org/en/docs/ngx_core_module.html#error_log

日志轮转、压缩与删除

1. 检查并安装logrotate

[root@RockyLinux9 nginx]# whereis logrotate
logrotate: /usr/sbin/logrotate /usr/share/man/man8/logrotate.8.gz


# 安装
[root@RockyLinux9 nginx]# dnf install -y logrotate

2. 编写nginx的logrotate配置文件

[root@RockyLinux9 nginx]# cat /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
    daily               # 每天轮转
    missingok           # 如果日志文件丢失,不报错
    rotate 7
    # 保留7个备份
    compress            # 使用 gzip 压缩旧日志文件
    delaycompress       # 延迟压缩,直到下一次轮转周期
    notifempty          # 如果日志文件为空,不轮转
    create 640 nginx nginx
    # 创建新日志文件,并设置权限和所有权
    sharedscripts       # 如果有多个日志文件,只运行一次 postrotate 脚本
    postrotate
        /usr/sbin/nginx -s reload > /dev/null  # 或者使用 systemctl reload nginx
    endscript
}

3. 测试logrotate配置文件

使用-d选项来测试配置文件是否正确,执行后显示操作,但不会实际进行任何修改。

[root@RockyLinux9 ~]# logrotate -d /etc/logrotate.d/nginx

4. 手动运行logrotate

测试配置文件正确后,可以手动运行logrotate

[root@RockyLinux9 ~]# logrotate /etc/logrotate.d/nginx

5. 检查cron服务

[root@RockyLinux9 ~]# which crond
/usr/sbin/crond
# 若没有,请安装
[root@RockyLinux9 ~]# dnf install -y cronie
[root@RockyLinux9 ~]# systemctl enable crond --now

6. 编写cron脚本

[root@RockyLinux9 ~]# cat /etc/cron.daily/logrotate
#!/bin/bash


# 调用 logrotate 命令
/usr/sbin/logrotate /etc/logrotate.conf


# 检查 logrotate 的退出状态
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0


[root@RockyLinux9 ~]# chmod +x /etc/cron.daily/logrotate

7. 配置计划任务(可选)

[root@RockyLinux9 ~]# crontab -e
# 添加内容,每天0点执行logrotate
0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx

8. 自定义bash脚本进行日志备份与删除(可选)

[root@RockyLinux9 ~]# cat /usr/local/nginx/logs/log_backup.sh
#!/bin/bash


# 定义Nginx日志目录
base_path='/usr/local/nginx/logs'


# 移动日志文件
mv $base_path/access.log $base_path/access-$(date -d yesterday +"%Y%m%d").log
mv $base_path/error.log $base_path/error-$(date -d yesterday +"%Y%m%d").log


# 发送USR1信号给Nginx
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`


# 找到日志目录下超过7天的log文件并删除
find $base_path/*.log -type f -mtime +7 -exec rm -rf {} \;

8.1. 配置bash的crontab定时任务(可选)

[root@RockyLinux9 ~]# crontab -e
# 添加内容,每天0点执行log_backup.sh
0 0 * * * /bin/bash /usr/local/nginx/logs/log_backup.sh

日志分析

Nginx日志分析是管理和维护Nginx服务器的重要部分。Nginx的访问日志(access log)和错误日志(error log)提供了关于服务器性能、用户访问模式以及任何潜在问题的关键信息。分析步骤如下:

1. 访问日志分析

1.1. 日志格式

首先,了解Nginx访问日志的格式。在Nginx的配置文件(/etc/nginx/nginx.conf或/usr/local/nginx/conf/nginx.conf)中的log_format指令中找到。

1.2. 使用基本工具

  • grep:用于搜索特定的字符串或模式。
  • sort 和 uniq:用于排序和去重。
  • awk 和 sed:用于文本处理和转换。

1.3. 分析示例

  • 查看最频繁的请求:
cat access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -n 10
  • 这将显示按数量排序的最常见的请求路径(URL)。查看特定IP的请求:
grep '192.168.1.1' access.log
  • 分析用户代理:
cat access.log | awk '{print $11}' | sort | uniq -c | sort -nr | head -n 10

这将显示最常见的用户代理(浏览器和其他客户端)。

2. 错误日志分析

2.1. 查看错误日志

错误日志通常包含关于服务器配置错误、权限问题、内部错误等的详细信息。你可以使用cat、tail、grep等工具来查看和分析它。

2.2. 分析示例

  • 查看最近的错误:
tail -n 10 error.log
  • 搜索特定错误或警告:
grep 'error' error.log

3. 使用专门的日志分析工具

除了基本工具外,还有许多专门的日志分析工具可以更深入地分析Nginx日志。这些工具通常提供图形界面、实时分析、报告和警报等功能。例如:

  • GoAccess:一个快速、实时的Web日志分析器,可以生成HTML报告。
  • ELK Stack(Elasticsearch、Logstash和Kibana):一个强大的日志分析平台,可以处理和分析各种类型的日志数据。

4. 自定义日志格式和日志级别

根据需要自定义Nginx的日志格式和日志级别。例如,修改Nginx的配置文件添加更多的字段到访问日志中,或者调整错误日志的详细程度。

安全性

Nginx日志的安全性配置涉及多个方面,以确保日志文件的完整性和保密性。以下是Nginx日志安全性配置:

限制日志文件的访问权限:

  • 确保Nginx日志文件(如access.log和error.log)的访问权限受到限制,只允许必要的系统用户(如Nginx运行的用户)进行读写操作。
  • 使用chmod命令设置适当的文件权限,例如chmod 640 /usr/local/nginx/logs/access.log,确保只有所有者(Nginx运行的用户)和特定的组(如nginx组)可以读写日志文件。

加密传输日志文件:

  • 如果需要将Nginx日志文件传输到远程服务器进行分析或备份,请确保使用加密传输方式(如SFTP、SCP或rsync over SSH)来传输日志文件,以防止数据在传输过程中被窃取或篡改。

使用安全的日志格式:

  • 在Nginx配置中,使用安全的日志格式,避免在日志中记录敏感信息(如密码、密钥等)。
  • 使用log_format指令自定义日志格式,确保只记录必要的信息,并避免记录过多的敏感数据。

监控和审计:

  • 定期检查和审计Nginx日志文件,以发现任何异常或潜在的安全威胁。

物理安全:

  • 确保存储Nginx日志文件的服务器或设备位于安全的物理位置,以防止未经授权的访问或窃取。
  • 限制对服务器或设备的物理访问权限,确保只有授权人员能够接触和访问日志文件。

备份和恢复策略:

  • 定期备份Nginx日志文件,以防止数据丢失或损坏。
  • 制定恢复策略,以便在需要时能够迅速恢复丢失的日志文件或数据。

请根据具体环境和需求或采取其他安全措施来确保Nginx日志的安全性。