Nginx 教程

Nginx 教程 Nginx 简介 Nginx 源码架构分析 Nginx 编译安装 Nginx(Tengine) 编译安装 Nginx(OpenResty) 编译安装 Nginx 配置简述 Nginx Docker 容器化配置

Nginx 核心配置指令

Nginx 核心配置指令 Nginx 配置文件 Nginx 进程配置指令 Nginx 端口监听:listen Nginx 主机名server_name Nginx 处理HTTP请求 Nginx 路由匹配规则:localhost Nginx 重定向配置:rewrite Nginx 根目录配置:root Nginx 访问路径别名:alias Nginx 文件判断:try_files Nginx 零复制:sendfile Nginx 日志记录配置

Nginx HTTP模块

Nginx 镜像模块 Nginx 请求头控制模块 Nginx IP访问控制模块 Nginx 用户cookie模块 Nginx 并发连接数限制模块 Nginx 首页处理模块 Nginx 请求频率限制模块 Nginx 页面缓存时间配置 Nginx gzip压缩及相关配置

Nginx Web服务

Nginx 静态资源服务器搭建 Nginx 文件下载服务器搭建 Nginx 伪动态SSI服务器 Nginx HTTPS服务器搭建 Nginx FastCGI模块配置简述 Nginx PHP服务器环境搭建 Nginx 基于FastCGI负载均衡 Nginx CGI网关接口 Nginx uWSGI模块配置 Nginx Python项目部署 Nginx 伪流媒体服务器搭建 Nginx HTTP2模块配置简述 Nginx WebDAV模块配置简述

Nginx 代理服务器

Nginx HTTP代理服务器 Nginx stream模块简述 Nginx TCP/UDP代理简述 Nginx 基于SSL的TCP代理服务器 Nginx gRPC代理服务器

Nginx 缓存

Nginx Web缓存配置 Nginx 代理缓存配置 Nginx Memcached 缓存模块 Nginx 反向代理缓存服务器配置 Nginx 客户端缓存控制

Nginx 负载均衡

Nginx 负载均衡模块 Nginx 负载均衡策略 Nginx 长连接负载均衡 Nginx upstream容错机制 Nginx upstream动态更新 Nginx TCP/UDP负载均衡

Nginx 日志管理监控

Nginx 日志分析简述 Nginx 访问日志配置 Nginx 错误日志配置 Nginx 日志归档配置 Nginx 日志分析工具 ELK Nginx 监控工具 Prometheus

Nginx 集群

LVS(Linux虚拟服务器)简介 Keepalived 配置简述 Nginx 集群负载搭建 Nginx 集群配置管理规划 Nginx 配置归档工具GitLab Nginx 配置修改工具Ansible Jenkins 安装与配置简述 Nginx 集群配置管理实例

Nginx 在 k8s 的应用

Kubernetes(k8s)系统简述 Kubernetes(k8s)集群部署 Kubernetes(k8s)网络通信 Nginx Ingress 简介 Nginx Ingress 安装部署 Nginx Ingress 配置映射 Nginx Ingress 注解


Nginx 访问日志配置

Nginx 的访问日志主要记录用户客户端的请求信息(见下表)。用户的每次请求都会记录在访问日志中,access_log 指令可以设置日志的输出方式及引用的日志格式。

名称 访问日志指令
指令 access_log
作用域 http、stream、server、location、if in location、limit except
默认值 logs/access.log combined;
指令值格式 off 或 path[format[buffer=size][gzip[=level]][flush=time][if=condition]];
指令说明 设置访问日志输出方式及引用的日志格式

关于 access_log 指令有以下几点需要说明:
  • 在同一级别的指令域中,也可指定多个日志;
  • 指令值中的第一个参数用于设置输出日志的方式,默认是输出到本地的文件中。该指令也支持输出到 syslog 或内存缓冲区中;
  • 该指令在 stream 指令域中时,默认值为 off;

access_log off;

  • 参数 path,设置日志输出的文件路径或 syslog 服务器地址;

access_log logs/access.log combined;

  • 参数 format,设置关联 log_format 指令定义的日志格式名;
  • 参数 buffer,设置日志文件缓冲区大小。当缓冲区日志数据超出该值时,缓冲区日志数据会被写到磁盘文件。默认缓冲区大小为 64KB;
  • 参数 flush,设置日志缓冲区刷新的时间间隔,缓冲区日志的保护时间超过这个设定值时,缓冲区日志数据会被写到磁盘文件;
  • 参数 gzip,设置缓冲区数据的压缩级别,缓冲区数据会被压缩后再写出到磁盘文件。压缩级别范围 1~9,级别越高压缩比越高,系统资源消耗也最大,默认级别为 1;

access_log logs/log.gz combined gzip flush=5m;

  • 参数 if,设置是否记录日志,当参数值的条件成立,即不为 0 或空时,才记录日志。

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

access_log logs/access.log combined if=$loggable;

日志格式指令如下表所示。

名称 日志格式指令
指令 log_format
作用域 http、stream
默认值 combined"...";
指令值格式  name[escape=default 或 json 或 none]string...;
指令说明 设置访问日志输出方式及输出日志格式

