Nginx日志

网页卡顿问题排查思路

image

nginx.conf访客日志

nginx的日志由两部分组成:
第一部分:日志格式
log_format(日志格式的参数)  main(格式的名字)  '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
第二部分:开启日志配置参数
access_log  logs/access.log  main;
日志参数      日志路径         日志格式

access_log off # 关闭日志

参数解释 
# 看到这个请求是从什么IP发来的。 remote_addr
$remote_addr :记录访问网站的客户端IP地址
$remote_user :记录远程客户端用户名称
$time_local :记录访问时间与时区
$request :记录用户的 http 请求起始行信息(请求方法,http协议)
$status :记录 http 状态码,即请求返回的状态,例如 200 、404 、502 等
$body_bytes_sent :记录服务器发送给客户端的响应 body 字节数
$http_referer :记录此次请求是从哪个链接访问过来的,可以根据 referer 进行防盗链设置
$http_user_agent :记录客户端访问信息,如浏览器、手机客户端等
$http_x_forwarded_for :当前端有代理服务器时,设置 Web 节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的 x_forwarded_for 设置
备注
$remote_addr 可能拿到的是反向代理IP地址
$http_x_forwarded_for 可以获取客户端真实IP地址

访客日志问题

问题一:每个域名对应一个日志文件该如何操作?

方式一:将日志的配置参数,别写在http{}花括号中,而是写在各自的server{}中即可
log_format 格式化的日志的名字,还不得重复
开启access_log日志的参数,可以写在server{}区域里,但是日志格式化的参数,只能写在http{}区域中

方式二:引用include参数,在每个.conf的文件中各自定义日志格式和日志配置参数,如:
vim /etc/nginx/conf.d/lol.linux0224.conf
log_format  main2  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

server {
access_log  /var/log/nginx/lol.linux0224.cc.access.log  main2;
listen 80;
server_name lol.linux0224.cc;
	charset utf-8;
location /  {
root  /www/lol/;
index  index.html;
}
}
第二种方法可以每个域名各自定义各自的日志格式,不需要每个域名的日志格式都相同,但是每种日志格式的名字需要不相同。
问题二:除了特殊指定的日志格式,剩余其他的虚拟主机日志,全部统一记录到 /var/log/nginx/all-server-accesss.log,如何操作?

如下写法,就会去记录,除了你单独指定的虚拟主机的日志,剩下的日志,都会写入到这个all-server-accesss.log 文件中

