一、前因后果
今天在看百度站长平台的抓取频次的时候,发现最近抓取次数有所下滑,并且平均响应时间也有所上升,感觉和最近频繁折腾主题以及访问量增加有所关系:
再往下看,却发现网站抓取中出现的 404 数据也呈上升趋势:
二、Shell 脚本
说做就做,简单的写了个 Shell 脚本就搞定了!
脚本名称:网站死链生成脚本
脚本代码:
#!/bin/bash
#Desc: Death Chain File Script
#Author: ZhangGe
#Blog: https://zhang.ge/5038.html
#Date: 2015-05-03
#初始化变量
#定义蜘蛛 UA 信息(默认是百度蜘蛛)
UA='+http://www.baidu.com/search/spider.html'
#前一天的日期(nginx 日志)
DATE=`date +%Y-%m-%d -d "1 day ago"`
#定义日志路径
logfile=/home/wwwlogs/zhang.ge_${DATE}.log
#定义死链文件存放路径
deathfile=/home/wwwroot/zhang.ge/death.txt
#定义网站访问地址
website=https://zhang.ge
#分析日志并保存死链数据
for url in `awk -v str="${UA}" '$9=="404" && $15~str {print $7}' ${logfile}`
do
grep -q "$url" ${deathfile} || echo ${website}${url} >>${deathfile}
done
使用说明:
①、脚本适用于每天都做了日志切割的 Nginx,没有做的朋友可以参考博客之前的文章:
#执行如下命令编辑任务计划[root@Mars_Server ~]# crontab -e #每天凌晨 1 点执行此脚本(注意脚本的实际路径)0 1 */1 * * /root/death.sh >/dev/null 2>&1 #按下 ESC,然后键入 :wq 保存并退出
③、执行后,将在网站根目录生成死链文件:death.txt,可以浏览器访问看看内容,比如:
效果截图:
下面贴上这几天死链抓取(百度定时抓取,无需人工干预)及处理情况,效果还是非常明显的:
注意事项:
①、如果你的 nginx 服务 并没有配置相应的 access 日志,请自行在 server 下添加所需网站的 access 日志,否则脚本无法使用;
②、脚本适用的 access 日志格式如下:
log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for';
如果和你的不一样,则需要修改脚本中的 awk 指定的域(即$9、$15 以及$7)
三、其他拓展
①、如果你之前没有做过 Nginx 日志切割,那么可以直接用下面这个脚本来一次性搞定:
#!/bin/bash
#Desc: Cut Nginx Log and Create Death Chain File
#Author: ZhangGe
#Blog: https://zhang.ge/5038.html
#Date: 2015-05-03
#①、初始化变量:
#定义 access 日志存放路径
LOGS_PATH=/home/wwwlogs
#定义蜘蛛 UA 信息(默认是百度蜘蛛)
UA='+http://www.baidu.com/search/spider.html'
#定义网站域名(需要先给相应的网站以域名形式配置了 nginx 日志,比如 zhang.ge.log)
DOMAIN=zhang.ge
#定义前一天日期
DATE=`date +%Y-%m-%d -d "1 day ago"`
#定义日志路径
logfile=/home/wwwlogs/zhang.ge_${DATE}.log
#定义死链文件存放路径
deathfile=/home/wwwroot/zhang.ge/death.txt
#定义网站访问地址
website=https://zhang.ge
#②、Nginx 日志切割
mv ${LOGS_PATH}/${DOMAIN}.log ${LOGS_PATH}/${DOMAIN}_${DATE}.log
kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'`
#可选功能: 自动删除 30 天之前的日志,可自行修改保存时长。
cd ${LOGS_PATH}
find . -mtime +30 -name "*20[1-9][3-9]*" | xargs rm -f
#③、网站死链生成(百度专用)
#分析日志并保存死链数据
for url in `awk -v str="${UA}" '$9=="404" && $15~str {print $7}' ${logfile}`
do
grep -q "$url" ${deathfile} || echo ${website}${url} >>${deathfile}
done
②、其他 WEB 服务器,比如 Apache 或 IIS,只要参考脚本思路,修改成实际的路径或日志字段,同样可以写一个相同功能的 Shell 或 Batch 脚本,有需求的朋友自己去研究折腾吧!