Nginx 日志配置指南

Nginx 提供了强大的日志功能,可以灵活配置日志的输出格式以满足不同的需求。本篇文章将介绍如何设置 Nginx 的日志输出格式,以及常用变量的含义和使用。

配置 Nginx 日志输出格式

设置日志格式

Nginx 使用 log_format 指令定义日志格式,语法如下:

log_format <name> 'variable variable variable';
  • <name> 是日志格式的名称。
  • variable 是日志格式中使用的变量。

应用日志格式

设置好日志格式后,可以通过 access_log 指令指定日志文件的路径并应用日志格式。

access_log <Path> <name>;
  • <Path> 是日志文件的路径,例如 /var/log/nginx/access.log
  • <name> 是之前定义的日志格式名称。

常用变量及其含义

以下是一些常用的 Nginx 日志变量及其含义:

变量 含义
$remote_addr 客户端的 IP 地址。
$remote_user 远程用户,通常用于 HTTP 基本认证。
$time_local 请求的时间和时间区域。
$request 请求行,包括方法、URL 和 HTTP 协议版本。
$status HTTP 响应状态码。
$body_bytes_sent 发送给客户端的总字节数,不包括响应头的大小。
$http_referer 请求的来源页面(如果有)。
$http_user_agent 客户端的用户代理字符串。
$request_body 请求体(例如 POST 请求的数据)。
$http_x_forwarded_for 通过代理时,记录原始 IP 地址。
$http_host 请求的主机名。
$request_time 处理请求所花费的时间(单位为秒,精度为毫秒)。
$upstream_response_time upstream 响应时间(如果使用了 upstream 模块)。
$upstream_addr upstream 服务器的 IP 地址和端口。
$upstream_status upstream 服务器的响应状态码。

特殊变量注意事项

以下变量需要添加双引号 "" 或方括号 [],以正确处理空格或特殊字符:

  • $time_local 通常放在方括号 [] 中以突出时间戳。
  • $request$http_referer$http_user_agent$http_x_forwarded_for$http_host 需要放在双引号 "" 中。

配置示例

简单日志格式

以下是一个简单的日志格式配置示例:

# 定义一个简单的日志格式
log_format simple '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" "$http_user_agent"';

# 设置访问日志的路径和使用的日志格式
access_log /var/log/nginx/access.log simple;

示例日志输出

假设客户端发起以下请求:

GET /index.html HTTP/1.1

日志输出如下:

192.168.1.100 - - [12/Dec/2024:15:00:00 +0800] "GET /index.html HTTP/1.1" 200 1024 "http://www.example.com" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36"