nginx.conf 主配置如下
# 定义一个全局的设置
http {
include       /etc/nginx/mime.types;
default_type  application/octet-stream;

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

access_log  /var/log/nginx/all-server-accesss.log  main3;

sendfile        on;
#tcp_nopush     on;

keepalive_timeout  65;

#gzip  on;

include /etc/nginx/conf.d/*.conf;
}

错误日志

记录nginx运行错误的日志  error_log

关于该参数的官网文档,以及具体的用法
https://nginx.org/en/docs/ngx_core_module.html#error_log

Syntax:	error_log file [level];
Default:	
error_log logs/error.log error;
Context:	main, http, mail, stream, server, location

具体的level是指,日志记录的详细程度
有这些值让你填写
debug, info, notice, warn, error, crit, alert
从左到右,详细程度分别是 从 大  >>> 小

debug 会记录超级详细的信息,没必要,占用大量的磁盘空间
crit 表示nginx以及出现严重错误,以及崩溃了,才记录日志。。记录的内容太少
一般用的,以及默认的就是error日志级别,能够记录基本的,常见错误。
1. 如何开启error级别的错误日志。
# 单独给的lol虚拟主机网址,设置错误日志,eroor级别 ,配置如下
# 支持写入http{}  server{}
[root@web-8 /etc/nginx/conf.d]#cat  lol.linux0224.conf 

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

server {
access_log  /var/log/nginx/lol.linux0224.cc.access.log  main2;
error_log /var/log/nginx/lol-error.log error;

listen 80;
server_name lol.linux0224.cc;
	charset utf-8;
location /  {
root  /www/lol/;
index  index.html;
}
}

重启服务
[root@web-8 /etc/nginx/conf.d]#nginx -

检查日志
[root@web-8 /etc/nginx/conf.d]#tail -f /var/log/nginx/lol-error.log 

错误日志的,特点是记录,访问时的出错信息

404页面优化

错误页面优化,nginx,默认访问出错后,会返回不同的错误页面,如:
- 40x系列的页面
- 404 not found 服务器上找不到该资源
- 403 Forbidden 禁止访问(权限不够,找权限的问题)
- 如50x系列的页面
- 学nginx反向代理
- 但是默认的都太丑,对其优化

语法:
# error_page  响应状态码    相对路径的html文件/url(相对路径的html文件是在访问的index.html同级目录下,即 root /www/lol/ 这类目录

error_page     404             /404.html;
error_page   500 502 503 504   /50x.html;


举例:
[root@web-8 ~]#cat /etc/nginx/conf.d/lol.linux0224.conf 

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

# 当404错误时,返回当前机器上的my404.html
# 当403错误时,跳转到淘宝这个错误页面上
server {
access_log  /var/log/nginx/lol.linux0224.cc.access.log  main2;
error_log /var/log/nginx/lol-error.log error;
error_page  404  /my404.html;
error_page  403   https://error.taobao.com/app/tbhome/common/error.html;

listen 80;
server_name lol.linux0224.cc;
	charset utf-8;
location /  {
root  /www/lol/;
index  index.html;
}
}

切割日志

生成大量的网站日志

方式1:循环
for i in {1..10000};do curl 10.0.0.200;done
方式2:使用支持多进程,并发写入的工具,如ab命令  apache提供的性能压测命令,给网站发送支持并发的大量的http请求。
yum install httpd-tools -y
# 发送10000个http请求,且招来100个人同时发请求,相当于多线程
ab -c 100 -n 10000  http://10.0.0.200/

手动切割

切割思路
1.先重命名,等于备份
2. 重新记录nginx日志 (/var/log/nginx/access.log),按天记录日志(每天夜里的 整点分进行日志备份,日志)
按天,生成一个新的日志文件

cd /var/log/nginx && mv accesss.log accesss.log.$(date '+%F')
# 还得生成新日志,得继续记录
给nginx进程发送reopen信号,重新生成新日志
# 用这种方式,可以最精确的提取进程id号。
kill -USR1 $(ps -ef|grep nginx |grep master | awk '{print $2}')

shell脚本切割

#!/bin/bash
# 源日志目录
logs_path="/var/log/nginx"
# 备份日志目录
back_logs_path="${logs_path}/$(date -d 'yesterday' +'%F')"
# 创建备份目录,以日期命名,注意,每天零点整切割,开始记录新的一天的日志,备份目录应该是昨天
mkdir -p ${back_logs_path}
# 重命名旧日志名,注意日期
cd ${logs_path} && find . -type f |xargs -i mv {} {}.$(date -d 'yesterday'  +'%F') 
# 移动旧日志文件到该目录下
cd ${logs_path} && find . -type f  |xargs -i mv {}   ${back_logs_path}
# 重新生成新日志
kill -USR1 `ps -ef|grep nginx |grep master|awk '{print $2}'`
# 将这个脚本添加到定时任务
crontab -e 
0 0  * * * /bin/bash /my_shell/back_nginx.sh 

logrotate工具切割

#cat /etc/logrotate.d/nginx 
/var/log/nginx/*.log {
daily                        # 每天切割
missingok                    # 忽略错误
rotate 52                    # 最多保留多少个存档    
compress                     # 切割后且压缩
delaycompress                # 延迟压缩动作在下一次切割
notifempty                   # 日志为空就不切割
create 640 nginx adm         # 切割的文件权限
sharedscripts                # 共享脚本,结果为空
postrotate                   # 收尾动作,重新生成nginx日志
      if [ -f /var/run/nginx.pid ]; then
              kill -USR1 `cat /var/run/nginx.pid`
      fi
endscript                    # 结束动作
}

测试logrotate工具是否实现日志切割
手动实现日志切割,执行该工具
logrotate -f /etc/logrotate.d/nginx

logrotate工具,本身会压缩备份的日志文件,是因为压缩工作被延迟到了下一次切割
logrotate -f /etc/logrotate.d/nginx
等于实现了第二次切割动作,本次会进行日志压缩了

最终的操作,应该把这个切割命令,写入到定时任务即可
[root@web-8 /var/log/nginx]#crontab -l
00 00 * * *  logrotate -f /etc/logrotate.d/nginx
posted @ 2023-08-31 11:54  村尚chun叔  阅读(274)  评论(0编辑  收藏  举报