网页卡顿问题排查思路
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.shlogrotate工具切割
#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
Nginx日志
发布时间 2023-08-31 12:24:00作者: 村尚chun叔
