迁移通知
本站内容正在逐步向 https://www.weiran.ink 迁移,更新内容请到新站查找。
Doku wiki反向代理超级缓存方案
这是网站建好之后的事情了,之前的内容参见这里。
nginx反向代理的缓存设置
首先,需要新建一个缓存用的空间,找个IO快的地方新建个文件夹分配给www-data
用户,然后在nginx.conf
这里配置:
## cache proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=rev_proxy_cache:50m inactive=600m max_size=1g;
/var/cache/nginx
是文件夹地址,rev_proxy_cache
是这个缓存区的名字。
然后,在网站设置中增加启用缓存的选项:
location / { ... proxy_buffering on; #proxy_buffer_size 4k; #proxy_buffers 8 10M; #proxy_busy_buffers_size 20M; #proxy_max_temp_file_size 0; proxy_cache rev_proxy_cache; proxy_cache_valid 200 302 304; proxy_cache_key $host$uri$is_args$args; }
这样搞一下之后,大部分东西就进缓存了(但偏偏核心页面内容——虽然文件不大——没有被缓存),可以通过在server
部分加一行add_header X-Cache-Status $upstream_cache_status;
,然后检查响应头中的X-Cache-Status
字段来检查缓存生效情况。
超级缓存
对于服务器在家,靠公网中转的情况,一个比较好的缓存模式时:让公网尽量多的缓存东西,甚至在家里服务器挂掉时也能继续提供有限的服务。为此,可以添加这么几行:
location / { ... proxy_buffering on; #proxy_buffer_size 4k; #proxy_buffers 8 10M; #proxy_busy_buffers_size 20M; #proxy_max_temp_file_size 0; proxy_cache rev_proxy_cache; proxy_cache_valid 200 302 304; proxy_cache_key $host$uri$is_args$args; proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; proxy_cache_background_update on; }
但是,上面几行依然没有解决全部问题,因为doku
的核心页面在向外传输时,会被加上Cache-control: no-cache no-store
的header
,进而使得nginx
不缓存这部分内容。从doku
来看,这对于保持页面正确是必要的,但对于上述目标是个障碍。
此时,可以考虑再加一行很强力的命令:
proxy_ignore_headers Expires Cache-Control Set-Cookie Vary;
意思是在决策缓存与否时不参考这几个header
。实测效果惊人,但有一个很强的副作用:没法登陆了!因为登陆后页面跟登陆前页面地址是一样的,被缓存了嘛……
但是可以继续走偏门:如果域名控制权在你手里,可以另外新建一个子域名,把上述缓存很好的nginx
配置文件复制一份,绑定到这个新域名上,然后删去其中有关强力缓存的部分(可以保留普通缓存)。这样你就有了一个不带缓存的版本,用于自己管理用。
注意:如果这样搞的话,有两个注意事项:
- 一定要在开工之前把
doku
后台配置中的baseurl
设置为空,让它自动检测,否则这个管理专用域名很容易在各种地方跳转去前台,甚至修改配置后都要手动改一下域名才能设置成功。 - 如果做了
SSL
,一定要做http
到https
的自动跳转,以及在nginx
中add_header Strict-Transport-Security
,因为往往后台是不加密的,doku
在没有baseurl
时给出的是http
开头的链接,比较影响体验。