我正在考虑新 Web 服务器的架构。将 Varnish 作为 Nginx 前的缓存作为反向代理,并在 apache 前为所有繁重的工作提供静态文件是一个好主意吗?
我将在 Rails 应用程序上运行 php 和 ruby。
通过其他两个进程将 php 请求传递给 apache 会有太多开销吗?
非常感谢!
我有一个运行 nginx/php-fpm/varnish/wordpress 和 amazon s3 的系统。
现在我在设置系统时查看了很多配置文件,在所有这些文件中我发现了这样的内容:
/* If the request is for pictures, javascript, css, etc */
if (req.url ~ "\.(jpg|jpeg|png|gif|css|js)$") {
/* Remove the cookie and make the request static */
unset req.http.cookie;
return (lookup);
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么要这样做。大多数示例还将 NginX 作为网络服务器运行。现在的问题是,为什么要使用 varnish 缓存来缓存这些静态文件。
对我来说只缓存动态文件更有意义,这样 php-fpm / mysql 就不会受到太多影响。
我是正确的还是我在这里遗漏了什么?
我想根据给出的答案向问题添加一些信息。
如果您有一个动态网站,其中内容实际上发生了很大变化,则chaching 没有意义。但是,例如,如果您将 WordPress 用于静态网站,则可以将其缓存很长时间。
也就是说,对我来说更重要的是静态内容。我在不同的缓存应用程序和网络服务器应用程序上找到了一些测试和基准测试的链接。
http://nbonvin.wordpress.com/2011/03/14/apache-vs-nginx-vs-varnish-vs-gwan/
NginX 实际上在获取静态内容方面更快,因此让它通过更有意义。NginX 适用于静态文件。
——
除此之外,大多数时候静态内容甚至不在网络服务器本身中。大多数情况下,这些内容存储在 CDN 上的某个地方,可能是 AWS S3 之类的。我认为清漆缓存是您希望存储静态内容的最后一个地方。
如何读取 varnishhist 直方图/图形?我知道 x 轴是对数刻度。
具体来说:
我看到 9 个“|”或缓存命中发生y=1e-4,每个“|”是什么 参考?页?文件?
我看到这 9 个“|”左侧的点击次数较少,而右侧的点击次数较少。那些是什么?他们是否花费了更长(右)和更短(左)的时间......?
在顶部,左侧是什么1:2?和n = 134
此外,我注意到缓存命中总是在缓存未命中的左侧,即它们在1e-x事物的一边,而缓存未命中则低于 + 指数。那有什么意义呢?那个时候,如果是的话,是什么时间......?
非常感谢!
x轴
1:2, n = 134 hostname
#
#
#
#
#
| #
| #
| #
| #
| ###
| ###
|| ### ##
||| ### ## # # ##
|||| #### #### ## ## # ###
+---------+---------+---------+---------+---------+---------+---------+---------+---------
|1e-6 |1e-5 |1e-4 |1e-3 |1e-2 |1e-1 |1e0 |1e1 |1e2
Run Code Online (Sandbox Code Playgroud) 我正在使用 Varnish 3.0.3(撰写本文时的最新版本),或多或少是默认安装,使用以下存储:
# # Cache file location
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin
#
# # Cache file size: in bytes, optionally using k / M / G / T suffix,
# # or in percentage of available disk space using the % suffix.
VARNISH_STORAGE_SIZE=4000M
#
# # Backend storage specification
VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"
#
Run Code Online (Sandbox Code Playgroud)
大多数可以缓存的页面都有很长的 TTL。我正在使用的站点很大,有数百万个页面,这不可能适合上面列出的存储大小 (4 GB)。
设置问题:
让我们假设整个存储空间已满,并且缓存中的任何内容都没有过期(我的 TTL 是缓存中每个项目的 2 周)。
我假设 Ban Lurker 在这里没用,因为它只会删除过期的项目,而没有过期的项目。
问题:
鉴于上述情况,当额外的请求进入缓存中尚未存在的内容时,Varnish 会发生什么情况?无论这些项目的 TTL 是多少,Varnish 是否会尝试从缓存中删除旧项目?清漆会崩溃吗?悬挂?
如果 Varnish 不处理场景,我可以做些什么来配置它以更好地处理场景?(我显然可以降低缓存中项目的 TTL,但我想知道是否有任何其他建议)。
在这种情况下,我看到 Varnish 有效地停止响应请求。在发生这种情况时,我并没有耗尽内存或 CPU 的内存。
谢谢。
跟进: …
我的 php 脚本正在发送一个标头X_Cache_ttl: 1h,在我的清漆配置文件中我有
sub vcl_fetch
{
if(beresp.http.X-Cache-ttl){
set beresp.ttl = beresp.http.X-Cache-ttl;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试启动它时,带有 set 命令的行导致 varnish 失败。
在我得到的日志中
Expression has type STRING, expected DURATION
('input' Line 116 Pos 34) -- ('input' Line 116 Pos 56)
set beresp.ttl = beresp.http.X-Cache-ttl;
Run Code Online (Sandbox Code Playgroud)
如何转换X-Cache-ttl为持续时间以便我可以动态设置 TTL?
我想避免多个类似的 if 语句
if(beresp.http.X-Cache-ttl == "60s") {
set beresp.ttl = 60s;
}
if(beresp.http.X-Cache-ttl == "1h") {
set beresp.ttl = 1h;
}
Run Code Online (Sandbox Code Playgroud)
如果重要的话,我在 centos 6 上使用 varnish 3.0.3。
对于工作,我在 CentOS 上使用 Varnish 3,但在家里我在 Ubuntu 14.04 上使用 Varnish 4。
在工作中,我使用这些命令:
Top hits: varnishtop -i rxurl
Top Misses: varnishtop -i txurl
Run Code Online (Sandbox Code Playgroud)
但出于某种原因,它们不适用于 Varnish 4 Ubuntu。
Varnish 4 的这些命令的等价物是什么?
我正在为电子商务平台开发一个缓存系统,该系统将使用反向代理进行缓存。我计划通过使用正确的 HTTP/1.1 标头来处理失效。也就是说,我将在第一代内容上设置一个 ETag,并在应用程序中缓存该 ETag 值。Cache-Control 标头将指定“必须重新验证”,因此代理应在带有 ETag 的后续请求上设置 If-None-Match 标头。应用程序将查找缓存的 ETag 值,如果匹配将发送 304 响应,否则将生成完整的 200 响应。
我希望使用 nginx,但我不能确定它是否支持 ETag(文档表明它不支持,但也许它们已经过时了?)。清漆是另一种选择,但我在这里也不乐观..
哪些反向代理服务器完全支持 ETag?我希望它能够真正缓存多个版本,这样我就可以在不必禁用缓存的情况下进行拆分测试之类的操作。也就是说,HTTP/1.1 指定客户端可以发送带有多个 ETag 值的 If-None-Match,服务器应响应匹配的 ETag(如果有)。如果反向代理保留多个副本而不仅仅是最后看到的值,并让服务器在每个请求上指定要使用的值,那将是理想的。
最近,我们的 Varnish (3x) -> Apache (3x) 设置出现问题,导致SYN_SENT连接激增。
峰值本身是由于访问站点的新流量(不是任何类型的 DDOS),而且我们的 Varnish 机器似乎在将流量转发到后端服务器时遇到问题(Apache 流量下降与清漆峰值相关) ),使可用端口池拥塞SYN_SENT。
在 Apache 上启用 Keep-alives(15 秒)。
错在哪一边?流量很大,但无论如何都不会导致这种设置(3 个 Varnish 前端机器,3 个后端 Apache 服务器)停止。
请帮忙。
通过防火墙连接的 Munin 屏幕截图在这里。
漆
~$ netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
9 CLOSE_WAIT
12 CLOSING
718 ESTABLISHED
39 FIN_WAIT1
1714 FIN_WAIT2
76 LAST_ACK
12 LISTEN
256 SYN_RECV
6124 TIME_WAIT
Run Code Online (Sandbox Code Playgroud)
/etc/sysctl.conf(清漆)
net.ipv4.netfilter.ip_conntrack_max = 262144
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60
net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem=4096 87380 …Run Code Online (Sandbox Code Playgroud) 我正在缓存动态生成的页面(PHP-FPM、NGINX)并在它们前面有清漆,这非常有效。
但是,一旦达到缓存超时,我就会看到:
我想做的是:
在我的情况下,过时信息不是一个大问题的网站,尤其是当我们谈论几分钟的缓存超时时。
但是,我不希望惩罚用户排队等待,而是立即提供一些东西。这在某种程度上可能吗?
为了说明这一点,以下是对我的服务器运行 5 分钟的示例输出,该服务器配置为缓存一分钟:
HTTP/1.1,200, 1.97, 12710,/,1,2013-06-24 00:21:06
...
HTTP/1.1,200, 1.88, 12710,/,1,2013-06-24 00:21:20
...
HTTP/1.1,200, 1.93, 12710,/,1,2013-06-24 00:22:08
...
HTTP/1.1,200, 1.89, 12710,/,1,2013-06-24 00:22:22
...
HTTP/1.1,200, 1.94, 12710,/,1,2013-06-24 00:23:10
...
HTTP/1.1,200, 1.91, 12709,/,1,2013-06-24 00:23:23
...
HTTP/1.1,200, 1.93, 12710,/,1,2013-06-24 00:24:12
...
Run Code Online (Sandbox Code Playgroud)
我省略了大约运行的数百个请求0.02。但是我仍然担心用户必须等待近 2 秒钟才能获得原始 HTML。
我们不能在这里做得更好吗?
(我遇到Varnish send while cache,听起来很相似,但不完全是我想要做的。)
解决方案
Shane Madden 的回答包含了解决方案,但我没有立即意识到。还有一个细节我没有包含在我的问题中,因为我认为它不相关,但实际上它是。
我目前使用的 CMS 解决方案有一个 varnish 数据库侦听器,因此能够通知 varnish 禁止内容已更改的页面。它发送了一个PURGE带有一些正则表达式的请求来禁止某些页面。 …
运行 Varnish 4,我偶尔会遇到 503 错误,我无法将手指插入。我试过curl直接 ing 后端,它每次都返回响应,所以看起来问题不存在。下面是来自我的 varnishlog 的条目,但它并没有告诉我太多。我通过运行命令获得了这个日志
varnishlog -q "RespStatus >= 500 or BerespStatus >= 500"
Run Code Online (Sandbox Code Playgroud)
这是日志条目
* << Request >> 524356
- 524356 Begin c req 524355 rxreq
- 524356 Timestamp c Start: 1421453220.095464 0.000000 0.000000
- 524356 Timestamp c Req: 1421453220.095464 0.000000 0.000000
- 524356 ReqStart c 173.255.199.52 38213
- 524356 ReqMethod c GET
- 524356 ReqURL c /asd/asdasd
- 524356 ReqProtocol c HTTP/1.0
- 524356 ReqHeader c X-Real-IP: 206.169.79.151
- 524356 ReqHeader c …Run Code Online (Sandbox Code Playgroud) varnish ×10
cache ×3
nginx ×3
apache-2.2 ×2
ttl ×2
503-error ×1
architecture ×1
etags ×1
graph ×1
http ×1
networking ×1
performance ×1
tcp ×1
web-server ×1