nginx 层面缓存 rss 请求
从数据库中一下取出全站所有博文的全文、所有标签,然后还要把所有文章的 md 格式文本转成 html,是比较浪费性能的。
目前博文没有做分页,50篇以内都不会考虑做分页——这两天突然看到一个大佬的博客,190多篇都没有分页,感觉特别酷,人家还没有标签,我有标签,又有搜索,更不用分页了。我决定了,200篇以下都不分页,看看到时候有没有性能问题😃
之前听说有些 rss 阅读器会高频访问 rss 源,考虑到这个问题,我的 rss 是不提供全文的,仅提供 title & description。今天突然想到,可以从 nginx 层面缓存一下,频繁访问也没事,nginx 直接吐出去,不用重新去数据库拿,好像挺好的。
以下是关键的 config, 完整内容请移步 github nginx.conf
# 作 key 时忽略查询参数
map $uri $noargs_uri {
~^(?P<path>[^?]*)(?:\?.*)?$ $path;
}
upstream nextjs_upstream {
server 127.0.0.1:3000;
keepalive 500;
}
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=nextjs_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
# ...
location / {
# ...
}
# rss 源缓存
location /rss.xml {
# ...
proxy_cache nextjs_cache;
# 缓存一小时
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
# 忽略 upstream Cache-Control, nginx 强制缓存
proxy_ignore_headers Cache-Control;
# proxy_cache_key 忽略 search params
proxy_cache_key "$scheme$request_method$host$noargs_uri";
}
}