我想知道在LAMP堆栈上构建典型站点时如何优化它以获得最佳加载时间.我正在描绘一个典型的数据库驱动的网站.
这是一个高级别的外观,可能会引起问题,让我将其分解为堆栈的每一层.
L - 在系统级别,(设置和文件系统)可以提高速度吗?我能想到的一件事是图像尺寸,这里的压缩可以帮助优化任何东西吗?
答 - Web服务器中必须有大量与站点速度相关的设置.不是我的Forte.可能很大程度上取决于并发运行的站点数量.
M - MySQL在数据库驱动的站点中,DB性能是关键.是否有更好的规范化方法,即使用链接表?Web开发人员通常只生成类似1NF的简单单片表,这可能会破坏性能.
P - 除了缓存等性能提升设置之外,程序员可以做些什么来影响高级别的性能?我真的很想知道MVC设计方法是否比快速和肮脏更能达到性能.其他简单的提示比像饼干更快的会话会很有趣.
显然,你必须深入了解细节并找出哪些代码会降低你的速度.此外,我意识到许多站点具有许多不同的性能特征,但让我们假设一个典型的站点有更多的读取然后写入.
我只是想知道我们是否可以编译一堆最佳实践并完全希望人们链接其他问题,以便我们可以有效地处理清单.
我的目标是看看即使除了性能中的常见问题之外,我们还可以看到一些你可能没想到的奇怪的事情,以及最佳实践摘要.
所以我的问题是,如果你是从头开始,你将如何确保你的LAMP网站快速?
这是我在LAMP应用程序中总是设置的一些个人必备品.
为apache安装mod_deflate,不要使用PHP的gzip处理程序.mod_deflate将允许您压缩静态内容,如javascript/css/static html,以及通常的动态PHP输出,这是您在代码中不必担心的一件事.
小心.htaccess文件!为应用程序中的目录启用.htaccess文件意味着Apache必须不断扫描文件系统,寻找.htaccess指令.将指令放在主配置或vhost配置中更好,它们被加载一次.无论何时通过将目录级访问文件移动到主配置文件中都可以将其删除,您可以节省磁盘访问时间.
准备应用程序的数据库层以使用某种连接管理器(我在大多数应用程序中使用Singleton).这不是很难,减少应用程序打开的数据库连接数可以节省资源.
如果您认为您的应用程序会看到很大的负载,那么memcached可以创造奇迹.在编写代码时要记住这一点......也许有一天,而不是动态创建对象,你将从memcached中获取它们.有点先见之明会使实施无痛.
一旦您的应用程序启动并运行,请将MySQL的慢查询时间设置为较小的数字,并勤勉地监视慢查询日志.这将显示您的问题查询的来源,并允许您在查询和索引成为问题之前对其进行优化.
对于严肃的性能调整器,您将需要从源代码编译PHP.从软件包安装会安装许多您可能永远不会使用的库.由于PHP环境被加载到Apache线程的每个实例中,因此当存在50个Apache线程时,即使额外库的5MB内存开销也会迅速变为250MB的丢失内存.我保留了我在这里构建PHP时使用的标准./configure行的列表,我发现它适合我的大多数应用程序.缺点是如果你最终需要一个库,你必须重新编译PHP才能获得它.分析您的代码并在开发环境中对其进行测试,以确保您拥有所需的一切.
缩小您的Javascript.
准备将静态内容(如图像和视频)移动到非动态Web服务器.编写代码,以便将来可以轻松配置图像和视频的任何URL以指向其他服务器.针对静态内容优化的Web服务器可以比动态内容服务器轻松地提供数十甚至数百倍的速度.
这就是我能想到的最重要的事情.谷歌搜索PHP最佳实践将找到很多关于如何编写更快/更好的代码的技巧(例如:echo
比速度更快print
).
首先,要意识到性能是一个迭代过程.您不会一次性构建Web应用程序,启动它,也不会再次使用它.相反,您从小开始,并在网站增长时解决性能问题.
现在,详细说明:
轮廓.找出你的瓶颈.这是最重要的一步.您需要将精力集中在能够获得最佳效果的地方.您应该有适当的监控解决方案(如cacti或munin),让您可以了解服务器上发生的情况
缓存,缓存,缓存.您可能会发现数据库访问是后端最大的瓶颈 - 但您应该自行验证.幸运的是,您可能会发现很多流量都用于一小部分资源.您可以将这些资源缓存在memcached之类的内容中,从而节省数据库命中率,从而提高后端性能.
正如上面提到的那样,请看一下YDN性能规则.考虑拿起随书.这将帮助您获得前端性能
安装PHP APC,并确保它配置了足够的内存来保存所有已编译的PHP字节码.我们最近发现我们的APC安装没有足够的内存; 给它足够的工作把我们的CPU时间缩短一半,磁盘活动减少10%
确保您的数据库表已正确编入索引.这与监视慢查询日志密切相关.
以上内容会让你走得很远.也就是说,如果你已经完成了上述工作,即使是一个相当数据库的网站也应该能够在单个规范的服务器上进行首页搜索.
您最终将达到默认apache配置无法始终跟上传入请求的程度.当你碰到这堵墙时,有两件事要做:
如上所述,简介.监控您的apache活动 - 您应该知道在任何给定时间有多少个连接处于活动状态,此外还有突发的突发流量时活动连接的最大数量
请记住配置apache.这是我见过的apache配置的最佳指南:实用mod_perl第11章
尽可能多地减轻apache的负担.Apache非常重要,可以高效地提供静态内容.您应该使用轻量级反向代理(如squid)或Web服务器(lighttpd或nginx)来提供静态内容,并接管勺子提供字节以减缓客户端的工作.这使Apache能够做到最好:执行代码.同样,mod_perl书很好地解释了这一点.
一旦你到目前为止,这主要是一个缓存更多的问题,并密切关注你的数据库.最终,你将超过一台服务器.首先,您可能会添加更多前端盒,所有前端盒都由单个数据库服务器支持.然后你将不得不开始传播你的数据库负载,可能是通过分片.有关此增长过程的精彩概述,请参阅此livejournal演示文稿
要更深入地了解上述大部分内容,请查看Flickr成名的Cal Henderson 建立可扩展网站.谷歌的部分内容可供预览