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";
    }
  }

如非特别声明,本站作品均为原创,遵循【自由转载-保持署名-非商用-非衍生 创意共享 3.0 许可证】。

对于转载作品,如需二次转载,请遵循原作许可。