一、为什么 Nginx 日志很重要

原笔记把 Nginx 日志分成了两类:

日志类型 主要用途
错误日志 出现 4xx、5xx 或配置故障时排查问题
访问日志 记录访问时间、页面、客户端信息,用于统计和分析

这两类日志分别回答的是两个问题:

  • 网站为什么报错
  • 网站到底被谁访问了、访问了什么

二、错误日志怎么配置

原笔记先介绍了 error_log 指令的格式:

error_log 文件名 错误日志级别;

它可以出现在:

  • main
  • http
  • mail
  • stream
  • server
  • location

原笔记还列出了常见日志级别,从更详细到更粗略大致包括:

debug, info, notice, warn, error, crit, alert, emerg

其中 debug 更适合短时间调试使用,访问量较大的网站不建议长期开启。

2.1 给单个虚拟主机单独指定错误日志

原笔记的案例思路是:

1、先注释主配置中的统一错误日志

#error_log  /var/log/nginx/error.log notice;

2、再在具体站点配置中单独指定:

server {
    listen       80;
    server_name  cxk.oldboylinux.cn;
    error_log  /var/log/nginx/cxk.oldboylinux.cn-error.log notice;
    root   /app/code/cxk;
    location / {
        index  index.html;
    }
}

3、检查语法并重载:

nginx -t
systemctl reload nginx

这样做的好处是:不同站点的错误信息不会混在一起,排查问题更直接。

三、访问日志的核心由哪两部分组成

原笔记强调,访问日志通常要同时理解两个指令:

  • log_format:定义日志长什么样
  • access_log:指定日志写到哪里,并使用哪个格式

3.1 log_format 里常见变量有哪些

原笔记列出了一些最常用的内置变量:

变量 含义
$remote_addr 客户端 IP
$remote_user 用户名
$time_local 访问时间
$request 请求起始行
$status HTTP 状态码
$body_bytes_sent 响应体大小
$http_referer 从哪里跳转而来
$http_user_agent 客户端代理
$http_x_forwarded_for 负载场景下记录真实客户端 IP

原笔记中的默认格式示例是:

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

这也是很多入门场景里最常见的访问日志格式。

3.2 access_log 怎么使用

原笔记给出的基础格式是:

access_log 日志位置 格式;

它可以放在:

  • http
  • server
  • location
  • if in location
  • limit_except

四、如何为每个虚拟主机单独配置访问日志

原笔记的案例与错误日志类似,也是先把主配置中的统一访问日志注释掉:

#access_log  /var/log/nginx/access.log  main;

然后在站点配置中指定独立访问日志:

server {
    listen       80;
    server_name  cxk.oldboylinux.cn;
    error_log  /var/log/nginx/cxk.oldboylinux.cn-error.log notice;
    access_log  /var/log/nginx/cxk.oldboylinux.cn-access.log  main;
    root   /app/code/cxk;
    location / {
        index  index.html;
    }
}

之后同样执行:

nginx -t
systemctl reload nginx

然后访问网站并查看日志:

curl -H Host:cxk.oldboylinux.cn http://192.168.1.20/index.html
tail -f /var/log/nginx/cxk.oldboylinux.cn-access.log

这样就能确认这个站点的访问是否已经单独写入指定文件。

五、访问日志还有哪些进阶选项

原笔记还补充了几个 access_log 的可选项:

  • gzip:压缩访问日志
  • buffer=32k:先写入内存缓冲区,再批量落盘
  • flush=10s:设置刷新时间

示例如下:

access_log  /var/log/nginx/cxk.oldboylinux.cn-access.log  main gzip buffer=32k flush=10s;

这些选项更偏向性能和写入控制,实际生产中会根据访问量和日志策略来选择。

六、小结

Nginx 日志配置的核心可以概括成三件事:

  • error_log 记录和定位故障
  • log_format 定义访问日志格式
  • access_log 决定日志写到哪里

当站点变多时,把日志按虚拟主机拆开,往往比所有内容都写进同一个文件更利于排错和分析。