我们在 Ubuntu 12.04 下有服务器,安装了 Apache HTTP 2.2。
内核3.2.0。
下载某些文件时遇到奇怪的行为。
虚拟主机配置:
<Directory /var/www/name/*>
...
AllowOverride AuthConfig
# add these accordingly for the MIME types to be compressed
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
<Files *.gz>
SetOutputFilter DEFLATE
Header set Content-Encoding: gzip
Header append Content-Encoding: deflate
</Files>
</Directory>
问题是 - 有时由于未知原因无法下载某些(!)文件:当文件下载 99% 时 - 速度降至 0 并且下载停止。
tcpdump
日志中没有任何异常 - 但我在(下载速度== 0之后)结果中发现了一个奇怪的地方。
例如 - 在下载尝试期间badfile.gz
:
10:36:37.611369 IP (tos 0x0, ttl 64, id 7954, offset 0, flags [DF], proto TCP (6), length 1420)
37.**.**.176.80 > 10.**.**.25.55981: Flags [.], cksum 0x00a9 (correct), seq 228803:230171, ack 197, win 243, options [nop,nop,TS val 2097666946 ecr 811530774], length 1368
10:36:37.611396 IP (tos 0x0, ttl 64, id 64391, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->933a)!)
10.**.**.25.55981 > 37.**.**.80: Flags [.], cksum 0xac28 (incorrect -> 0xf8fc), seq 197, ack 230171, win 4053, options [nop,nop,TS val 811530824 ecr 2097666946], length 0
有Flags [.]
- 所以,它挂在数据传输上 - 没有Finalize
标志(据我所知)。
tcpdump
下载另一个文件的另一个例子goodfile.gz
(来自服务器端的同一 Apache 目录):
10:39:21.216118 IP (tos 0x0, ttl 64, id 18169, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->47c9)!)
10.**.**.25.55981 > 37.**.**.80: Flags [F.], cksum 0xac28 (incorrect -> 0x83bb), seq 0, ack 1, win 4096, options [nop,nop,TS val 811691867 ecr 2097666946], length 0
很少有文件具有不同的扩展名/大小/授权等 - 但问题只出现在其中少数几个。
所以 - 有时会出现问题,而无需在服务器端进行任何更改。有时badfile.gz
可以毫无问题地下载 - 有时(通常)它会挂起。
使用浏览器下载时也是如此 - Chrome 报告“失败 - 网络错误“,Firefox - 只是说“估计未知“在下载过程中。
如果我可以添加更多信息,请告诉我。
举几个例子。
badfile
第一的:
$ wget http://static.content.domain.net/assets/json/en-GB/content3.json.gz
...
HTTP request sent, awaiting response... 200 OK
Length: 229874 (224K) [application/x-gzip]
Saving to: 'content3.json.gz.3'
content3.json.gz.3 99%[==============...=====> ] 224.42K --.-KB/s eta 0s
和goodfile
:
$ wget http://static.content.domain.net/assets/json/en-GB/24k.tar.gz
...
HTTP request sent, awaiting response... 200 OK
Length: 24576 (24K) [application/x-gzip]
Saving to: '24k.tar.gz.1'
24k.tar.gz.1 100%[=========...======>] 24.00K --.-KB/s in 0.05s
2015-11-25 10:38:40 (440 KB/s) - '24k.tar.gz.1' saved [24576/24576]
PS 我们的网络配置足够复杂,包括办公室/数据中心之间的 VPN 隧道 - 也可能是这里的原因。
PPS 我们那里也有非常旧的系统:
# /usr/lib/update-notifier/apt-check --human-readable
205 packages can be updated.
154 updates are security updates.
但现在无法更新:-)
答案1
还有故事的延续:几天前,我们apt-get update
在一些 Ubuntu 12/14 机器上也遇到了问题 - 它无法完成,并且在列表下载期间也挂起。
NOC 团队在 Cisco ASA 的威胁检测设置中进行了修复,将其更改为“仅扫描到被动”。
答案2
我们还知道 Linux 服务器上的下载失败的问题与您所描述的完全一样。我们在这里追踪到 Linux 内核 3.x 和 Cisco ASA 之间的不兼容性。
请注意,涉及的其中一台机器具有最新的 3.x Debian 内核 3.16.0,并且我们的 ASA 固件更新是最新的。
这些症状并不是 100% 都能重现,而且似乎只影响较大的文件,并且当请求来自外部网络(在我们的例子中是 Internet)时,症状会加剧。
我们这里有一个本地 Linux 发行版的存储库,从互联网上下载 ISO 映像真是一团糟。
我们尝试用 来缓解这个问题,net.ipv4.tcp_sack = 0
甚至进行了实验net.ipv4.tcp_ecn = 0
,虽然它缓解了这个问题,但并没有在所有服务器中解决它们。
迁移到内核 4.2.0 后问题得到了彻底解决。
我还发现了一个线程,它描述了比我们尝试过的解决方法更多的解决方法sysctl
。
sysctl -w net.ipv4.tcp_sack=0
sysctl -w net.ipv4.tcp_congestion_control=reno
sysctl -w net.ipv4.tcp_frto=1
sysctl -w net.ipv4.tcp_early_retrans=1
他们还提到了我们不知道的 ASA 配置修复。我建议,如果您有思科设备并有思科支持,请让他们参与进来。
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1388786