我首先要感谢 serverfault 的所有人创建了这个出色的网站,我也在 Google 上搜索各种与服务器相关的问题和设置时访问了这个网站。
我今天也遇到了一个问题,所以我在这里发帖,希望前辈们能帮我解决。几天前,我在一台专用服务器上建立了一个网站,由于流量有点大,我使用 Varnish 3 作为 Debian Lenny 服务器上 Apache2 的前端。网站上有几个静态文件下载,大小约为 10-20 MB。在我设置后的几天里,网站看起来不错。我使用 5mbps + 宽带连接进行检查,文件下载也在几秒钟内完成,运行良好。
但今天我发现,在网络连接较慢的情况下,文件下载会中断。当我尝试使用浏览器从网站下载文件时,大约一分钟后就中断了。这种情况反复发生,所以这与网络连接无关。网络连接速度约为 512 kbps,因此速度也不是拨号级别的,而是不错的速度,虽然没有那么快,但文件应该可以轻松下载。
然后我想尝试使用 apache 后端端口,并使用端口号来检查是否出现问题。但是,在静态文件下载 URL 中添加 apache 端口后,文件很容易下载,甚至没有中断过一次。我尝试了几次以确保这不是巧合,但每次我在文件下载 URL 中使用 apache 端口时,它都可以正常下载,而每次使用正常链接时它都会中断,我猜是通过 Varnish 路由的。所以,似乎 Varnish 以某种方式导致了文件下载中断。
有人能解释为什么会发生这种情况以及如何解决该问题吗?
为了更清楚说明,请看以下例子:
Apache 后端设置在端口 8008 上,Varnish 前端设置在端口 80 上
现在当我下载时说
http://mywebsite.com/directory/filename.extension
然后下载在一分钟左右后中断。我不能确定这是由于时间或大小的原因,我只是假设。也可能是其他原因。
但是当我使用以下方式下载时:
http://mywebsite.com:8008/directory/filename.extension
这样文件下载就不会中断,并且可以顺利下载。
因此,看起来 varnish 以某种方式导致文件下载中断,而不是 apache。有人知道为什么会发生这种情况以及如何修复它吗?任何帮助都将不胜感激。
我的 varnish default.vcl 是
backend apache {
set backend.host = "127.0.0.1";
set backend.port = "8008";
}
sub vcl_deliver {
remove resp.http.X-Varnish;
remove resp.http.Via;
remove resp.http.Age;
remove resp.http.Server;
remove resp.http.X-Powered-By;
}
答案1
您已达到 Varnish send_timeout 限制。send_timeout 的默认值为 600 秒,Varnish 3.0 将其更改为 60 秒。这可能会导致下载时间超过 60 秒。
您可以使用 varnishadm 检查 send_timeout 参数的值:
varnishadm param.show send_timeout
这将输出类似以下内容的内容:
send_timeout 60 [seconds]
Default is 60
Send timeout for client connections. If the HTTP
response hasn't been transmitted in this many
seconds the session is closed.
See setsockopt(2) under SO_SNDTIMEO for more
information.
NB: This parameter may take quite some time to
take (full) effect.
您可以使用以下方式将其设置为 600 秒:
varnishadm param.set send_timeout 600s
要使此设置持久化,您必须将“-p sendtimeout 600”添加到 Varnish 的启动参数中。这取决于您使用的发行版。如果是 Debian/Ubuntu,您可能需要编辑 /etc/default/varnish。