我运行一个图像托pipe网站。 在高峰时段,我的服务器可以从8个请求到每秒20个请求。 我目前在当前的硬件上运行一个服务器:
处理器AMD六核心速度6核x 2.8 GHz(3.3睿频内存)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()dynamic加载每次调用。 服务器最近一直在殴打,我想知道如何优化服务器能够轻松处理这种stream量。
我已经安装了eaccelerator这似乎是帮助,但没有足够的帮助。 我也在一个地方安装了X-SendFile,这似乎也有帮助,但是由于Apache的问题,我不得不暂时删除它,尽pipe我想重新尝试。
我基本上在这里征求意见,所以我可以欺骗我的服务器,轻松地处理每秒50个请求(除非这完全是不合理的)。 我自己是一个开发人员,不知道太多关于Linux / Apache,但我知道的基本知识。 我也很愿意学习。 感谢您的任何信息。
在这里你可以做很多事情。 首先,你提到你用readfile()来提供图像吗? 这可能是一个罪魁祸首,因为它是服务于图像的PHP。 这并不是固有的,比静态服务要慢很多,并且有很多好处(比如dynamicimage processing),但是你可能会有一些陷阱。 从服务器的angular度来看,将图片作为静态图片总是要快得多。
首先,您的脚本是否会返回图片 – 推出正确的标题? 也就是说,你是否发出caching控制和过期头,告诉用户代理caching图像? 您的stream量可能来自您的图片始终提供或过于频繁的事实。 还发送最后修改的标题。
如果用户代理发出文件请求,并且知道自用户代理提供date以来没有修改过,则还可以发送未修改的头作为响应。
如果你已经设置了所有正确的标题,并确保用户代理不是无用地请求他们已经有的数据,那么你的问题是在你的Web服务器。 你有没有做过任何性能testing,看看这是否只影响图像,或者如果它影响所有请求一般?
我build议尝试查看服务器在提供常规(PHP)请求时function如何。 查看您的网页本身需要多长时间,并将其与图像请求进行比较。 我build议一个好的工具,如Pylot这(这是命令行,但真正有用)。
(请注意,为了进行比较,将X大小的页面与X大小的图像进行比较是非常有用的,因为带宽相同,您可以对性能进行评分)。
编辑:
告诉用户代理发出请求caching文件的caching标头尽可能长,如下所示:
$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 MYH:i:s',(time()+$cacheDuration)).' GMT'); // This tells the user agent the last modified time of your image header('Last-Modified: '.gmdate('D, d MYH: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 MYH:i:s',(time()+$cacheDuration)).' GMT'); // Returning 304 header header('HTTP/1.1 304 Not Modified'); die(); }
我的问题是,你真的想通过PHP输出路由他们吗? 考虑到每个页面可能会查看多个图像,这是一个非常多的倍增处理。 所以PHP成为瓶颈,这是一种脚本语言。
可能预先将缩略图预处理为特定站点所需的大小,并存储这些副本。 占用额外的空间,但是如果图像可以直接链接到一个文件,而不是通过PHP提供的话,你会得到更多的速度。
这可能是一个问题,因为它是一个答案,所以也许有经验的人可以衡量这一点。 RAM磁盘在这种情况下会有什么好处? 我不知道您托pipe了多less图片,但是如果将最常访问的图片(有多less可以放入内存盘的明显限制)放到内存盘中,该怎么办? 然后,无论何时您或用户添加或编辑照片,您都将更改为磁盘上的永久副本以及存储在RAM中的副本。 有了这么多的请求,你会认为切出“从磁盘读取”的步骤将有助于加快速度。