Mas*_*rry 2 linux php apache-2.2
我运行一个图像托管网站。我的服务器可以在高峰时段每秒处理 8 个请求到每秒 20 个请求。我目前正在当前硬件上运行服务器:
处理器 AMD Hexa-Core Speed 6 Cores 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 不太了解。我也愿意学习。感谢您提供任何信息。
小智 5
您可以在这里做很多事情。一方面,您提到您使用 readfile() 提供图像?这可能是这里的罪魁祸首,因为它是提供图像的 PHP。这本质上并不比为它们提供静态服务慢得多,并且确实带来了多种好处(如动态图像处理),但因此您可能会遇到许多陷阱。从服务器的角度来看,将图像作为静态提供总是要快得多。
首先,您的脚本(返回图像的脚本)是否推出了正确的标题?也就是说,您是否发送 Cache-control 和 Expires 标头来告诉用户代理缓存图像?您的流量可能来自这样一个事实,即您的图片要么一直提供,要么过于频繁。还发送一个 Last-modified 标头。
如果用户代理请求文件并且您知道自用户代理提供的日期以来它没有被修改,您也可以发送一个 Not-modified 标头作为响应。
如果您已经设置了所有正确的标头并确保用户代理没有无用地请求他们已经拥有的数据,那么您的问题出在您的网络服务器上。您是否进行了任何性能测试,以查看这是否仅影响图像,还是一般会影响所有请求?
我建议尝试查看您的服务器在处理常规 (PHP) 请求时有多强大。查看您的页面本身需要多长时间,并将其与图像请求进行比较。为此,我建议使用一个很好的工具,例如Pylot(它是命令行,但非常有用)。
(请注意,为了进行比较,将 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');
Run Code Online (Sandbox Code Playgroud)
提供未修改的标头有点复杂:
// 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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
864 次 |
| 最近记录: |