刚刚将旧机器升级到 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。