1

我有一个已经使用 codeiginter 内置缓存的 codeiginter 应用程序,我将 Varnish 用作新的缓存层。但正如我从 varnishstat 中看到的那样,它并没有那么大的不同。

Hitrate ratio:        1        1        1
Hitrate avg:     0.0480   0.0480   0.0480

我认为那是因为 Codeiginter cookie 和 HTTP 标头被发回。

这是来自 varnish 的 http 请求。

Accept-Ranges:bytes
Age:0
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:keep-alive
Content-Encoding:gzip
Content-Length:1755
Content-Type:text/html
Date:Mon, 29 Jul 2013 07:25:59 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Pragma:no-cache
Server:Apache/2.2.22 (Ubuntu)
Set-Cookie:ci=%2BEZFRauewyNnl3CXHE0cmz6F3G3moadilt5vXu5gghKXkWm4gg0JObnF2Etq6J5rl3XVigbF0je3funibpvEi4X%2BT3rS2VmazGG3T4Vm1%2B8YcbqRgL4xuMcxybndqJy%2BU9mNmsJjOgmYEZ8oPG8BKOtMaxNiMHmgmbBydxt3SzKfFfFUOydFx%2BeeJ7P1WE7V10m6GyfnFO5DrFYNsE%2F37WNAI%2Bpux%2Fwwch5B4DH1%2F6wssPm%2BNwsLQ1%2FBd44hgUXe3mMzzcqvxNjKqs0gjuwzwPT4nibEHirfaJ7TMVGObMjdrbREnoYS2gwoN15cCeKgXmTJQI2vvTuPcdtZVCjcAX6OvTy491HdIvQIdKRhX2BNi8d7ygo%2F7n5T6%2FN%2B0IohNN9iZ%2Fh959W%2Fz4azEJPfTrluucf6cLnlp2T2zb%2Fb3XroWuPqguk4wMpsAstfLsSfA%2F6yEi4Hph%2BPFxX%2BhyBazs11LJ38FA0flWtYY%2Bk%2B6yoF13sTaENN2pWj0bKDTtres9E4y3xMPr%2FZaO78WRA9CccDzcQfbZ3bZUqoXg4HmX%2BHDHiYPLD6uFpnC28LuDrCSbgXFIlhDrC8j65sxNSKhnzlUP7Konr%2FKRfKNzrgtWHBEzuXArW%2BlgIg1MzaW3GIkRy1gr16ZUjIiv7CCx7Y2twAfKOm4t00MvrTcFoxBPN1lzoasNyRLMIvshU8heWZHy17OPEapuO6N%2BuMl9L8LqU0%2FF%2BUeUDyFVwLG39LGkIVuF93VsIYEp6w2UwtccX4OO4P2uwJEoAJMMqUE%2FztELpCv%2BkfRAiub48n%2BRxK%2FhgUHw1LWsWIPv3xngq3MI8ypWCqkWLjPuu5dc%2FdOd3BSW2MYcBwacoB5CEOPBHGq3hw1QSZfY330hkLuyQPHxkh%2FDTija%2FN2Rz6z47JorsCqHGDBK6%2BPswBWvYZeMd0VMD%2F95j%2BFibi6rBqL3hoE%2BDgcfCdly%2FYH9py%2Fe%2Fa0AUiIINTK8EPtpuKdC8dLhKo2jI5J4e1ifZuWjVd3VnL2CvX; path=/
Vary:Accept-Encoding
Via:1.1 varnish
X-Powered-By:PHP/5.3.10-1ubuntu3.5
X-Varnish:1353481467

我注意到不同的事情:

  1. 无论我多么努力,codeiginter 都不会改变 Cache-Control, Age,Expires直到我手动设置它们
  2. Codeiginiter 发送了一个旧日期 1981 我加倍检查了我服务器上的日期,它是正确的
  3. Codeiginiter 几乎在每次请求时都会更改 cookie。

在我的应用程序中,我有几个页面需要用户名/密码,但我试图首先专注于让公共页面被缓存。之后,我将检查帐户相关页面。

我正在测试这段代码:

//$this->output->set_header("Cache-Control:public, max-age=9000");
//$this->output->set_header("Vary: Accept-Encoding,Cookie,User-Agent");  
$this->output->cache(2400);
$this->load->view("test");
4

2 回答 2

0

如果您的后端正在发送Cache-control: max-age=XXX,您可以忘记 Expires 标头,因为它将在符合 HTTP 1.1 的客户端和代理 [1] 中被忽略(实际上,通常将其设置为过去以避免旧的 HTTP 1.0 客户端缓存项目) .

设置标头时要非常小心Vary: User-Agent,因为它会损害您的缓存机会 [2]

最后,由于标头,Varnish 不会缓存这样的请求Set-Cookie。Varnish 需要惰性会话初始化(参见 [3])来缓存事物(或相当复杂的 VCL)

如果您修复了 cookie 的问题,但仍然存在问题,那么 VCL 文件和清漆版本将非常有用。

[1] http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

[2] https://www.varnish-cache.org/docs/3.0/tutorial/vary.html

[3]我应该如何在 PHP 中实现惰性会话创建?

于 2013-07-29T12:36:38.937 回答
0

您的 cookie 问题是我目前正在努力解决的问题。我从您的示例中猜测您已将 cookie_name 变量更改为 ci 而不是 ci_session。

对您来说最简单的事情 - 对于简单的某些值 - 可能是放弃 CI 的会话处理以替代或切换到基于 db 的 cookie 而不是基于 cookie。如果有一个 set-cookie - 当你有会话初始化/自动加载时总是存在 - 它不会被缓存。如果数据全部存储在服务器端,则不会出现此问题。

就我个人而言,我并不热衷于为我们使用会话引入数据库,所以我将尝试将缓存控制标头设置为忽略 cookie,并在我知道永远不会成为用户的视图顶部使用 header_remove()特定的(例如我们的 RSS 提要)。

于 2014-06-27T22:11:11.030 回答