网页卡顿问题排查思路
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
错误日志
记录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 ,默认访问出错后,会返回不同的错误页面,如:
- 40 x 系列的页面
- 404 not found 服务器上找不到该资源
- 403 Forbidden 禁止访问(权限不够,找权限的问题)
- 如50 x 系列的页面
- 学nginx 反向代理
- 但是默认的都太丑,对其优化
语法:
# error_page 响应状态码 相对路径的html 文件/url (相对路径的html文件是在访问的index.html同级目录下,即 root /www/lol/ 这类目录
error_page 404 /404 .html;
error_page 500 502 503 504 /50 x.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 :
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:
手动切割
切割思路
1.先重命名,等于备份
2. 重新记录nginx日志 (/var/log/nginx/access.log),按天记录日志(每天夜里的 整点分进行日志备份,日志)
按天,生成一个新的日志文件
cd /var/log/nginx && mv accesss.log accesss.log.$(date '+%F' )
给nginx进程发送reopen信号,重新生成新日志
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工具切割
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
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]
00 00 * * * logrotate -f /etc/logrotate.d/nginx
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性