Apache 不会提供大于约 2K 的图像

Apache 不会提供大于约 2K 的图像

刚刚将旧机器升级到 Ubuntu 10.04.2 LTS。Apache 不会向浏览器显示超过 2K 的图像。小图像似乎显示得很好。静态 HTML 和 PHP 也继续正常工作。

已安装:

apache2 2.2.14-5ubuntu8.4
apache2-mpm-prefork 2.2.14-5ubuntu8.4
apache2-utils 2.2.14-5ubuntu8.4
apache2.2-bin 2.2.14-5ubuntu8.4
apache2.2-通用 2.2.14-5ubuntu8.4

以下是浏览器中无法正常显示的图像的 ngrep:

T 192.168.0.4:32907 -> 192.168.0.54:80 [AP]
  获取 /path/path/logo.png HTTP/1.1..主机:192.1
  68.0.54..连接:保持活动..接受:application/xml,application/xhtml+
  xml,文本/html;q=0.9,文本/纯文本;q=0.8,图像/png,*/*;q=0.5..用户Ag
  客户端:Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13
   (KHTML,如 Gecko)Chrome/9.0.597.98 Safari/534.13..Accept-Enco
  ding:gzip,deflate,sdch..接受语言:en-US,en;q=0.8..接受-
  字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3....                      

T 192.168.0.54:80 -> 192.168.0.4:32907 [A]
  HTTP/1.1 200 OK..日期:2011 年 3 月 9 日,星期三 05:28:38 GMT..服务器:Apa
  che/2.2.14 (Ubuntu)..最后修改时间:2010 年 10 月 5 日星期二 11:59:17 GMT
  ..ETag:“17b6f4-15fe-491dd63eb2f40”..Accept-Ranges:字节..内容
  t 长度:5630..保持活动:超时=15,最大=100..连接:保持
  -Alive..Content-Type: image/png.....PNG........IHDR...!...v......
  .%.....sRGB.........bKGD.............pHYs.................tIME..
  ETC...

我认为这看起来不错!

我尝试过 Firefox 和 Chrome,它们都可以正常显示小图像,但是当请求大图像时,浏览器会提示下载文件。

当图像文件保存到本地计算机时,它已损坏,保存也需要很长时间,这让我认为浏览器无法看到从 apache 发送的内容长度标头。此外,当我查看保存的图像文件时,它包含来自 apache 的标头,以及顶部的一些垃圾,如下所示:

vi 徽标.png:

^@^UÅd^@$^]V^S^H^@E^@^Q,n!@^@@^F^@^@À¨^@6À¨^@^D^@P^Y¬rÇŹéw^P^@Ú^@^@^A^A^H
^@^GÝ^]^@pbSHTTP/1.1 200 OK^M
日期:2011 年 3 月 9 日星期三 04:47:04 GMT^M
服务器:Apache/2.2.14 (Ubuntu)^M
最后修改时间:2010 年 10 月 5 日星期二 11:59:17 GMT^M
ETag:“17b6ff-157c-491dd63eb2f40”^M
接受范围:字节^M
内容长度:5500^M
保持活动:超时=15,最大=94^M
连接:保持活动^M
内容类型:image/png^M
^M
巴布亚新几内亚^M
ETC...

有什么想法吗?这让​​我抓狂。

apache 错误日志中没有任何内容,并且权限正常(因为图像数据在那里,只是有点损坏)。

这个 ubuntu 盒子上也没有代理或 iptables。

非常感谢!!

戴夫

附言:刚刚在另一台计算机上尝试使用 IE,同样的问题 :( pps:重新启动服务器,没有帮助。


更新:

感谢这些 wget 想法:

这是来自远程机器的 wget 的输出(它无法读取标题)

dbaker@fatburt:~$ wget http://foo/static/images2/nav_sprite.jpg
--2011-03-10 17:41:06-- http://foo/static/images2/nav_sprite.jpg
正在解析 foo...192.168.0.54
连接到 foo|192.168.0.54|:80...已连接。
HTTP 请求已发送,正在等待响应...200 无标头,假设为 HTTP/0.9
长度:未指定
保存至:'nav_sprite.jpg'

这是从本地服务器返回 wget 的输出(运行良好)

wget http://foo/static/images2/nav_sprite.jpg
--2011-03-10 17:44:51-- http://foo/static/images2/nav_sprite.jpg
正在解析 foo...192.168.0.54
连接到 foo|192.168.0.54|:80...已连接。
HTTP 请求已发送,正在等待响应...200 OK
长度:79192(77K)[图像/jpeg]
保存至:'nav_sprite.jpg'

更新:

感谢@uesp 将“EnableMMAP off”添加到 /etc/apache2/httpd.conf 并重新启动 apache 解决了这个问题,不知道为什么,但确实如此。

干杯!

答案1

您可以尝试以下几件事:

  • 尝试EnableSendfile off在 Apache 配置中设置并重新启动(参见Apache 核心文档)。也可以尝试EnableMMAP off(参见这里与您的问题非常相似)。
  • 使用浏览器测试时,请确保清除缓存和/或强制重新加载图像。
  • 测试各种文件大小和类型。是只有 PNG 文件,还是所有图像等等?缩小范围,确定哪些图像大小可行,哪些不可行,最终可能会有所帮助。
  • 尝试测试另一个 Web 服务器(lighttpd、nginx 等),看看它们是否表现出相同的行为。这应该会告诉您问题是 Apache 特有的还是服务器/网络本身的问题。
  • 远程和本地下载文件,看看响应是否不同。

答案2

此问题与浏览器无关,无论您使用哪种浏览器,都会遇到此问题。文件已损坏,因为它未完全下载。您可以通过 scp 或 ftp 传输下载来验证这一点(您应该这样做以验证它实际上没有损坏)。

尝试对特定文件执行 wget。这样您就可以直接专注于下载文件,而不必处理可能出现的任何 php 或 html 问题。

 wget http://your.website.com/path/to/image.png

另外,尝试使用 gif 和 jpg 文件进行此操作,以便您可以确定它可能不仅仅是 png 和升级的问题。

另外需要查看的是跟踪日志:

 # tail -f /path/to/apache/logs

这样,当您尝试访问图像时,您可以打开第二个终端并实时观察结果。

如果您没有取得任何进展(或者希望您将问题追溯到 apache 而不是图像),请卸载然后重新安装 apache。

相关内容