我使用NGINX microcaching获得了非常好的性能结果。
但是,我仍然不确定如何最好地处理具有Set-Cookie
标头的服务器响应。
Set-Cookie
NGINX 是否可以缓存来自原始服务器的带有标头的响应?
如果答案是否定的,并且Set-Cookie
响应应该始终绕过缓存层,这将对性能产生非常负面的影响。
例如,当您访问一个运行 WooCommerce 的普通电子商务网站时,这些 cookie 将在您第一次访问时设置:
设置 Cookie:PHPSESSID=xxyy
设置 Cookie:wp_woocommerce_session_xx=yy
如果Set-Cookie
响应被排除在缓存之外,这意味着缓存的内容将永远不会在任何电子商务商店中首次访问时提供。
此外,在 WooCommerce 商店浏览产品时,该插件会设置woocommerce_recently_viewed=xxxx
cookie。woocommerce_recently_viewed
cookie 将在每个产品视图上更新,因此对其他产品的所有后续请求都会导致服务器包含Set-Cookie
标头。
- 在这种情况下可以启用缓存吗?
我在 NGINX 中使用的一些默认缓存配置包括:
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
如果我woocommerce_recently_viewed
在列表中包含 cookie,缓存大部分时间都会被绕过。
- 在这种情况下处理缓存和 cookie 的最佳做法是什么?
一般来说,缓存对于动态内容的效果不佳,尤其是对于包含诸如“最近查看”之类的内容的内容,这些内容会改变每个单一页面的加载。如果您真的想使用缓存,那么第一步是禁用该插件,以便理论上可能会为某人提供两次相同的页面。第二步是仅在有人执行需要执行的操作时才启动会话:登录、将商品放入购物车等。从那时起,您将不得不在创建会话 cookie 后停止缓存(否则,如果客户只在一段时间内访问缓存,则会话将在客户和服务器端都过期)。
我认为像这种缓存这样的内容最好在应用程序本身中完成。应用程序应该了解网页的哪些部分是动态的,并且需要在每次页面加载时重新生成,并且可以将网页从新的和使用过的部分组装起来,以便给用户正确的响应。
DerfK 对整个页面级别的动态内容是正确的,您绝对不希望发生 cookie 泄漏。
但是,您可以在上游层进行更多缓存 - 特别是 WordPress,它具有不错的可插入对象缓存。这意味着,虽然页面本身不会被缓存,但您可以将大部分数据库负载存储在临时存储中,例如 memcached (batcache) 或 redis。这些 KV 存储比 MySQL 快得多,并且由于它们在对象和应用程序级别工作,它们不会直接受到 WooCommerce 发送的 cookie 的影响。