在 Ubuntu 22.04 上配置 Nginx 日志管理教程

简介

Nginx是一款流行的 Web 服务器和反向代理服务器,以其高性能和高效率而闻名。适当的日志记录和日志轮换对于监控和维护 Nginx 服务器的健康状况至关重要。本教程将指导你如何在 Ubuntu 上配置 Nginx 的日志记录并设置日志轮换。

本教程的目标是手把手教你如何在 Linux 服务器上安装和配置 Nginx 日志管理。

安装和配置步骤

第一步:定位 Nginx 配置文件

Nginx 配置文件通常位于 /etc/nginx/ 目录中。主配置文件是 /etc/nginx/nginx.conf,特定站点的配置通常位于 /etc/nginx/sites-available/ 目录中。

第二步:配置 Nginx 日志

默认情况下,Nginx 记录两种类型的数据:

  • 访问日志:这些日志记录服务器处理的所有请求。
  • 错误日志:这些日志捕获处理请求期间遇到的任何错误。

2.1 访问日志

访问日志通常在 Nginx 配置的服务器块中配置。打开主 Nginx 配置文件或特定站点配置文件:

sudo nano /etc/nginx/nginx.conf

或者针对特定站点:

sudo nano /etc/nginx/sites-available/your-site.conf

server 块中,添加或修改 access_log 指令:

server {
    listen 80;
    server_name your_domain.com;

    access_log /var/log/nginx/your_site_access.log;
    error_log /var/log/nginx/your_site_error.log;

    # 其他配置...
}
  • /var/log/nginx/your_site_access.log:访问日志文件的路径。
  • /var/log/nginx/your_site_error.log:错误日志文件的路径。

2.2 错误日志

可以使用 error_log 指令类似地配置错误日志:

error_log /var/log/nginx/your_site_error.log;

你可以为错误日志指定日志级别(例如,error、warn、crit 等):

error_log /var/log/nginx/your_site_error.log warn;

第三步:测试 Nginx 配置

配置日志后,重要的是测试 Nginx 配置以确保没有语法错误:

sudo nginx -t

如果配置测试成功,请重启 Nginx 以应用更改:

sudo systemctl restart nginx

第四步:使用 Logrotate 配置日志轮换

Logrotate 是 Linux 中的一个实用程序,用于管理日志文件,允许自动轮换、压缩和删除旧日志文件。

4.1 为 Nginx 创建 Logrotate 配置文件

创建一个新的 Logrotate 配置文件,专门用于 Nginx:

sudo nano /etc/logrotate.d/nginx

添加以下配置:

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

参数解释:

  • daily:每天轮换日志。
  • missingok:如果日志文件丢失,则不发出错误。
  • rotate 14:保留 14 天的日志。
  • compress:压缩轮换后的日志以节省空间。
  • delaycompress:延迟压缩直到下一个轮换周期。
  • notifempty:不轮换空日志文件。
  • create 0640 www-data adm:使用指定的权限和所有权创建新日志文件。
  • sharedscripts:仅运行一次 postrotate 脚本,无论轮换多少日志。
  • postrotate:此脚本将在日志文件轮换后执行。它向 Nginx 发送信号以重新打开日志文件。

4.2 测试 Logrotate 配置

你可以使用以下命令测试 Nginx 的日志轮换:

sudo logrotate -d /etc/logrotate.d/nginx

此命令将模拟日志轮换过程,而不会实际轮换日志。如果一切正常,你可以运行实际的日志轮换:

sudo logrotate -f /etc/logrotate.d/nginx

1. 高级日志格式自定义

Nginx 允许你自定义日志格式,以包含请求时间、上游响应时间等特定详细信息。

自定义日志格式

编辑 Nginx 配置文件以定义自定义日志格式:

sudo nano /etc/nginx/nginx.conf

http 块下添加以下 log_format 指令:

http {
    log_format custom '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        '$request_time $upstream_response_time $pipe';

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

    # 其他配置...
}

此自定义日志格式包括:

  • $remote_addr:客户端的 IP 地址。
  • $remote_user:客户端提供的用户名。
  • $time_local:接收请求时的本地时间。
  • $request:来自客户端的请求行。
  • $status:发送给客户端的 HTTP 状态码。
  • $body_bytes_sent:发送给客户端的字节数。
  • $http_referer:来自客户端的 Referer 标头。
  • $http_user_agent:来自客户端的 User-Agent 标头。
  • $request_time:处理请求所花费的总时间。
  • $upstream_response_time:从上游服务器接收响应所花费的时间。
  • $pipe:如果请求是流水线化的,则为“p”,否则为“.”。

