网页卡顿问题排查思路
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