一 日志
① nginx与日志相关的指令
access_log log_format error_log rewrite_log log_subrequest debug_connection
rewrite_log limit_conn_log_level limit_req_log_level log_not_found open_log_file_cache
uninitialized_variable_warn log_not_found
② 关注点
1) 根据'需求',合理配置'日志格式'
2) 注意'默认'日志格式、日志级别
3) 日志能分析'哪些问题'、组成日志格式的'变量信息源是哪些模块提供的'
4) 日志转储、日志防爆、日志切割 --> "尤其证书加密的场景"
③ error_log
1) 为精确定位nginx'错误'日志,使用自带的'error_log'指令定义错误日志目录及记录错误日志的等级
2) nginx错误日志'平时'不用太关注,但是一旦出了问题,就需要借助错误日志来'判断问题'所在
3) 注意:'无法'自定义错误日志格式;可以调整'日志级别'记录不同的错误信息;调整粗错误日志存储位置
4) 需要观察nginx的'13'个阶段,需要'debug' --> nginx -V校验'/configure --with-debug'
5) 不推荐'同一个配置段里'定义了多个error_log会产生冲突
6) 错误日志格式'不支持自定义'日志格式
nginx默认错误日志配置的信息解读 error_log /dev/null和error_log off区别
debugging log
④ nginx error_log日志调试技巧
debug_connection
需求1: 仅记录'固定ip'的错误日志
备注: 由于'error_log'无法在if指令的上下文中使用,无法通过'if ($remote='xxx')'记录
细节点: 如果在'enents'指令中配置,只能'restart',无法'reload'
需求2: 调试 nginx 'rewrite' 规则
server {
error_log /var/logs/nginx/example.com.error.log;
rewrite_log on;
}
特点:开启后,它将发送'所有的 rewrite 相关'的日志信息到 error_log 文件中,使用'notice'级别
rewrite_log
需求3: 通过 syslog 将日志发送到'统一服务器'
场景: error_log配置syslog'远程传输'
补充: 增加'syslog'一行记录'在记录nginx错误日志的同时',会'同时记录'访问日志到syslog服务器
nginx的access_log和error_log支持记录到操作系统的syslog
nginx 用syslog传输error.log到远程服务器
error_log off 指令
需求4: 使用location记录'指定URL'的日志 --> "日志排错"
server {
error_log /var/logs/nginx/$hostname.error.log;
location /static {
error_log /var/logs/nginx/static-error.log debug;
}
}
⑤ log_format
1) 用于定义日志格式的 'log_format' 指令仅适用于 'http 块'级指令内
2) 所有'时间值'均以'毫秒'为单位
3) 可以在'日志格式'中定义所有的出现的'$variable'变量
备注: 非'json'格式,推荐'content-length=[$content-length] '日志格式
4) log_format对'字符串'进行转义配置,nginx '1.11.8之后'的版本才引入该指令
细节: escape 参数'1.11.8'允许在变量中设置 'json 或 default' 字符转义
[1]、escape=default --> "默认值"
备注1: 默认'"'、'\'、'ASCII<32'、'ASCII>126',会被转义为'\xXX'的'16'进制格式
备注2: 如果'找不到'变量值,将记录连字符"-"
[2]、escape=json --> 解决'非法json值'和'未转义字符串'的问题
特点1: 所有 JSON 字符串中'不允许'的字符都将'被转义'
特点2: 字符 '"' 和 '\' 被转义为 '\"' 和 '\\'
特点3: 值小于 32 的字符被转义为 '\n','\r','\t'、'\b'、'\f' 或 '\u00XX'
备注: Unicode转义'\u00XX'的编码和解码 --> '\u0000-\u00ff'
[3]、escape=none --> "什么字符都不转义",禁用转义
+++++++++++ "关于头部的补充说明" +++++++++++
1) '$http_name' --> client发送给'nginx'的'原始请求头'
2) '$sent_http_name' --> nginx'发送给'客户端的'响应头',经过'filter'之后
3) '$upstream_http_name' --> '后端'发送给'nginx'的'原始'响应头
注意: nginx'模块'提供的变量
补充: 变量'不区分'大小写,变量'脱敏' --> '$COOKIE_flag'
⑥ log_format中的escape=json
应用场景: 为了配合'ELK'做日志分析,需要将nginx的日志转为'json'格式
解决: 部分json字符串'不能正常'解析,主要体现在'非法json值'和'未转义字符串'的问题
核心点1:map的指令'创建一个变量',该变量由其它变量通过一个'映射表置换'得来
通过map脱敏在 access_log 中混淆密码
1) 在$upstream_response_time为'空'的时候返回'0',而不是'-',将该值赋值给'新变量'
map $upstream_response_time $upstream_response_timer {
default $upstream_response_time;
"" 0;
}
2) 'json'格式的日志
log_format json escape=json '{"@timestamp":"$time_iso8601",'
'"@version":"1",'
'"server_addr":"$server_addr",'
'"upstream_response_time":$upstream_response_timer,'
'"remote_addr":"$remote_addr"'
'}';
细节1: 可以分开'多行'书写,只要最后一行';'结尾即可
细节2: 日志格式一定要符合'json字符串'的日志格式
细节3: 外面'单引号'包括,里面的字符串"双引号"包括
json字符串格式
⑦ access_log
'默认': access_log logs/access.log combined gzip=1 flush=64K;
备注: 只要使用'buffer or gzip'之一,日志就会'buffer'
access_log: 用来指定日志文件的'存放路径'、'格式'和'缓存'大小
补充: 不开启'buffer'时,每条日志都'需要IO'开销
format: 定义的'某个'access_log的日志'名称'
场景: 如果每次进行'磁盘'操作,将会较多的耗费资源,基于这个情况可以'开启' nginx 日志缓冲区
效果: 缓冲区'满'或者定时写入的'时间到了',再一次写入日志
日志缓冲区'参数':'buffer'、'flush'
access_log 中'path[file]'指定'日志文件'
注意事项:
[1]、'日志目录'中,nginx进程设置的'用户和组'必须有对该路径'创建文件'的权限
if: 通过变量'判断'日志是否记录
应用场景: 不依赖'crontab或lograte'的日志切割;'不推荐',影响效率
if ($time_iso8601 ~ "(\d{4}-\d{2}-\d{2})") {
set $daily $1;
}
access_log /log/blog_access_$daily.log;
nginx的日志切割 escape=json解决中文乱码 日志分析的工具
PLG做nginx日志展示 根据access_log的日志格式做统计分析
⑧ open_log_file_cache 了解
⑨ log_subrequest rewrite_log
注意: 默认都是'off'
nginx access访问日志分析
nginx -s reopen日志切割
⑩ 题外话
思考:nginx什么情况'不记录'日志?
题外话:
1) include file '相对路径为'--conf-path文件所在的目录
2) 其它指令 file '相对路径为'--prefix所在的目录
nginx学习资料整理 借助 SSL/TLS 和 NGINX 进行 Web 流量加密
disable_symlinks max_ranges
max_ranges 0 的时候表示'不支持range-bytes',即不支持http'断点续传'