编辑后,测试配置:

sudo nginx -t

然后,重启 Nginx:

sudo systemctl restart nginx

2. 限制日志文件大小

如果你担心日志文件在轮换之间增长过大,你可以使用 Logrotate 实现基于大小的日志轮换。

基于大小的日志轮换

打开 Nginx Logrotate 配置文件:

sudo nano /etc/logrotate.d/nginx

修改它以在日志达到特定大小时轮换日志:

/var/log/nginx/*.log {
    size 100M
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

此配置在日志达到 100MB 大小时轮换日志。

3. 基于状态码过滤日志

你可以配置 Nginx 仅记录特定状态码(例如,错误)到单独的日志文件中。

仅记录 4xx5xx 错误

在你的站点配置中添加条件 access_log 指令:

sudo nano /etc/nginx/sites-available/your-site.conf

server 块中,添加:

map $status $loggable {
    ~^[45] 1;
    default 0;
}

access_log /var/log/nginx/error_access.log combined if=$loggable;

此配置使用 map 指令创建一个变量 $loggable,对于 4xx 和 5xx 状态码,该变量设置为 1,否则为 0。仅当 $loggable 为 1 时,access_log 指令才会记录请求。

4. 实时日志监控

你可以实时监控 Nginx 日志,以观察传入的请求或发生的错误。

使用 tail 进行过滤

要实时监控访问日志:

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

要实时监控错误:

sudo tail -f /var/log/nginx/error.log

要过滤并仅查看某些类型的请求(例如,404 错误):

sudo tail -f /var/log/nginx/access.log | grep "404"

5. 基于请求的条件日志记录

你可以仅记录特定类型的请求,例如具有特定标头或来自特定 IP 地址的请求。

示例:记录来自特定 IP 地址的请求

编辑你的站点配置文件:

sudo nano /etc/nginx/sites-available/your-site.conf

添加条件日志记录规则:

map $remote_addr $loggable_ip {
    default 0;
    192.168.1.100 1;
}

access_log /var/log/nginx/special_access.log combined if=$loggable_ip;

此配置仅记录来自 IP 地址 192.168.1.100 的请求。

6. 使用 ngrep 进行 HTTP 流量分析

ngrep 是一个网络数据包分析器,你可以使用它来捕获和分析通过 Nginx 服务器的 HTTP 流量。

安装 ngrep

sudo apt-get install ngrep -y

捕获 HTTP 流量

要捕获端口 80 上的 HTTP 流量:

sudo ngrep -d any -W byline port 80

此命令将实时显示通过端口 80 的 HTTP 流量,这对于调试或监控很有帮助。

7. 实现 GeoIP 日志记录

Nginx 可以通过集成 GeoIP 模块来记录客户端的地理位置。

安装 GeoIP 模块

sudo apt-get install libnginx-mod-http-geoip -y

在 Nginx 中配置 GeoIP

编辑 Nginx 配置文件:

sudo nano /etc/nginx/nginx.conf

http 块下添加以下内容:

http {
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    geoip_city /usr/share/GeoIP/GeoLiteCity.dat;

    log_format geo '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    '$geoip_country_name $geoip_city';

    access_log /var/log/nginx/geo_access.log geo;

    # 其他配置...
}

注意: 我们在使用 GeoLiteCity.dat 文件时遇到了问题。它在安装过程中没有创建。请找到解决此问题的方法。

此设置将根据客户端的 IP 地址记录国家/地区和城市信息。

结尾

你现在已成功配置了 Ubuntu 服务器上 Nginx 的日志记录和日志轮换。 定期日志轮换可确保有效管理服务器的磁盘空间,防止日志随着时间的推移占用过多空间。 通过遵循本教程,你可以维护一个强大的日志记录机制,使你可以有效地监控和排除 Nginx 服务器的故障。

这些高级命令和配置可以帮助你更深入地了解 Nginx 服务器的运行,提高日志记录效率,并更有效地排除故障。 通过实施这些技术,你可以完全控制服务器的日志记录基础架构。