如何使用清漆来加快我的网站

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.1,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

如何使用清漆来加快我的网站

因为Symfon欧宝娱乐app下载地址y的缓存使用标准的HTTP缓存头,所以HTTP缓存可以很容易地替换为任何其他反向代理。清漆是一个强大的,开源的,HTTP加速器能够快速服务缓存内容,包括支持边边包含

使Symf欧宝娱乐app下载地址ony信任反向代理

清漆自动转发IP为X-Forwarded-For并留下X-Forwarded-Proto请求中的头。如果您没有将Varnish配置为受信任的代理,Symfony会将所有请求视为来自Varnish主机的欧宝娱乐app下载地址不安全HTTP连接,而不是真正的客户端。

记住配置framework.trusted_proxies在Symfon欧宝娱乐app下载地址y配置中,以便Varnish被视为受信任的代理X-Forwarded使用头文件。

Varnish,在它的默认配置下,发送X-Forwarded-For标题,但不会过滤掉转发头。如果您可以访问Varnish配置文件,则可以配置Varnish以删除转发标题:

1 2 3
sub vcl_recv {unset req.http.Forwarded;}

如果您无法访问Varnish配置,则可以将Symfony配置为不信任欧宝娱乐app下载地址转发标题,详情见如何配置Symfony在负载均衡器欧宝娱乐app下载地址或反向代理后工作

路由和X-FORWARDED报头

为了确保Symfony路由器使用Var欧宝娱乐app下载地址nish正确地生成url,一个X-Forwarded-Port头必须存在,Symfony才能使用正确的端口号。欧宝娱乐app下载地址

此端口号对应于您的安装程序用于接收外部连接的端口(80是HTTP连接的默认值)。如果应用程序也接受HTTPS连接,那么在默认HTTPS端口443上可能有另一个代理(因为Varnish本身不做HTTPS),该代理处理SSL终止,并将请求作为HTTP请求转发给VarnishX-Forwarded-Proto头。此时需要添加如下配置片段:

1 2 3 4 5 6 7
Sub vcl_recv {如果(req.http。X-Forwarded-Proto = =“https”) {req.http。X-Forwarded-Port =“443”;}其他的req.http。X-Forwarded-Port =“80”;}}

Cookies和缓存

默认情况下,正常的缓存代理在发送请求时不缓存任何东西cookie或基本身份验证头.这是因为页面的内容应该依赖于cookie值或身份验证头。

如果您确定后端从不使用会话或基本身份验证,请让Varnish从请求中删除相应的头,以防止客户端绕过缓存。在实践中,你至少在站点的某些部分需要会话,例如,当使用表单时CSRF保护.在这种情况下,一定要做到只有在实际需要时才启动会话并在不再需要时清除会话。或者,你可以调查缓存包含CSRF保护表单的页面

用JavaScript创建且仅在前端使用的cookie,例如当使用谷歌Analytics时,仍然会被发送到服务器。这些cookie与后端无关,不应该影响缓存决策。配置你的清漆缓存为清理cookie报头.您希望保留会话cookie(如果有的话),并删除所有其他cookie,以便在没有活动会话时缓存页面。除非您更改了PHP的默认配置,否则会话cookie具有此名称PHPSESSID

  • 清漆4
  • 清漆3
12 3 4 5 6 7 8 9 10 11 12 13 14 15
Sub vcl_recv {//删除除会话ID外的所有cookie。如果(req.http.Cookie) {req.http.Cookie =”;"+ req.http.Cookie;req.http.Cookie = regsuball(req.http.Cookie,”;+””;");req.http.Cookie = regsuball(req.http.Cookie,”;(PHPSESSID) = "”;1 = " \);req.http.Cookie = regsuball(req.http.Cookie,";[^ ][^;]*"”“);req.http.Cookie = regsuball(req.http.Cookie,“^;) + | (;+ $””“);如果(req.http。饼干= =”“) {//如果没有cookie,删除页眉以缓存页面。设置req.http.Cookie;}}}

提示

如果内容对每个用户都不不同,而是取决于用户的角色,则解决方案是为每个组分离缓存。类实现并解释了此模式FOSHttpCacheBundle用……的名字用户上下文

确保一致的缓存行为

Varnish使用应用程序发送的缓存头来确定如何缓存内容。然而,Varnish 4之前的版本并不尊重cache - control: no - cache不是商店而且私人.为了确保一致的行为,如果您仍在使用Varnish 3,请使用以下配置:

  • 清漆3
1 2 3 4 5 6 7 8 9 10 11
subvcl_fetch {/*默认情况下,Varnish3忽略Cache-Control: no-cache和private https://www.varnish-cache.org/docs/3.0/tutorial/increasing_your_hitrate.html#cache-control */如果(beresp.http。缓存-Control ~“私人”| | beresp.http。cache - control ~“no - cache”| | beresp.http。cache - control ~“不是商店”) {返回(hit_for_pass);}}

提示

你可以在VCL文件中看到Varnish的默认行为:default.vcl对于清漆3,builtin.vcl4.清漆。

启用边缘包含(ESI)

如在包含章节, 欧宝娱乐app下载地址Symfony检测它是否与一个理解ESI的反向代理通信。当使用Symfony反向代理时,您欧宝娱乐app下载地址不需要做任何事情。但是要使Varnish而不是Symfony解析ESI标记,您需欧宝娱乐app下载地址要在Varnish中进行一些配置。欧宝娱乐app下载地址Symfony使用Surrogate-Capability标头的边缘结构Akamai描述。

请注意

清漆只支持srcESI标签属性(onerror而且alt属性被忽略)。

首先,配置Varnish,使其通过添加Surrogate-Capability转发到后端应用程序的请求头:

1 2 3 4
Sub vcl_recv {//添加一个代理能力报头来宣布ESI支持。req.http。Surrogate-Capability =“abc = ESI / 1.0”;}

请注意

美国广播公司除非您有多个“代理”需要宣传其功能,否则部分标题并不重要。看到Surrogate-Capability头获取详细信息。

然后,优化Varnish,使其仅在至少有一个ESI标记时解析响应内容Surrogate-ControlSymfony自动添加的欧宝娱乐app下载地址头文件:

  • 清漆4
  • 清漆3
1 2 3 4 5 6 7
Sub vcl_backend_response {//检查ESI确认并删除代理控制头如果(beresp.http。Surrogate-Control ~“ESI / 1.0”){取消设置beresp.http. proxy - control;beresp。do_esi =真正的;}}

提示

如果您遵循了关于确保一致的缓存行为的建议,那么这些VCL函数已经存在。只需将代码附加到函数的末尾,它们不会相互干扰。

缓存失效

如果希望缓存频繁更改的内容,并且仍然向用户提供最新版本,则需要使该内容无效。而缓存失效允许您在代理过期之前清除内容,这增加了缓存设置的复杂性。

提示

开源FOSHttpCacheBundle通过帮助您组织缓存和无效设置,消除缓存无效的痛苦。

的文件欧宝体育电话FOSHttpCacheBundle解释如何为缓存失效配置Varnish和其他反向代理。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。