Nginx配置访问日志,日志格式详解

前言

网站出问题了,想查一下谁访问过哪个页面,怎么查?Nginx 的访问日志就记录了所有请求。本文讲一下 Nginx 怎么配置访问日志,日志格式都有什么字段。

默认日志位置

Nginx 默认访问日志在:

/var/log/nginx/access.log

错误日志在:

/var/log/nginx/error.log

查看实时日志

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

日志格式定义

Nginx 自带一个默认格式叫 combined:

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

常用日志变量

变量 说明
$remote_addr 客户端 IP
$time_local 本地时间
$request 请求行(方法+URL+协议)
$status 状态码
$body_bytes_sent 发送字节数
$http_referer 来源页面
$http_user_agent 浏览器 UA

自定义日志格式

想多记点信息,比如响应时间、X-Forwarded-For:

log_format myformat '$remote_addr - [$time_local] '
                     '"$request" $status $body_bytes_sent '
                     '"$http_referer" "$http_user_agent" '
                     'rt=$request_time uct="$upstream_connect_time"';

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

单独给某个站点配日志

多站点的时候,每个站点单独记日志:

server {
    listen       80;
    server_name  www.aaa.com;

    root  /var/www/aaa;
    index index.html;

    access_log /var/log/nginx/aaa_access.log;
    error_log  /var/log/nginx/aaa_error.log;
}

关闭日志

不想记日志(不推荐):

access_log off;

常见坑

坑1:用了 CDN,日志里都是 CDN IP

访问日志里记的都是 CDN 的 IP,不是真实用户的。

原因: 请求经过 CDN 转发了。

解决: 记 X-Forwarded-For:

log_format combined '$http_x_forwarded_for - $remote_user [$time_local] ...';

坑2:日志太大占磁盘

访问日志一直写,把磁盘占满了。

解决: 配 logrotate 自动切割日志。

坑3:查不到某个 IP 的访问记录

想查某个 IP 今天访问了多少次,日志里没有。

原因: 日志已经被切割轮转了。

解决: 看昨天的日志文件:

grep "IP地址" /var/log/nginx/access.log.1

坑4:日志权限不对

Nginx 写不了日志。

解决: 确保日志目录属主是 www:

chown -R www:www /var/log/nginx/

常用日志分析命令

统计访问量前10的IP:

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10

统计 404 最多的页面:

awk '($9 == 404)' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr

总结

一行配置开启日志:

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

记住: 日志是排查问题的第一手资料,出事先看日志。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:41