我经营一家图片托管网站。在高峰时段,我的服务器每秒可处理 8 到 20 个请求。我目前在当前硬件上运行服务器:
处理器 AMD 六核 速度 6 核 x 2.8 GHz(3.3 Turbo Core) RAM 16 GB DDR3 ECC 硬盘空间 1,000 GB(2 x 1,000 SATA) RAID 软件 RAID 1
完整规格http://www.1and1.com/ServerPremiumXL?__lf=Static&linkOrigin=ServerPremium&linkId=ct.btn.package.xl我订购了XL6服务器。
我不会静态提供图像,因为它们存储在服务器上的其他地方。每次调用 readfile() 时都会动态加载它们。服务器最近一直很不稳定,我想知道如何优化服务器以便能够轻松处理这种流量。
我安装了 eaccelerator,它似乎有用,但帮助不够。我还安装了 X-SendFile,它似乎也有帮助,但由于 Apache 的问题,我不得不暂时将其删除,尽管我想尝试将其重新打开。
我来这里主要是寻求建议,以便我能够改进我的服务器,使其能够轻松处理每秒 50 个请求(除非这完全不合理)。我自己是一名开发人员,对 linux/apache 了解不多,尽管我知道基础知识。我也愿意学习。感谢您提供的任何信息。
答案1
您可以在这里做很多事情。首先,您提到使用 readfile() 提供图像?这可能是罪魁祸首,因为提供图像的是 PHP。这本质上并不比静态提供图像慢很多,而且确实具有多种好处(例如动态图像处理),但您可能会因此遇到许多陷阱。从服务器的角度来看,以静态方式提供图像总是要快得多。
首先,您的脚本(返回图片的脚本)是否发出了正确的标头?也就是说,您是否发出了 Cache-control 和 Expires 标头来告诉用户代理缓存图片?您的流量可能来自于您的图片一直被提供或过于频繁地被提供。还发送了 Last-modified 标头。
如果用户代理请求文件并且您知道自用户代理提供的日期以来该文件尚未被修改,您还可以发送“未修改”标头作为响应。
如果您已经设置了所有正确的标头并确保用户代理不会无用地请求它们已有的数据,则问题出在您的 Web 服务器上。您是否进行过任何性能测试以查看这是否仅影响图像或是否会影响所有请求?
我建议尝试看看你的服务器在处理常规(PHP)请求时有多强大。看看你的页面本身需要多长时间,并将其与图像请求进行比较。我建议使用一个好的工具,例如皮洛特为此(它是命令行,但确实很有用)。
(请注意,为了进行比较,将 X 尺寸的页面与 X 尺寸的图像进行比较很有用,以便带宽相等,并且您可以对性能进行评级)。
编辑:
缓存标头告知发出请求的用户代理尽可能长时间缓存文件,如下所示:
$lastModified=filemtime($myPicture); // File location of your image
$cacheDuration=31536000; // One year
// This tells user agent to keep the cache for one year
header('Cache-Control: public,max-age='.$cacheDuration);
header('Expires: '.gmdate('D, d M Y H:i:s',(time()+$cacheDuration)).' GMT');
// This tells the user agent the last modified time of your image
header('Last-Modified: '.gmdate('D, d M Y H:i:s',$lastModified).' GMT');
提供未修改的标头稍微复杂一些:
// Testing if the servers known last modified time is different from the last modified time of file on your server
// If those times are the same, then we will not return the image and just tell the user agent to use their cache
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])>=$lastModified){
// Cache headers (Last modified is never sent with 304 header, since it is often ignored)
header('Cache-Control: public,max-age='.$cacheDuration);
header('Expires: '.gmdate('D, d M Y H:i:s',(time()+$cacheDuration)).' GMT');
// Returning 304 header
header('HTTP/1.1 304 Not Modified');
die();
}
答案2
我的问题是,您真的想在输出时通过 PHP 路由它们吗?考虑到每个页面可能查看多个图像,这需要进行大量的乘法处理。因此 PHP 成为瓶颈,而且它是一种脚本语言。
可能事先将缩略图预处理为站点所需的特定大小,然后存储这些副本。占用额外的空间,但如果图像可以直接链接到文件而不是通过 PHP 提供,我想你会得到更快的速度。
答案3
这可能既是一个问题,又是一个答案,所以也许有经验的人可以对此发表意见。在这种情况下,RAM 磁盘会有什么好处吗?我不知道您托管了多少张图片,但如果您将最常访问的图片(RAM 磁盘中可容纳的图片数量显然有限)放入 RAM 磁盘中,会怎么样?然后,每当您或用户添加或编辑照片时,您都会对磁盘上的永久副本以及存储在 RAM 中的副本进行更改。面对如此多的请求,您会认为删除“从磁盘读取”步骤将有助于加快速度。