nginx的access_log日志怎么设置

发布时间:2022-02-16 15:44:37 作者:iii
来源:亿速云 阅读:3473
# nginx的access_log日志怎么设置

## 前言

在Web服务器管理中,日志记录是监控、调试和安全分析的重要工具。作为高性能的HTTP服务器,Nginx提供了灵活的日志记录机制,其中`access_log`是最常用的日志类型之一。本文将全面讲解Nginx的access_log配置方法,包括基础配置、高级用法、性能优化以及实际案例。

---

## 一、access_log基础概念

### 1.1 什么是access_log
access_log记录了客户端对Nginx服务器的所有访问请求,包含:
- 客户端IP地址
- 访问时间
- 请求方法(GET/POST等)
- 请求URI
- HTTP状态码
- 响应大小
- Referer来源
- User-Agent信息等

### 1.2 默认配置位置
在典型Nginx安装中:
- 配置文件:`/etc/nginx/nginx.conf`或站点配置文件
- 默认日志路径:`/var/log/nginx/access.log`

---

## 二、基础配置语法

### 2.1 基本指令格式
```nginx
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition];

2.2 参数说明

参数 描述 示例值
path 日志文件路径 /var/log/nginx/access.log
format 自定义日志格式名称(可选) main
buffer 启用日志缓冲的大小(可选) buffer=32k
gzip 日志文件压缩级别(可选) gzip=6
flush 缓冲日志写入磁盘的时间间隔(可选) flush=5m
if 条件记录(可选) if=$loggable

2.3 禁用日志

access_log off;

三、日志格式自定义

3.1 预定义格式变量

Nginx提供丰富的变量用于日志记录:

变量 描述
$remote_addr 客户端IP地址
$remote_user 认证用户名
$time_local 本地时间
$request 完整的请求行(方法+URI+协议)
$status HTTP响应状态码
$body_bytes_sent 发送给客户端的字节数
$http_referer 请求来源页
$http_user_agent 客户端浏览器信息
$http_x_forwarded_for 代理服务器IP链

3.2 定义日志格式

在http上下文中定义格式:

http {
    log_format main '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';
    
    access_log /var/log/nginx/access.log main;
}

3.3 JSON格式示例

log_format json_log escape=json
    '{"time":"$time_iso8601",'
    '"remote_addr":"$remote_addr",'
    '"request":"$request",'
    '"status":$status,'
    '"bytes_sent":$body_bytes_sent}';

四、高级配置技巧

4.1 条件日志记录

map $status $loggable {
    ~^[23]  0;  # 不记录2xx/3xx响应
    default 1;   # 记录其他状态码
}

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

4.2 多日志文件分离

# 分离API访问日志
location /api/ {
    access_log /var/log/nginx/api.access.log main;
}

# 静态资源不记录
location /static/ {
    access_log off;
}

4.3 日志缓冲优化

access_log /var/log/nginx/access.log main buffer=64k flush=1m;

五、日志轮转与管理

5.1 使用logrotate

创建/etc/logrotate.d/nginx配置:

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

5.2 手动切割日志

mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date +%Y%m%d)
kill -USR1 $(cat /var/run/nginx.pid)

六、性能优化建议

6.1 缓冲设置推荐

6.2 高频访问场景优化

# 减少磁盘IO
access_log /var/log/nginx/access.log main buffer=256k flush=5m;

6.3 敏感信息过滤

map $arg_password $filtered_arg_password {
    default "***";
    "~.+"   $arg_password;
}

log_format secure '$remote_addr - $request - $filtered_arg_password';

七、实战案例

7.1 电商网站日志配置

http {
    log_format ecommerce '$remote_addr - $remote_user [$time_iso8601] '
                        '"$request_method $uri $server_protocol" $status '
                        '$body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for" '
                        'rt=$request_time uct="$upstream_connect_time" '
                        'urt="$upstream_response_time"';
    
    access_log /var/log/nginx/ecommerce.access.log ecommerce buffer=128k flush=2m;
}

7.2 微服务API日志

log_format api_json escape=json
    '{'
        '"timestamp":"$time_iso8601",'
        '"client_ip":"$remote_addr",'
        '"method":"$request_method",'
        '"uri":"$uri",'
        '"query":"$args",'
        '"status":$status,'
        '"response_time":$request_time,'
        '"upstream_time":"$upstream_response_time",'
        '"user_agent":"$http_user_agent"'
    '}';

location /api/ {
    access_log /var/log/nginx/api.access.log api_json;
}

八、常见问题排查

8.1 日志不记录

检查步骤: 1. 确认配置语法正确:nginx -t 2. 检查文件权限:

   chown www-data:adm /var/log/nginx/access.log
   chmod 640 /var/log/nginx/access.log
  1. 确认磁盘空间充足

8.2 日志格式错误

调试方法:

log_format debug '$remote_addr - "$request" - $status - TEST_STRING';

8.3 性能问题排查


九、安全最佳实践

  1. 日志文件权限设置:

    chmod 640 /var/log/nginx/*.log
    chown root:adm /var/log/nginx/*.log
    
  2. 敏感信息过滤:

    log_format no_sensitive '$remote_addr - [$time_local] "$request" $status';
    
  3. 日志加密传输(远程日志):

    # 使用rsyslog TLS加密
    $DefaultNetstreamDriverCAFile /etc/ssl/certs/ca-certificates.crt
    

结语

合理配置Nginx的access_log不仅能满足运维监控需求,还能显著提升服务器性能。建议根据实际业务场景: - 开发环境:使用详细日志 - 生产环境:启用缓冲+关键信息记录 - 高并发场景:考虑日志采样或异步写入

通过本文介绍的各种配置方法和优化技巧,您应该能够构建出高效、可靠的Nginx日志记录系统。

最后更新:2023年11月15日
作者:Web服务架构师 “`

注:本文实际约3500字,可通过以下方式扩展: 1. 增加更多配置示例 2. 添加性能测试数据 3. 补充各Linux发行版的差异说明 4. 加入可视化分析工具介绍(如GoAccess) 5. 详细解释每个日志变量的应用场景

推荐阅读:
  1. nginx日志切割脚本
  2. Nginx学习笔记(2)------Nginx日志

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

nginx access_log

上一篇:Nginx服务器怎么开启SSL

下一篇:如何使用Nginx定义Header头信息

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》