关于 log_format 指令有以下几点需要说明:
  • 指令值参数 name 用于设置日志格式名。该名称全局唯一,可以被 access_log 引用;
  • 指令值参数 escape 用于设置日志输出字符串编码格式,json 支持中文字符内容输出;
  • 指令值参数 string 用于设置日志输出格式字符串。该字符串由 Nginx 公共变量和仅在日志写入时存在的变量组成。HTTP 常用变量如下表所示。

变量名 变量说明
$time_iso8601 ISO 8601 时间格式
$time_local 用户请求的时间和时区
$msec 毫秒级别的日志记录时间
$remote_addr 发起与 Nginx 建立连接的网络客户端的 IP,有时会是上层代理服务器的 IP
$http_x_forwarded_for 可以记录客户端 IP,通过代理服务器来记录客户端的 IP
$remote_user 用于记录远程客户端的用户名称
$http_user_agent 用户客户端浏览器标识
$connection 网络连接编号
$connection_requests 当前连接的请求数
$request 用户请求的 URI 及请求方法
$request_method 用户请求方法
$request_uri 用户请求的 URI 及请求方法
$server_protocol 请求协议
$request_time 请求时间
$request_length 请求数据大小
$status 用户请求响应状态码
$bytes_sent 发送到客户端响应数据的大小
$body_bytes_sent 用户请求返回的响应体字节数
$http_referer HTTP 请求头中属性字段 referer

配置样例如下:
# 普通格式日志
log_format  main  '$remote_addr - $connection - $remote_user [$time_local] "$request" - $upstream_addr'
                  '$status  - $body_bytes_sent - $request_time - "$http_referer" '
                  '"$http_user_agent" - "$http_x_forwarded_for" - ';

# JSON格式日志
log_format json '{"@timestamp": "$time_iso8601", '
                '"connection": "$connection", '
                '"remote_addr": "$remote_addr", '
                '"remote_user": "$remote_user", '
                '"request_method": "$request_method", '
                '"request_uri": "$request_uri", '
                '"server_protocol": "$server_protocol", '
                '"status": "$status", '
                '"body_bytes_sent": "$body_bytes_sent", '
                '"http_referer": "$http_referer", '
                '"http_user_agent": "$http_user_agent", '
                '"http_x_forwarded_for": "$http_x_forwarded_for", '
                '"request_time": "$request_time"}';
Nginx TCP/UDP 的访问日志的变量与 HTTP 的访问日志的变量是不同的,TCP/UDP 常见日志变量如下表所示。

变量名 变量说明
$time_iso8601 ISO 8601 时间格式
$time_local 用户请求的时间和时区
$connection 网络连接编号
$remote_addr 发起与 Nginx 建立连接的网络客户端的 IP,有时会是上层代理服务器的 IP
$server_addr Nginx 服务器地址
$server_port Nginx 服务器端口
$status 用户请求响应状态码
$upstream_addr 被代理服务器地址
$bytes_received 接收字节数
$bytes_sent 发送字节数
$session_time 连接会话时间
$proxy_protocol_addr 代理协议地址
$proxy_protocol_port 代理协议端口

Nginx 的 TCP/UDP 的日志处理是在连接处理阶段结束时才发生,所以 TCP/UDP 代理的访问日志只在连接关闭时才被记录。访问日志格式配置样例如下:
# 普通格式日志
log_format  tcp  '$remote_addr - $connection - [$time_local] $server_addr: $server_port '
                  '- $status - $upstream_addr - $bytes_received - $bytes_sent - $session_time '
                  '- $proxy_protocol_addr:$proxy_protocol_port ';

# JSON格式日志
log_format json '{"@timestamp": "$time_iso8601", '
                '"connection": "$connection", '
                '"remote_addr": "$remote_addr", '
                '"server_addr": "$server_addr:$server_port" '
                '"status": "$status" '
                '"upstream_addr": "$upstream_addr" '
                '"bytes_received": "$bytes_received" '
                '"bytes_sent": "$bytes_sent" '
                '"session_time": "$session_time" '
                '"proxy_protocol_addr": "$proxy_protocol_addr:$proxy_protocol_port" '}'
打开日志缓存指令见下表。

名称 打开日志缓存指令
指令 open_log_file_cache
作用域 http、stream、server、location
默认值 off
指令值格式 off 或 max=N [inactive=time][min_uses=N][valid=time];
指令说明 设置存储日志文件描述符(文件句柄)的缓存

关于 open_log_file_cache 指令有以下几点需要说明:
  • 默认配置下,Nginx 每次将缓冲区日志数据保存到磁盘中,都需要先打开文件并获得文件描述符,然后向该文件描述符的文件中写入日志数据,最后关闭该文件描述符的文件。该指令把打开文件的文件描述符(文件句柄)存储在缓存中,进而提升写入日志的效率;
  • 指令值 max 用于设置缓存中存储的文件描述符的最大数量,超过该值时,将按照 LRU 算法对缓存中文件描述符进行关闭;
  • 指令值参数 inactive 用于设置缓存中每个文件描述符存活的时间,默认为 10s;
  • 指令值参数 min_uses 用于设置可被缓存文件描述符的最小使用次数,默认为 1 次;
  • 指令值参数 valid 用于设置缓存检查频率,默认为 60s;
  • 指令值 off 用于关闭打开日志缓存的功能。

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
logs/access.log combined;