在 Apache 中,从浏览器下载静态文件会出错

在 Apache 中,从浏览器下载静态文件会出错

我首先要感谢 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。

相关内容