sitemap
Sitemap 相当于专门给爬虫爬取的菜单,里面包含了所有的文章 url 和发布时间,是引导爬虫抓取的最高效方式。
要让 typecho 生成正确的 sitemap,有两个基本前提:
- 站点地址正确配置:在Typecho后台的「设置 -> 基本」中,必须填入精准的网站域名,并注意区分
http
与https
,以及域名末尾不要多加斜杠/
。 - 开启地址重写:在「设置 -> 永久链接」中,务必勾选“启用地址重写功能”,这样才能生成对SEO友好的静态化URL。
由于主题自带 sitemap 功能,我直接打开就行了。如果没有 sitemap 需要下载个 sitemap 插件。
但是当我在打开域名/sitemap.xml 的时候,发现后台 loc 元素是空的,相当于无法从 sitemap 获取到任何的文章 url 信息。和主题作者交流,他几乎瞬间就知道问题在那里,很快就改了一版正确的给我了(这就是作者建了群的好处,GitHub 提 issue 可能都没这么快)。
在几个月前我就发现了 SEO 的功能,在百度站长平台得到了 Meta 验证代码,放在了顶部。到现在还是不给我提交 sitemap,百度这个平台实在是坑。在 bing 站长平台倒是可以直接提交 sitemap。
PHP 配置
然后是在百度测试抓取诊断,很多文章都失败,显示 socket 读写错误
。它意味着百度蜘蛛已经连接到了我的服务器,但在下载网页内容的过程中连接被意外中断了。这通常指向服务器端的问题。
排查是 PHP 默认配置太过保守,无法应对百度蜘蛛的并发抓取,需要修改一下。
进入 PHP 容器,docker exec -it server-php /bin/sh
编辑 www.config 文件,vi /usr/local/etc/php/php.ini
; 将最大进程数提升到一个更稳健的值
pm.max_children = 30
; 其他关联值也相应提高
pm.start_servers = 8
pm.min_spare_servers = 8
pm.max_spare_servers = 15
; 增加一个“保险丝”:如果单个请求处理超过60秒,就自动终止它
; 默认为0代表不限制,设置60这可以防止某个卡死的进程一直占用资源
request_terminate_timeout = 60
exit
退出后重启 php 容器,docker restart server-php
接着再去测试,之前抓取失败的全部都抓取成功。
不仅解决了百度抓取失败的问题,还有意外之喜:网站的整体响应速度得到了提升。